برنامه ي اولي كه ظاهرا درسته .
برنامه ي دومي هم دوبارهه 2 تا END دارهه !!
در مورد ايده ي درست كردن زمان 1 ثانيه با استفاده از كريستال خارجي و تايمر2 بايد بگم ايده ي جالبيه ...
امابنظرم فعلا اگر به صورت نرم افزاري زمان 1 ثانيه رو با كد زني درست كني بهتر باشه ( از نظر يادگيريش ! )
نقل قول: Config Timer0 = Counter , Edge = Rising
Config Int0 = Falling
Config Int1 = Falling
بنظرم بهتره از تايمر 1 براي شمارش استفاده كنيد ، چون بدون اينكه بخواهيد وقفه اش رو راه بندازيد قادر هست تا 65536 تا بشمارهه ... ( براي تعداد دورهايي كه موتور در 1 ثانيه مي زنه مناسبه چون مطمئنن بيش از اين مقدار رو نياز نداريد )
نقل قول: Enable Interrupts
Enable Int0
Enable Int1
خط Enable Interrupt رو بهترهه بعد از تمام كانفيگ هايي كه مربوط به فعال سازي وقفه هاي بخش هاي مختلف هست بذاريد.
نقل قول: Dim B As Byte
On Int0 Left_1
On Int1 Right_1
On Timer0 M
از تايمر 1 براي شمارش استفاده كنيد و وقفه هم فعلا نيازي نيست ، از تايمر 0 ( همراه با وقفه اش ) مي تونيد براي ساختن زمان 1 ثانيه استفاده كنيد.
نقل قول: Do
Locate 2 , 2
Lcd Counter0
Waitms 200
Loop
End
قبل از دستورات LCD معمولا اكثر اوقات از Cls استفاده مي كنيم تا صفحه پاك بشه و از نو نوشته بشه. اينطوري بدون پاك شدن صفحه مقادير روي هم ديگه نوشته مي شه و بخشي كه مقدار رو نشون مي دهه بعد از يه مدتي مقادير عجيب نشون مي دهه كه طبيعي هم هست.
از همينجا كه END برنامه خورد ، حالا از اينجا به بعد بايد Label هاي وقفه و يا سابروتين ها و يا تابع ها رو بنويسيد.
در مورد شما ( label وقفه ها رو بايستي بنويسيد. )
نقل قول: M:
Incr B
Locate 2 , 3
Lcd " tedade dor motor "
Lcd B
Return
بنظرتون اين Label رو درست نوشتيد ؟! ( چون براي شمارش بوده ، طبق توضيحات بالا كه دادم نيازي نيست براي شمارش وقفه بذاريد. ) مي دونيد چه اتفاقي بايد بيفته تا روال وقفه اتفاق بيفته ؟!
ريجستر شمارنده اش ( براي تايمر0 كه يه ريجستر 8 بيتيه ) بايد 256 بار شمارش كنه كه به سبب سرريزي كه در آخرين شمارش بودهه وقفه رخ بده و بعد از اون دوباره از 0 شروع مي كنه به شمارش.
در واقع اينجا شما به ازاء هر 256 تا شمارش ، 1 واحد به شمارش تعداد دورها اضافه مي كنيد !!!!
نكته ي ديگه اينكه LCD كاراكتري 2*16 كه احتمالا شما هم از همون استفاده مي كنيد در هر سطر قادر به نمايش 16 كاراكتر هست ، بشماريد شما چند كاراكتر گذاشتيد ...
از Cls و Locate هم حتما در جاي مناسب استفاده كنيد تا اطلاعات درست نشون داده بشه ...
براي خلاصه تر شدن بجاي عبارت tedade dor motor مي تونيد بنويسيدRPS =
نقل قول: Do
Loop
End
اين DO_Loop و END اينجا چيكار مي كنه ؟!!!
اين عبارت ها رو پاك كنيد. شما قبلا END برنامه رو گذاشتيد. اينها اينجا هيچ معنيي نمي دن ...
نقل قول: Left_1:
Portd.0 = 1
Portd.1 = 0
Locate 1 , 1
Lcd " rast gard "
Return
Right_1:
Portd.0 = 0
Portd.1 = 1
Locate 1 , 1
Lcd " chap gard "
Return
اين ها هم كه احتمالا درست هستن.
فقط بجاي chap gard و rast gard بهتره از ساعتگرد و پاد ساعتگرد استفاده كنيد كه به ترتيب مي شه CW و CCW
برنامه رو اصلاح كنيد و تصميم بگيريد زمان 1 ثانيه رو مي خواهيد با كريستال و تايمر2 بسازيد يا با تايمر2/تايمر0 و وقفه ، به صورت كد ؟؟
مشكلي بود بگيد.
موفق باشيد.