دسته‌بندی نشده

آموزش 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 نمایش داده می‌شود.


۱۰. تمرین‌ها

  1. برنامه‌ای بنویسید که با هر بار فشار کلید، LED روشن و خاموش شود.
  2. یک شمارنده بسازید که تعداد فشار کلید را بشمارد و روی LCD نمایش دهد.
  3. برنامه‌ای بنویسید که با وقفه تایمر هر ۱ ثانیه یک بار LED چشمک بزند.

نتیجه جلسه هفتم

در این جلسه یاد گرفتیم:

  • مفهوم وقفه و کاربرد آن.
  • نحوه فعال‌سازی وقفه‌ها در BASCOM.
  • وقفه تایمر و وقفه خارجی.
  • پروژه عملی شمارنده با کلید.

🔹 جلسه هشتم: کار با PWM و کنترل موتور/دیمر LED.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *