PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : بسکام + تایمر + اینتراپت !!!



farzadsw
01-10-2010, 00:24
با سلام
من بعد یه برنامه با بسکام نوشتم ، تا بعد از سرریزشدن تایمر و وقفه اون ، یه زیرروال رو اجرا کنه:


$regfile = "m32def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency
$baud = 9600 ' use baud rate
$hwstack = 128 ' default use 32 for the hardware stack
$swstack = 128 ' default use 10 for the SW stack
$framesize = 128 ' default use 40 for the frame space


Mcusr = &H80
Mcusr = &H80


Dim Tflagb As Integer
.
.
.
Dim Ref2 As Byte


Config Timer1 = Timer , Prescale = 1024
Stop Timer1
Enable Interrupts
Enable Timer1
Enable Ovf1
Timer1 = 35000
On Timer1 Timer5

Start Timer1
Print "timer started"
Do

If T2 > 90 Then
Reset Rb
Rbi = 0
Tflagb = 0
End If

If 1 = Key1 Then
Gosub Mode3
End If
Print "loop"
Wait 1


Loop
End

'***********************************************
.
.
.
'***********************************************
Timer5:
Print "timer int"
Timer1 = 35000
.
.
.


Return
Return


ولی هر وقت تایمر سرریز میشه ؛ به جای پریدن به isr (یعنی Timer5 ) میکرو ریست میشه !و هیچ وقت به زیرروال نمیرسه ! سه روزه رفته رو اعصابم ، روی یه کامپیوتر دیگه هم امتحان کردم ، همینه :unh::baad:

حتی مثال خود بسکام هم همینطوری ریست میشه!!!! کلا مشکل از اینتراپتهاست ، و من فکر میکنم آدرس isr رو نمیتونه بگیره ،اینطوری میشه .

کسی راه حلی نداره ؟

MEYSAMHL
01-10-2010, 11:16
سلام دوست گرامی
برنامه ی شما یه مشکل کوچیک داره ....
در خطی که شما نوشته بودید on timer1 timer 5 این دستور معمولا عمل نمی کنه یعنی میکرو بعد از سرازیر شدن می خواد بره به label سرازیری تایمر ولی شما اون label یا isr رو با دستور اشتباه تعریف کردید برای همین میکرو ریت می کنه .
راه حل :
باید از این دستور استفاده کنید .... ردخور نداره

on OVF1 TIMER5

این دستور 100 در 100 جواب میده ... کافیه به جای دستور on timer1 timer 5 از دستور on OVF1 TIMER5

موفق باشی

farzadsw
01-10-2010, 20:56
از ovf1 هم استفاده کرده بودم ، کلا 3 روز رو مشغول یه کاری بودم دیگه ! تمام حالتهای ممکن رو امتحان کردم : از ovf1 هم برای فعال سازی وقفه و هم لیبل استفاده کردم ، timer1 تایمر 1 هم همینطور ، به صورت ضربدری (یکی این یکی اون) همچنین و تو آخرین حالت مثل همین کدی که گذاشتم ، هردو دستور
Enable Timer1
Enable Ovf1
رو با هم استفاده کردم.
ترتیب فعال شدن وقفه سراسری و وقفه تایمر رو هم تغییر دادم ، یه بار لیبل رو قبل از فعال کردن وقفه ها تعریف کردم ، یه بار بعدش، اسم لیبل رو هم تغییر داده بودم شاید مشکل از این باشه ولی نبود . خلاصه نزدیک به 20 حالت مختلف رو امتحان کردم ولی فرقی نکرد.

فکر میکنم اینم باز از اون باگهای زیبای بسکام باشه . جالبی باگهاش هم اینه که به صورت رندم اتفاق میوفته ! یعنی برای یکی اصلا اتفاق نمیوفته ولی برای یکی دیگه میوفته!
مثلا باگ بسیار مسخره glcd های k108 که خودم قبلا 2-3 روزی سر کار بودم ، وقتی میکرو میرسه به خط کانفیگ lcd ، میکرو هنگ میکنه ! تواینترنت گشتم ، یکی دیگه میگفت با مگا 8 lcd درست کار میکرده ؛ ولی وقتی برنامه روبرای مگا32 تغییر داده ، هنگ میکرده ! یه سری دیگه هم اصلا مشکلی نداشتن و میگفتن حتما سیمات شله (آخه شل بودن سیم چه ربطی به هنگ کردن میکرو داره !؟!). خلاصه کاشف به عمل اومد یه کتابخونه تو اینترنت برای lcd گرافیکی بسکام هست (احتمالا نسخه قدیمی) که اگه جایگزین ارجینالش کنی درست میشه !!!!!!!!!!! جالبتر اینه که من از نسخه اررجینال بسکام استفاده میکنم (آخرین ورژن 1.12 !) .

گفتم اینجا مطرح کنم شاید کس دیگه ای هم به این مشکل غیر منطقی بر خورده باشه .

morteza_rk
01-10-2010, 21:12
سلام فرزاد جان

خیلی متاسفم که بسکام انقدر رفته رو اعصابت! من با اینکه از نسخه ی کرکی استفاده می کنم تا حالا بجز همون ks108 به هیچ مشکل دیگه ای بر نخوردم! که اونم باید فایلهایی که توی نت بود جایگزین فایل های خود برنامه می کردم.

الان 10 روزه که من مدام عروسی دعوت میشم. و فقط هم بخاطر خانومم میرم. وگرنه اهل عروسی نیستم.

خودم حتما برنامه رو برات تست می کنم و جوابشو میدم. فقط یکم وقت بده. چون مدرسه ها هم باز شده منم سرم شلوغ شده. انشالله بتونم یه دلیل منطقی براش پیدا کنم و دیر هم نشه. :0013:

morteza_rk
02-10-2010, 13:04
سلام فرزاد جان

دیشب آخرین عروسی رو هم پشت سر گذاشتیم و من خیالم راحت شد! مردم بس که شا باش و کادو دادم! اینجا عروسی ها یا 3 روزه یا 4 روز! پدر آدم در میاد بخدا.

بگذریم ، من برنامه رو تست کردم و مشکلی هم نداره. برنامه ادیت شده رو بهمراه فایل شبیه سازی شده گذاشتم. ببین اوضاع از چه قراره.


$regfile = "m32def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency

$baud = 9600 ' use baud rate

$hwstack = 128 ' default use 32 for the hardware stack
$swstack = 128 ' default use 10 for the SW stack
$framesize = 128 ' default use 40 for the frame space
'---------------------------------------
Mcusr = &H80
Mcusr = &H80
'---------------------------------------
Dim Tflagb As Integer
Dim Ref2 As Byte

Enable Interrupts

Config Timer1 = Timer , Prescale = 1024

Enable Ovf1
Stop Timer1

Timer1 = 35000
On Ovf1 Timer5
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Start Timer1

Print "timer started"

Do

'(
If T2 > 90 Then
Reset Rb
Rbi = 0
Tflagb = 0
End If


If 1 = Key1 Then
Gosub Mode3
End If
Print "loop"
Wait 1
')

Loop
End

'*********************************************

Timer5:

Stop Timer1
Print "timer int"
Timer1 = 35000
Start Timer1

Return

farzadsw
04-10-2010, 02:21
تا باشه از این مجالس باشه:mrgreen:
ممنون از وقتی که گذاشتی ، از نظر کد ، برنامه شما تقریبا تفاوتی با برنامه من نداشت ، برای همین داشتم شک میکردم که نکنه کامپایلر من تعطیله ! ولی امروز بالاخره فرصت کردم برنامه شما رو روی بورد تست کنم . متاسفانه این هم بعد از ترگ شدن وقفه ریست میشد و هیچ وقت زیرروال وقفه رو اجرا نمیکرد :( حتی مثال خود بسکام رو هم کامپایل کردم همین اوضاع بود :sa:
شاید بسکام با بوت لودری که من استفاده کردم مشکل داره (خیلی بعید هست ) ولی فردا تست میکنم بدون بوتلودر چطور میشه(میکرو رو مستقیم پروگرم کنم). این پروتئوس هم هیچ اعتباری بهش نیست و نمیشه بهش اتکا کرد .
در هر صورت اگه این مشکل کذایی راه حلش پیدا شد ، حتما تو همین تاپیک میگذارم تا یه وقت یه نفردیگه مثل من 1 هفته تمام علاف نشه !:(

هنرفر
04-10-2010, 10:41
ماکه نفهمیدیم این Gosub Mode3 به کجا پرش میکنه؟:unh:

morteza_rk
04-10-2010, 13:15
نکنه مشکل از تنظیم رجیستر Mcusr باشه! آخه شبیه سازی توی پروتئوس ممکنه برای تنظیم بعضی از این رجیسترها و فیوزبیت ها ارزش قائل نشه. یه بارم بدون اونا تست کن.


هنرفر عزیز اون قسمت از برنامه برای جای دیگه ای نوشته شده و فرزاد خان هم یه تیکه از کد خودشو گذاشته نه همه ی کد رو.

farzadsw
04-10-2010, 15:36
اون رجیستر برای غیر فعال کردن جیتگ به صورت نرم افزاری هست . بدون اون هم همینه ؛ همونطوری که گفتم مثال اصلی بسکام هم همین مشکل رو داره .
خب بالاخره مشکل پیدا شد ! :125:بدون بوت لودر درست کار میکنه ! حالا باید ببینم کامپایلر های دیگه مثل codevision , winavr, icc هم همینطورن !؟ آخه معنی نداره که بوت لودر تداخل ایچاد کنه ، فضای برنامه اون تو حافظه یه قسمت جداست ( ته حافظه فلش) .

morteza_rk
04-10-2010, 17:01
قضیه جالب شد. اگه مشکل این باشه باید با کامپایلرهای دیگه هم تست بشه و اگه اونا مشکلی نداشتن این میشه یه باگ برای بسکام که باید به تیم پشتیابنی اون گزارش داده بشه.

farzadsw
04-10-2010, 19:54
من با کدویژن امتحان کردم درست کار میکرد (با بوت لودر) :mrgreen:
خب برای نتیجه گیری میشه اینطور گفت که اگه دارید با بسکام برنامه مینویسید و یهو به یه مشکل غیر عادی بر میخورید ؛اگر طی 24 ساعت مشکل حل شد که چه بهتر ، در غیراین صورت سریعا به فکر استفاده از یه کلمپایلر دیگه بیوفتید : چون در صورت پیدا کردن دلیل مشکل (بعد از چندین روز وقت تلف شدن) باز هم مجبور خواهید شد که کامپایلرتون رو عوض کنید :mrgreen: ! پس چرا از همون اول اینکار رو نکنید ؟!

robert
23-03-2015, 01:38
[QUOTE=morteza_rk;20163]سلام فرزاد جان

دیشب آخرین عروسی رو هم پشت سر گذاشتیم و من خیالم راحت شد! مردم بس که شا باش و کادو دادم! اینجا عروسی ها یا 3 روزه یا 4 روز! پدر آدم در میاد بخدا.

بگذریم ، من برنامه رو تست کردم و مشکلی هم نداره. برنامه ادیت شده رو بهمراه فایل شبیه سازی شده گذاشتم. ببین اوضاع از چه قراره.

[PHP]$regfile = "m32def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency

$baud = 9600 ' use baud rate

$hwstack = 128 ' default use 32 for the hardware stack
$swstack = 128 ' default use 10 for the SW stack
$framesize = 128 ' default use 40 for the frame space
'---------------------------------------
Mcusr = &H80
Mcusr = &H80
'---------------------------------------
Dim Tflagb As Integer
Dim Ref2 As Byte

Enable Interrupts

Config Timer1 = Timer , Prescale = 1024

Enable Ovf1
Stop Timer1

Timer1 = 35000
On Ovf1 Timer5
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Start Timer1

Print "timer started"

Do

'(
If T2 > 90 Then
Reset Rb
Rbi = 0
Tflagb = 0
End If


If 1 = Key1 Then
Gosub Mode3
End If
Print "loop"
Wait 1
')

Loop
End

'*********************************************

Timer5:

Stop Timer1
Print "timer int"
Timer1 = 35000
Start Timer1

Return

با سلام مگه timer1 ده بیتی نیست ؟ چطور timer1=35000 ?!!!!!!! تایمر 1 بعد از 2^10=1024 شمارش سریز میشه

robert
23-03-2015, 01:46
[QUOTE=robert;100357][QUOTE=morteza_rk;20163]سلام فرزاد جان

دیشب آخرین عروسی رو هم پشت سر گذاشتیم و من خیالم راحت شد! مردم بس که شا باش و کادو دادم! اینجا عروسی ها یا 3 روزه یا 4 روز! پدر آدم در میاد بخدا.

بگذریم ، من برنامه رو تست کردم و مشکلی هم نداره. برنامه ادیت شده رو بهمراه فایل شبیه سازی شده گذاشتم. ببین اوضاع از چه قراره.

[PHP]$regfile = "m32def.dat" ' specify the used micro
$crystal = 8000000 ' used crystal frequency

$baud = 9600 ' use baud rate

$hwstack = 128 ' default use 32 for the hardware stack
$swstack = 128 ' default use 10 for the SW stack
$framesize = 128 ' default use 40 for the frame space
'---------------------------------------
Mcusr = &H80
Mcusr = &H80
'---------------------------------------
Dim Tflagb As Integer
Dim Ref2 As Byte

Enable Interrupts

Config Timer1 = Timer , Prescale = 1024

Enable Ovf1
Stop Timer1

Timer1 = 35000
On Ovf1 Timer5
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Start Timer1

Print "timer started"

Do

'(
If T2 > 90 Then
Reset Rb
Rbi = 0
Tflagb = 0
End If


If 1 = Key1 Then
Gosub Mode3
End If
Print "loop"
Wait 1
')

Loop
End

'*********************************************

Timer5:

Stop Timer1
Print "timer int"
Timer1 = 35000
Start Timer1

Return

با سلام مگه timer1 ده بیتی نیست ؟ چطور timer1=35000 شده?!!!!!!! تایمر 1 بعد از 2^10=1024 شمارش سریز میشه یعنی اگر 35000/1023 کنیم برابر 34 میشه یعنی اگه تایمر یک از صفر بشمره و در مقدار نهایی یعنی 1023 سرریز بشه باید 34 بار سریز بشه تا برسه به 35000

javad22
11-07-2017, 19:25
سلام دوستان من یه برنامه خیلی ساده دارم که از wait استفاده کردم ولی وقتی تو پروتئوس شبیه سازیش میکنم تو دستور wait هنگ مکنه و رو همون wait میمونه . ممنون میشم کمکم کنین چن روزه کلافه ام کرده .
اینم برنامه
$regfile = "m16def.dat"
$crystal = 8000000

Config Porta = Output
Config Portb = Output
Config Portc = Output
Do


V1 = 1

Wait 10

V1 = 1 : V6 = 1 : V11 = 1

Wait 35

V1 = 0 : V6 = 0 : V11 = 0
V2 = 1 : V9 = 1

Wait 20

V2 = 0 : V9 = 0
V4 = 1 : V7 = 1

Wait 10

V4 = 0 : V7 = 1
V12 = 1 : V5 = 1
Wait 35
V12 = 0 : V5 = 0 : V7 = 0
V8 = 1 : V3 = 1
Wait 20
V8 = 0 : V3 = 0
V1 = 1 : V10 = 1
Wait 10
V1 = 0 : V10 = 0


Loop
End

daruosh20
03-09-2017, 13:48
سلام دوستان من یه برنامه خیلی ساده دارم که از wait استفاده کردم ولی وقتی تو پروتئوس شبیه سازیش میکنم تو دستور wait هنگ مکنه و رو همون wait میمونه . ممنون میشم کمکم کنین چن روزه کلافه ام کرده .
اینم برنامه
$regfile = "m16def.dat"
$crystal = 8000000

Config Porta = Output
Config Portb = Output
Config Portc = Output
Do


V1 = 1

Wait 10

V1 = 1 : V6 = 1 : V11 = 1

Wait 35

V1 = 0 : V6 = 0 : V11 = 0
V2 = 1 : V9 = 1

Wait 20

V2 = 0 : V9 = 0
V4 = 1 : V7 = 1

Wait 10

V4 = 0 : V7 = 1
V12 = 1 : V5 = 1
Wait 35
V12 = 0 : V5 = 0 : V7 = 0
V8 = 1 : V3 = 1
Wait 20
V8 = 0 : V3 = 0
V1 = 1 : V10 = 1
Wait 10
V1 = 0 : V10 = 0


Loop
End

دوست من مشگل از فرکانس انتخاب شده برای میکرو هست سیستم شما نمیتونه با فرکانس 8 مگاهرتز برنامه رو شبیه سازی کنه من هم به این مشکل خورده بودم.