آموزش BASCOM AVR – بسکام – جلسه هفتم
📘 آموزش BASCOM AVR – بسکام – جلسه هفتم
وقفهها (Interrupts)
۱. مقدمه
تا اینجا یاد گرفتیم چطور با تایمرها کار کنیم. اما در بسیاری از پروژهها لازم است میکروکنترلر بدون اینکه ما مرتباً وضعیت پایهها یا تایمرها را بررسی کنیم، خودش به صورت خودکار واکنش نشان دهد. این قابلیت با وقفهها (Interrupts) فراهم میشود.
وقفه یعنی: وقتی یک رویداد خاص اتفاق افتاد، CPU اجرای برنامه اصلی را متوقف کند و به یک بخش ویژه از برنامه برود، آن را اجرا کند و سپس دوباره به ادامه برنامه برگردد.
۲. انواع وقفهها در AVR
- وقفه تایمر (Timer Overflow): وقتی تایمر پر شود و سرریز کند.
- وقفه خارجی (External Interrupt): وقتی یک پایه خاص تغییر وضعیت دهد (مثلاً کلید فشرده شود).
- وقفه سریال (UART Interrupt): وقتی دادهای دریافت یا ارسال شود.
- وقفه ADC: وقتی تبدیل آنالوگ به دیجیتال تمام شود.
۳. معماری وقفه در AVR
- هر وقفه یک بردار (Vector) دارد؛ یعنی آدرس خاصی در حافظه فلش که CPU به آن پرش میکند.
- در BASCOM نیازی نیست آدرس را دستی بنویسیم؛ کافی است با دستور
Onمشخص کنیم بعد از وقوع وقفه به کدام بخش برنامه برویم.
۴. فعالسازی وقفهها در BASCOM
Enable Interrupts→ فعالسازی وقفههای سراسری.Enable Ovf0→ فعالسازی وقفه سرریز تایمر۰.On Ovf0 Label→ تعیین برچسبی که بعد از وقوع وقفه اجرا شود.
۵. کدنویسی در BASCOM
مثال: وقفه تایمر۰
' پروژه شمارش وقفه تایمر0
$regfile = "m32def.dat"
$crystal = 1000000
Config Timer0 = Timer , Prescale = 1024
Enable Interrupts
Enable Ovf0
On Ovf0 Timer0_ISR
Dim I As Word
Start Timer0
Do
Locate 1 , 1
Lcd "Count=" ; I
Loop
End
Timer0_ISR:
Incr I
Return
۶. توضیح خطبهخط کد
Enable Interrupts→ وقفههای سراسری فعال میشوند.Enable Ovf0→ وقفه سرریز تایمر۰ فعال میشود.On Ovf0 Timer0_ISR→ وقتی تایمر۰ سرریز کند، به بخشTimer0_ISRمیرود.- در بخش
Timer0_ISRیک واحد به متغیر I اضافه میشود. - سپس با
Returnبرنامه به ادامه کار خود برمیگردد.
۷. وقفه خارجی (External Interrupt)
AVR دارای پایههای مخصوص وقفه خارجی است (INT0، INT1، INT2).
میتوانیم تنظیم کنیم که روی لبه بالا رونده یا پایین رونده فعال شوند.
مثال:
Config Int0 = Falling
Enable Interrupts
Enable Int0
On Int0 Key_ISR
Do
' برنامه اصلی
Loop
End
Key_ISR:
Toggle PORTA.0
Return
توضیح: با هر بار فشار کلید روی پایه INT0، LED تغییر وضعیت میدهد.
۸. نکات عملی
- هنگام اجرای وقفه، CPU به طور خودکار وقفههای دیگر را غیرفعال میکند تا تداخل ایجاد نشود.
- زمان اجرای وقفه باید کوتاه باشد؛ اگر طولانی شود، برنامه اصلی کند میشود.
- برای کارهای سنگین بهتر است فقط یک فلگ در وقفه تنظیم شود و پردازش اصلی در حلقه اصلی انجام شود.
۹. پروژه عملی: شمارنده با کلید
کد:
Dim Count As Byte
Config Int0 = Falling
Enable Interrupts
Enable Int0
On Int0 Inc_ISR
Do
Locate 2 , 1
Lcd "Count=" ; Count
Loop
End
Inc_ISR:
Incr Count
Return
توضیح: هر بار کلید روی پایه INT0 فشار داده شود، شمارنده یک واحد افزایش مییابد و روی LCD نمایش داده میشود.
۱۰. تمرینها
- برنامهای بنویسید که با هر بار فشار کلید، LED روشن و خاموش شود.
- یک شمارنده بسازید که تعداد فشار کلید را بشمارد و روی LCD نمایش دهد.
- برنامهای بنویسید که با وقفه تایمر هر ۱ ثانیه یک بار LED چشمک بزند.
نتیجه جلسه هفتم
در این جلسه یاد گرفتیم:
- مفهوم وقفه و کاربرد آن.
- نحوه فعالسازی وقفهها در BASCOM.
- وقفه تایمر و وقفه خارجی.
- پروژه عملی شمارنده با کلید.
🔹 جلسه هشتم: کار با PWM و کنترل موتور/دیمر LED.