برای انجام این آزمایش و نمایش تعداد شمارشهای دتکتور گازی تناسبی روی نمایشگر LCD 2×16 با استفاده از میکروکنترلر ATmega8، میتوان از وقفه خارجی (INT0) برای شمارش پالسهای خروجی دتکتور استفاده کرد. در ادامه، مراحل کار، قطعات مورد نیاز و کد برنامه ارائه شده است.
برنامهای که قبلاً نوشتم تقریباً آماده است، اما قبل از پروگرام کردن روی میکروکنترلر باید چند مورد را بررسی کنیم:
بررسی کتابخانه LCD:
lcd.h
به درستی در پروژه شما قرار دارد.lcd.h
استفاده میکنید، اطمینان حاصل کنید که فایل lcd.c
هم در پروژه اضافه شده باشد.پیکربندی وقفهها:
اتصالات سختافزاری:
پیکربندی کریستال:
_delay_ms()
بر اساس فرکانس تنظیم شود.بررسی مقدار count
روی LCD:
...
وقتی در برنامه از توابع تأخیر مانند delay_ms()
یا delay_us()
استفاده میکنید، کامپایلر CodeVision باید بداند میکروکنترلر با چه فرکانسی کار میکند تا بتواند زمانهای تأخیر را دقیق تنظیم کند.
....
external_interrupt0
یک وقفه خارجی (external interrupt) است که در میکروکنترلرهای خانواده AVR، از جمله ATmega8، برای شبیهسازی یک وقفه بهوسیله یک تغییر در ورودی (مثل تغییر سطح ولتاژ) استفاده میشود. در ATmega8، این وقفه معمولاً به پایه PD2 (پایه INT0) متصل است.
میکروکنترلر ATmega8 دارای 3 وقفه خارجی است:
در کد قبلی که نوشتم، EXT_INT0
یک وقفه خارجی است که برای پایه INT0 (PD2) استفاده شده است. این وقفه باعث میشود که هر زمانی که ورودی PD2 (پایه INT0) تغییر کند، یک تابع خاص (که در اینجا به نام external_interrupt0
تعریف شده) فراخوانی شود.
در کد زیر، وقتی یک پالس از دتکتور گازی به پایه INT0 (پایه PD2) وارد میشود، این وقفه فعال شده و تعداد پالسها در متغیر count
ذخیره میشود:
interrupt [EXT_INT0] void external_interrupt0(void) {
count++; // افزایش شمارش با هر پالس ورودی
}
external_interrupt0
فراخوانی میشود.count
افزایش مییابد.در برنامه، برای فعالسازی وقفه INT0 از این کد استفاده شده است:
MCUCR |= (1 << ISC01); // فعال کردن وقفه بر روی تغییرات پایین به بالا در INT0
GICR |= (1 << INT0); // فعال کردن وقفه INT0
MCUCR |= (1 << ISC01);
این خط وقفه را برای تغییرات پایین به بالا (از LOW به HIGH) روی پایه INT0 فعال میکند.GICR |= (1 << INT0);
این خط وقفه INT0 را فعال میکند تا زمانی که ورودی پایه INT0 تغییر کند، وقفه به اجرا درآید.
وقتی که یک پالس از دتکتور به پایه INT0 (PD2) میکروکنترلر وارد میشود، وقفه فعال شده و شمارش پالسها افزایش مییابد.