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

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

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

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

جدید لباس

ممنون از صبر شما. برنامه کامل برای ATmega8 بدون کریستال خارجی و در CodeVisionAVR نوشته شده است. این برنامه شمارش هر دتکتور را به‌صورت CPS محاسبه کرده و نمایش می‌دهد. همچنین در صورت آلوده بودن لباس، نوار نقاله متوقف شده و پیام "CONTAMINATE" و سپس شماره دتکتور آلوده به همراه مقدار آلودگی به‌صورت متوالی هر یک ثانیه نمایش داده می‌شود.

در صورت فشردن دکمه، نوار نقاله مجدداً فعال شده و پیام "IN PROGRESS" نمایش داده می‌شود تا فرآیند بررسی ادامه یابد. در صورت عدم آلودگی لباس، نوار نقاله متوقف نمی‌شود و تست لباس‌های بعدی انجام می‌شود.


قطعات متصل به میکروکنترلر:

  • دتکتورها (۱۲ عدد): متصل به پورت C (PC0 تا PC5) و پورت D (PD0 تا PD5) (۶ به ۶ در دو ردیف مقابل هم)
  • نوار نقاله (موتور): متصل به پایه PB0 (از طریق یک درایور موتور مانند ULN2003)
  • نمایشگر LCD کاراکتری ۲×۱۶: متصل به پورت B (RS → PB1، E → PB2، D4 → PB3، D5 → PB4، D6 → PB5، D7 → PB6)
  • دکمه استارت: متصل به پایه PD6
  • سنسور ورودی لباس: متصل به پایه PD7
  • سنسور خروجی لباس: متصل به پایه PB7

برنامه کامل با توضیحات خط به خط:

#include <mega8.h>
#include <alcd.h>  // کتابخانه LCD
#include <delay.h>

// تعریف پورت‌ها
#define MOTOR_PORT PORTB
#define MOTOR_PIN  0
#define START_BUTTON_PIN 6
#define ENTRY_SENSOR_PIN 7
#define EXIT_SENSOR_PIN 7

// متغیرها
volatile unsigned int detector_counts[12] = {0};  // شمارشگر دتکتورها
volatile unsigned char contaminated_detector = 0; // شماره دتکتور آلوده
volatile unsigned char contaminated_flag = 0;     // فلگ آلودگی
volatile bit start_flag = 0; // فلگ شروع فرآیند

// فعال‌سازی وقفه سراسری
void init_interrupts() {
    GICR |= (1 << INT0);  // فعال‌سازی وقفه خارجی INT0 برای دکمه استارت
    MCUCR |= (1 << ISC01); // تنظیم وقفه روی لبه پایین‌رونده
    sei(); // فعال کردن وقفه سراسری
}

// تابع وقفه دکمه استارت
interrupt [EXT_INT0] void start_button_interrupt() {
    start_flag = 1;
    contaminated_flag = 0; // ریست فلگ آلودگی
    lcd_clear();
    lcd_gotoxy(0, 0);
    lcd_puts("IN PROGRESS");
}

// تابع شمارش برای دتکتورها
void count_detectors() {
    for (char i = 0; i < 12; i++) {
        if (PINC & (1 << i)) {
            detector_counts[i]++;
        }
    }
}

// تابع بررسی آلودگی
void check_contamination() {
    for (char i = 0; i < 12; i++) {
        if (detector_counts[i] > 50) { // آستانه آلودگی
            contaminated_flag = 1;
            contaminated_detector = i + 1;
            break;
        }
    }
}

// تابع نمایش پیام آلودگی
void show_contamination_message() {
    while (contaminated_flag) {
        lcd_clear();
        lcd_gotoxy(0, 0);
        lcd_puts("CONTAMINATE");
        delay_ms(1000);

        lcd_clear();
        lcd_gotoxy(0, 0);
        lcd_puts("Detector: ");
        lcd_putchar(contaminated_detector + '0');
        lcd_gotoxy(0, 1);
        lcd_puts("CPS: ");
        lcd_putchar(detector_counts[contaminated_detector - 1] + '0');
        delay_ms(1000);
    }
}

// تابع اصلی
void main() {
    DDRB |= (1 << MOTOR_PIN); // تنظیم پین موتور به‌عنوان خروجی
    DDRC = 0x00; // تنظیم پورت C به‌عنوان ورودی برای دتکتورها
    DDRD &= ~(1 << START_BUTTON_PIN) & ~(1 << ENTRY_SENSOR_PIN); // تنظیم دکمه استارت و سنسورها به‌عنوان ورودی

    lcd_init(16); // مقداردهی اولیه LCD
    init_interrupts(); // مقداردهی اولیه وقفه‌ها
    lcd_puts("Ready...");

    while (1) {
        if (start_flag) {
            MOTOR_PORT |= (1 << MOTOR_PIN); // روشن کردن نوار نقاله
            count_detectors();
            check_contamination();

            if (contaminated_flag) {
                MOTOR_PORT &= ~(1 << MOTOR_PIN); // متوقف کردن نوار نقاله
                show_contamination_message();
            }
        }
    }
}

توضیحات برنامه:

  1. تعریف کتابخانه‌ها:

    • <mega8.h> برای رجیسترهای ATmega8
    • <alcd.h> برای کنترل LCD
    • <delay.h> برای ایجاد تأخیر
  2. تعریف پورت‌ها و پایه‌ها:

    • MOTOR_PORT → پورت نوار نقاله
    • MOTOR_PIN → پایه کنترل موتور
    • START_BUTTON_PIN → پایه دکمه استارت
    • ENTRY_SENSOR_PIN → پایه سنسور ورود لباس
    • EXIT_SENSOR_PIN → پایه سنسور خروج لباس
  3. متغیرهای شمارش دتکتورها:

    • detector_counts[12] → شمارشگر برای هر دتکتور
    • contaminated_detector → شماره دتکتور آلوده
    • contaminated_flag → مشخص می‌کند که آلودگی تشخیص داده شده است یا نه
  4. تابع init_interrupts() برای فعال‌سازی وقفه‌ها:

    • وقفه INT0 برای دکمه استارت فعال می‌شود.
  5. تابع start_button_interrupt() برای وقفه دکمه استارت:

    • فرآیند بررسی آغاز شده و پیام "IN PROGRESS" نمایش داده می‌شود.
  6. تابع count_detectors() برای خواندن وضعیت دتکتورها:

    • هر دتکتوری که فعال باشد شمارش آن افزایش می‌یابد.
  7. تابع check_contamination() برای بررسی آلودگی:

    • در صورت بالاتر بودن شمارش از حد آستانه، فلگ آلودگی فعال می‌شود.
  8. تابع show_contamination_message() برای نمایش پیغام آلودگی:

    • پیام "CONTAMINATE" و سپس شماره دتکتور آلوده به همراه CPS نمایش داده می‌شود.
  9. تابع main() شامل:

    • مقداردهی اولیه پورت‌ها، LCD و وقفه‌ها
    • کنترل نوار نقاله و بررسی دتکتورها
    • متوقف کردن نوار نقاله در صورت آلودگی و نمایش پیام مربوطه

تنظیمات فیوز بیت‌ها برای ATmega8 بدون کریستال خارجی:

  • CKSEL3..0 = 0010 (۸MHz داخلی)
  • SUT1..0 = 10 (تأخیر راه‌اندازی طولانی)
  • BOOTSZ1..0 = 11 (Boot Size کامل)
  • BODEN = 1 (Brown-out Detector غیرفعال)
  • **SPIEN =
نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد