الکترونیک هسته ای

این وبلاگ در زمینه الکترونیک هسته ای فعالیت دارد

الکترونیک هسته ای

این وبلاگ در زمینه الکترونیک هسته ای فعالیت دارد

اتصال یک دتکتور برای شمارش

برای انجام این آزمایش و نمایش تعداد شمارش‌های دتکتور گازی تناسبی روی نمایشگر LCD 2×16 با استفاده از میکروکنترلر ATmega8، می‌توان از وقفه خارجی (INT0) برای شمارش پالس‌های خروجی دتکتور استفاده کرد. در ادامه، مراحل کار، قطعات مورد نیاز و کد برنامه ارائه شده است.



برنامه‌ای که قبلاً نوشتم تقریباً آماده است، اما قبل از پروگرام کردن روی میکروکنترلر باید چند مورد را بررسی کنیم:


✅ بررسی‌های قبل از پروگرام کردن:

  1. بررسی کتابخانه LCD:

    • اگر از کتابخانه استاندارد CodeVisionAVR برای LCD استفاده نمی‌کنید، باید مطمئن شوید که lcd.h به درستی در پروژه شما قرار دارد.
    • اگر از lcd.h استفاده می‌کنید، اطمینان حاصل کنید که فایل lcd.c هم در پروژه اضافه شده باشد.
  2. پیکربندی وقفه‌ها:

    • در برنامه، از وقفه INT0 برای شمارش پالس‌های دتکتور استفاده شده است.
    • بررسی کنید که پایه PD2 (INT0) به درستی به خروجی دتکتور وصل شده باشد.
    • در تنظیمات فیوزبیت‌ها، وقفه‌های خارجی فعال باشند.
  3. اتصالات سخت‌افزاری:

    • دتکتور → ورودی INT0 (PD2)
    • LCD → پورت‌های مناسب (مثلاً: RS → PD6، EN → PD7، D4-D7 → PB4-PB7)
    • تغذیه مدار (۵ ولت مناسب)
    • دکمه ریست (اگر لازم باشد برای شمارش مجدد)
  4. پیکربندی کریستال:

    • اگر از کریستال خارجی (مثلاً 8MHz یا 16MHz) استفاده می‌کنید، فیوزبیت‌های میکرو را متناسب تنظیم کنید.
    • در ابتدای برنامه، مقدار تأخیر _delay_ms() بر اساس فرکانس تنظیم شود.
  5. بررسی مقدار count روی LCD:

    • مقدار شمارش باید هر 500 میلی‌ثانیه روی LCD به‌روز شود.
    • اگر مقدار نمایش داده نمی‌شود، بررسی کنید که LCD درست مقدار را می‌خواند.


...

وقتی در برنامه از توابع تأخیر مانند delay_ms() یا delay_us() استفاده می‌کنید، کامپایلر CodeVision باید بداند میکروکنترلر با چه فرکانسی کار می‌کند تا بتواند زمان‌های تأخیر را دقیق تنظیم کند.


....

external_interrupt0 یک وقفه خارجی (external interrupt) است که در میکروکنترلرهای خانواده AVR، از جمله ATmega8، برای شبیه‌سازی یک وقفه به‌وسیله یک تغییر در ورودی (مثل تغییر سطح ولتاژ) استفاده می‌شود. در ATmega8، این وقفه معمولاً به پایه PD2 (پایه INT0) متصل است.

توضیحات:

میکروکنترلر ATmega8 دارای 3 وقفه خارجی است:

  1. INT0 (پایه PD2)
  2. INT1 (پایه PD3)
  3. INT2 (پایه PB2)

در کد قبلی که نوشتم، EXT_INT0 یک وقفه خارجی است که برای پایه INT0 (PD2) استفاده شده است. این وقفه باعث می‌شود که هر زمانی که ورودی PD2 (پایه INT0) تغییر کند، یک تابع خاص (که در اینجا به نام external_interrupt0 تعریف شده) فراخوانی شود.

توضیحات دقیق‌تر در کد:

در کد زیر، وقتی یک پالس از دتکتور گازی به پایه INT0 (پایه PD2) وارد می‌شود، این وقفه فعال شده و تعداد پالس‌ها در متغیر count ذخیره می‌شود:

interrupt [EXT_INT0] void external_interrupt0(void) {
    count++;  // افزایش شمارش با هر پالس ورودی
}

مراحل عملکرد:

  1. وقتی یک تغییر در ورودی پایه PD2 (INT0) رخ می‌دهد، این وقفه فعال می‌شود.
  2. در نتیجه، تابع external_interrupt0 فراخوانی می‌شود.
  3. در داخل این تابع، شمارش پالس‌ها در متغیر count افزایش می‌یابد.

تنظیمات وقفه INT0:

در برنامه، برای فعال‌سازی وقفه INT0 از این کد استفاده شده است:

MCUCR |= (1 << ISC01);   // فعال کردن وقفه بر روی تغییرات پایین به بالا در INT0
GICR |= (1 << INT0);     // فعال کردن وقفه INT0
  • MCUCR |= (1 << ISC01); این خط وقفه را برای تغییرات پایین به بالا (از LOW به HIGH) روی پایه INT0 فعال می‌کند.
  • GICR |= (1 << INT0); این خط وقفه INT0 را فعال می‌کند تا زمانی که ورودی پایه INT0 تغییر کند، وقفه به اجرا درآید.

در نتیجه:

وقتی که یک پالس از دتکتور به پایه INT0 (PD2) میکروکنترلر وارد می‌شود، وقفه فعال شده و شمارش پالس‌ها افزایش می‌یابد.


نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد