PDA

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



سنجری
08-01-2014, 14:44
سلام. من در برنامه نویسی با بسکام به مشکل برخوردم کسی میتواند مرا راهنمایی کند.چطور می توان از طریق یک پین برنامه ای را متوقف کرد وبا فشار دادن همان پین ورودی کاری کرد که برنامه از همان جای که متوقف شده به کارش ادامه داد .نه اینکه بیاید واز اول کار را شوع کند

morteza_rk
08-01-2014, 21:49
سلام

یکم سخته ، ولی شدنیه.

برای اینکه یه پین هم برنامه رو متوقف کنه و هم ادامه بده باید از یه متغیر کمک استفاده کنید. مثلا متغیر pin_duty از نوع بیت. اول که پین یک میشه این متغیر یک میشه ، حالا چک می کنید که اگه این متغیر یک بود برنامه متوقف بشه ف دفعه ی بعد که اون پین فعال شد این متغیر باید صفر بشه و ...

البته این پین باید یکی از وقفه های میکرو باشه تا در زمانیکه برنامه متوقفه بازم بشه حالت اونو خوند.

اما برای اینکه برنامه از همون جائیکه متوقف شده ادامه پیدا کنه باید هنر برنامه نویسی داشته باشین! + خلاقیت! نوع برنامه ای که می خواید بنویسید خیلی مهمه ، منظورم اینه که دقیقا چه کارائی قراره انجام بده. یکی از ساده ترین روش ها استفاده از یه آرایه هست که در هر قسمت از برنامه عناصرش با مقادیر مختلف پر میشن. بعداز هر بار توقف برای اجرای مجدد از همون قسمت ، اول باید مقادیر موجود در این آرایه چک بشن و بعد تصمیم گرفته بشه که برنامه از کجا باید ادامه پیدا کنه.

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

modj.ir
08-01-2014, 23:45
ساده ترین روشی که به نظرم میرسه این هست که میکروکنترلر روی کریستال خارجی تنظیم بشه و اون کنترل کننده خارجی،یگ رله که پایه های گریستال رو به هم وصل میکنه رو کنترل کنه

سنجری
09-01-2014, 00:53
سلام.من مدتیه توی اینترنت این مشکلم را توی سایتهای مختلف مطرح کردم همه جور راهنمایی کردند.ولی هیچ کدام نتیجه ا ی را که میخواستم به من ندادند. بهترین راه حلی که از اول به نظرم رسید این بود که در هر مرحله از کارهای خواسته شده که توسط فرمان به یک پین صورت میگرفتند.من یک فلگ یا شمارنده یا یه همچین چیزی قرار بدم که اگر برنامه را متوقف کردم برای شروع مجدد با یک شرط به همان نقطه رجوع کند که این خود برنامه زیادی می طلبد.ومن فکر میکردم این بدترین روش برای نوشتن برنامه است .ولی با توجه به جوابهایی که طی این یک ماه گذشته دیدم بهترین جوابی که گرفتم جواب شما آقای رحیمی کرد محله بود که من هم در همان اوایل حدث میزدم. ولی به علت تازه کار بودنم شک داشتم. ولی آیا واقعا این میکروها یک حافظه ای ندارند که این مراحل را برای مدتی در خود نگه دارند که بشه از آن طریق این کار را انجام داد.یا اصولا دستور خاص نمیشه با بسکام نوشت که کار play/pause را انجام دهد. ضمنا جناب رحیمی من اگر موفق به طراحی این برنامه وساخت دستگاه مربوطه ،_که یک نوع تایمر برنامه ریزی شده برای یک وسیله خاص است _بشوم .آیا این قابل ثبت شدن است .؟؟ اختراع است.؟!!! ا بتکار است؟ یا اصلا چیز مهمی نیست!!!
سوال بعدی:چطور بتوان از یک زیر برنامه به برنامه اصلی برگشت که خود برنامه اصلی یک زیر برنامه ای است که با دستورdebounce برای یک پین تعریف شده .(من در پایان زیر برنامه دوم return قرار دادم ولی ارجاع نمیکند

M3R
09-01-2014, 10:52
سلام
این برنامه رو تست کنید فک نکنم مشکلی داشته باشه!
میخواستم برنامه یکم طولانی بشه برای همین یه چشمک زن به صورت زیر نوشتم :0013:

$regfile = "m8def.dat"
$crystal = 1000000
Config Portb = Output
Config Int0 = Falling
Enable Int0
Enable Interrupts
On Int0 Ps

Do
Portb = 0
Portb.0 = 1
Wait 1
Portb.1 = 1
Wait 1
Portb.2 = 1
Wait 1
Portb.3 = 1
Wait 1
Portb.4 = 1
Wait 1
Portb.5 = 1
Wait 1
Portb.6 = 1
Wait 1
Portb.7 = 1
Wait 1
Loop

Ps:
Do
waitms 10
Loop Until Pind.2 = 1
Return

و اگه بتونید از 2 پین استفاده کنید برنامه زیر اصولی تر هست!


$regfile = "m8def.dat"
$crystal = 1000000
Config Portb = Output
Config Portd.0 = Input
Config Int0 = Falling
Enable Int0
Enable Interrupts
On Int0 Ps

Do
Portb = 0
Portb.0 = 1
Wait 1
Portb.1 = 1
Wait 1
Portb.2 = 1
Wait 1
Portb.3 = 1
Wait 1
Portb.4 = 1
Wait 1
Portb.5 = 1
Wait 1
Portb.6 = 1
Wait 1
Portb.7 = 1
Wait 1
Loop

Ps:
Do
Waitms 100
Loop Until Pind.0 = 1
Return

فایل شبیه سازی به همراه برنامه هم پیوست شده ولی تو عمل تست نکردم که فکر نکنم مشکل خاصی داشته باشه و قاعدتا باید جواب بده!


سوال بعدی:چطور بتوان از یک زیر برنامه به برنامه اصلی برگشت که خود برنامه اصلی یک زیر برنامه ای است که با دستورdebounce برای یک پین تعریف شده .(من در پایان زیر برنامه دوم return قرار دادم ولی ارجاع نمیکند

تا اونجایی که من میدونم برنامه قبل از پرش به برچسب آدرس آخرین خطی رو که اجرا کرده در stack یا همون پشته ذخیره میکنه و هر بار که شما return رو بزنید به آخرین خطی که از اونجا پرش شده برمیگرده.حالا چرا واسه شما جواب نمیده نمیدونم !!
موفق باشی :wink:

سنجری
10-01-2014, 20:25
با سلام به شما .آقا مسعود واقعا از شما ممنونم ، حدودا 80% از کاری که می خواستم انجام شد .من با اجازه شما مقداری به برنامه شما اضافه کردم .چون پروتوس من فکر میکنم ورژن آن پایینتره نتونست فایل شما را باز کنه .من مجددا مدار رابازسازی کردم ویک مقاومت 4.7k به پورت INT0 وصل کردم ویک lcdبرای دیدن نتیجه کامل تر .مدار کاملا جواب داد.تا اینجا ممنونم.ولی میخوام همان پورت INT0 کار راه اندازی را انجام بده . در مدارشما راه اندازی خروجی ها با portd.0میباشد وبا portd.2 )int0)عمل مکث یا همان pause انجام میگیرد .ولی آیا میشه کاری کرد که این دو کاررا با همان پورت portd.2 )int0) انجام داد-البته بصورت نرم افزاری،چون فکر میکنم با با کمی تغیر در خود مدار بتوان این کار را انجام داد-

سنجری
10-01-2014, 20:35
در مورد مطلبی که در بالا در مورد زیر برنامه وبازگشت آ ن مدار و شماتیک و برنامه بسکام آن را قرار دادم. در این برنامه ،وقتی برنامه sp به دستور GoTo WS میرسد ، به زیر برنامه Ws رفته وکار برنامه WS به پایان میرسد،ولی با اینکه دستور Return وجود دارد .به سطری که پرش از آنجا صورت گرفته بود بر نمی گردد--یعنی GoTo WS __

$regfile = "m16def.dat"
$crystal = 8000000
Config Porta = Input
Config Portc = Output

Config Portb.7 = Output
Config Portb.6 = Output

Config Portd.0 = Output
Config Portd.1 = Output
Config Portd.2 = Output
Config Portd.4 = Output
Config Portd.5 = Output

Config Pind.6 = Input
Config Pind.7 = Input
Dim M As Integer
Dim D As Integer
Dim Crl As Integer
Dim P As Integer
Dim I As Integer


Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , _
Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 2
Config Debounce = 5

Start1:
P = 1
D = 0
Do
Debounce Pina.0 , 1 , Power1 , Sub
Debounce Pina.1 , 1 , Play.pause , Sub
Debounce Pina.2 , 1 , Sp , Sub
Debounce Pina.3 , 1 , Dct , Sub
Debounce Pina.4 , 1 , Snt , Sub
Debounce Pina.5 , 1 , Cot , Sub
Debounce Pina.6 , 1 , Wl , Sub
Debounce Pina.7 , 1 , Q W , Sub
Loop

End


Power1:
If P = 1 Then
Set Portb.7 'led power is on
P = 0
Cls
Lcd "select program"
Else
Cls
Reset Portc
Reset Portd.0
Reset Pinb.7
P = 1
End If
Return

Play.pause:

If M = 0 Then
D = 1
Else
D = 0
End If
M = 1
Return


Sp:

If P = 0 Then
Cls
Lcd "sp"
Set Portd.0

Crl = 6
Goto Ws

Cls
Lcd "end"
End If
Return


Ws:
Reset Portc
While Crl > 0

Set Portc.2
Waitms 100
Reset Portc.2
Waitms 100
Set Portc.3
Set Portc.2
Waitms 100
Reset Portc.2
Reset Portc.3
Waitms 100
Crl = Crl - 1
Lcd Crl
Wend

Return

M3R
10-01-2014, 21:21
با سلام به شما .آقا مسعود واقعا از شما ممنونم ، حدودا 80% از کاری که می خواستم انجام شد .من با اجازه شما مقداری به برنامه شما اضافه کردم .چون پروتوس من فکر میکنم ورژن آن پایینتره نتونست فایل شما را باز کنه .من مجددا مدار رابازسازی کردم ویک مقاومت 4.7k به پورت INT0 وصل کردم ویک lcdبرای دیدن نتیجه کامل تر .مدار کاملا جواب داد.تا اینجا ممنونم.ولی میخوام همان پورت INT0 کار راه اندازی را انجام بده . در مدارشما راه اندازی خروجی ها با portd.0میباشد وبا portd.2 )int0)عمل مکث یا همان pause انجام میگیرد .ولی آیا میشه کاری کرد که این دو کاررا با همان پورت portd.2 )int0) انجام داد-البته بصورت نرم افزاری،چون فکر میکنم با با کمی تغیر در خود مدار بتوان این کار را انجام داد-

سلام
خوشحالم که تونستم مشکلتون رو کمی حل کنم :0013:
شما اگه از برنامه اول که گذاشتم استفاده کنید از همون یک پین int0 استفاده شده و مقاومت pullup هم حتما باید قرار داده بشه!


در مورد مطلبی که در بالا در مورد زیر برنامه وبازگشت آ ن مدار و شماتیک و برنامه بسکام آن را قرار دادم. در این برنامه ،وقتی برنامه sp به دستور GoTo WS میرسد ، به زیر برنامه Ws رفته وکار برنامه WS به پایان میرسد،ولی با اینکه دستور Return وجود دارد .به سطری که پرش از آنجا صورت گرفته بود بر نمی گردد--یعنی GoTo WS __

$regfile = "m16def.dat"
$crystal = 8000000
Config Porta = Input
Config Portc = Output

Config Portb.7 = Output
Config Portb.6 = Output

Config Portd.0 = Output
Config Portd.1 = Output
Config Portd.2 = Output
Config Portd.4 = Output
Config Portd.5 = Output

Config Pind.6 = Input
Config Pind.7 = Input
Dim M As Integer
Dim D As Integer
Dim Crl As Integer
Dim P As Integer
Dim I As Integer


Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , _
Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5
Config Lcd = 16 * 2
Config Debounce = 5

Start1:
P = 1
D = 0
Do
Debounce Pina.0 , 1 , Power1 , Sub
Debounce Pina.1 , 1 , Play.pause , Sub
Debounce Pina.2 , 1 , Sp , Sub
Debounce Pina.3 , 1 , Dct , Sub
Debounce Pina.4 , 1 , Snt , Sub
Debounce Pina.5 , 1 , Cot , Sub
Debounce Pina.6 , 1 , Wl , Sub
Debounce Pina.7 , 1 , Q W , Sub
Loop

End


Power1:
If P = 1 Then
Set Portb.7 'led power is on
P = 0
Cls
Lcd "select program"
Else
Cls
Reset Portc
Reset Portd.0
Reset Pinb.7
P = 1
End If
Return

Play.pause:

If M = 0 Then
D = 1
Else
D = 0
End If
M = 1
Return


Sp:

If P = 0 Then
Cls
Lcd "sp"
Set Portd.0

Crl = 6
Goto Ws

Cls
Lcd "end"
End If
Return


Ws:
Reset Portc
While Crl > 0

Set Portc.2
Waitms 100
Reset Portc.2
Waitms 100
Set Portc.3
Set Portc.2
Waitms 100
Reset Portc.2
Reset Portc.3
Waitms 100
Crl = Crl - 1
Lcd Crl
Wend

Return

شما هر وقت که بخوایید بعد از پرش به برچسب میکرو با دستور return خط بعد از خطی که پرش از اون انجام شده رو اجرا کنه باید به جای دستور goto از gosub استفاده کنید!
موفق باشی:wink:

سنجری
11-01-2014, 00:28
باسلام.من برنامه ای که برای یک کلید نوشتید را قرار دادم .فقط led اول روشن میشه ودیگر هیچ ...

M3R
11-01-2014, 14:27
سلام
من برنامه ها رو عملی تست نکردم ولی تو پروتئوس که جواب دادن!
یه روش دیگه هم تازه به ذهنم رسید که از وقفه تایمر استفاده کنید.
به اینصورت که تو وقفه تایمر یک پین رو چک میکنید مثلا اگه 1 بود تایمر غیر فعال بشه و برنامه تو یه حلقه بمونه ولی اگر 0 بود برنامه رو ادامه بده!
اگه متوجه نشدید بگید تا یه نمونه قرار بدم

سنجری
11-01-2014, 23:29
سلام
من هم این برنامه هارا با پروتوس 6.9 sp4 امتحان میکنم.(نه بصورت عملی ).ضمنا" من توی بسکام کاملا تازه کارم .قبلا فقط مقداری ++c خوندم وبس.,,ولی توی الگوریتم نوشتن بد نیستم .مشکلم اینه که با دستورات آشنایی ندارم.اگه نمونه بگذارید ممنون میشم

M3R
12-01-2014, 13:54
سلام.
شما بهتره که از جدیدترین ورژن پروتئوس استفاده کنید که مشکلات و باگ خیلی کمتر شده!
در هر صورت من برنامه زیر رو شبیه سازی کردم و جواب گرفتم و تو عمل هم فکر نکنم مشکلی داشته باشه!
فقط یه چیزی سرعت عمل این کلید بستگی به ضریب prescale داره که بهتره خودتون نحوه عملکردش رو مطالعه کنید.
همچنین پیشنهاد میکنم اگه میخواید با بسکام کار کنید ویرایش دوم کتاب 1nafar رو دانلود کنید


$regfile = "m8def.dat"
$crystal = 1000000
Config Portb = Output
Config Portd.0 = Input
Config Timer0 = Timer , Prescale = 64
Enable Interrupts
Enable Timer0
On Timer0 Ps


Do
Portb = 0
Portb.0 = 1
Wait 1
Portb.1 = 1
Wait 1
Portb.2 = 1
Wait 1
Portb.3 = 1
Wait 1
Portb.4 = 1
Wait 1
Portb.5 = 1
Wait 1
Portb.6 = 1
Wait 1
Portb.7 = 1
Wait 1
Loop

Ps:
Do
Stop Timer0
Loop Until Pind.0 = 1
Start Timer0
Return

شماتیک مدار :

You can see links before reply

موفق باشی :0013:

morteza_rk
12-01-2014, 21:32
سلام

برای استفاده از زیر برنامه ها به هیچ وجه استفاده از دستور goto توصیه نمیشه. بلکه باید از دستور gosub یا فراخوانی تابع با استفاده از نام اون استفاده کنید.

شما باید بیشتر برنامه نویسی بدونید تا بتونید به این هدفتون برسید مهندس سنجری. ضمنا حتما ÷روتیوس ورژن 7.9 رو دانلود کنید. 6.9 خیلی خیلی قدیمیه! سال 85 تو بورس بود دادا!

در مورد ثبت اختراع فکر می کنم بشه یه کارائی کرد. ولی باید یه سازمانی داشتن گام اختراع و نوآوری رو برای شدستگاه شما تائید کنه! (چند ساله که اینجوری شده)

سنجری
12-01-2014, 23:50
سلام.
من همین مدار را با پروتوس 7.9 رسم کردم کلی مشکل با اون پیدا کردم.اتفاقا اصل برنامه هم از سی دی انجمن الکترونیک ایران (Energy Corporation of America | Energy Corporation of AmericaEnergy Corporation of America (You can see links before reply)) که با پروگرامرش همراه بود......
اول اینکه برنامه هارا فقط یکبار اجرا میکرد .یعنی با فشار دادن کلید برنامه اجرا میشد وبه پایان میرسید.بار دوم دیگر امکان تکرار نداشت.اتفاقا کتابخانه کاملی هم داره.
پروتوس 8 را دانلود کردم ولی لایسنسش پیدا نشد. اینجا هم شهرستانه نرم افزارش پیدا نمیشه
و .....

M3R
13-01-2014, 00:10
سلام
پروتئوس رو میتونید از لینک زیر دانلود کنید و هیچ مشکلی هم نداره!
You can see links before reply