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

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

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

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

شیفت رجیستر

برای اتصال دتکتورها به پورت C میکروکنترلر ATmega8، از یک یا چند شیفت رجیستر 74HC165 (که قابلیت تبدیل چند ورودی به یک سیگنال سریال را دارد) یا از یک روش Multiplexing می‌توان استفاده کرد. در اینجا نحوه اتصال پورت C به دتکتورها با شیفت رجیستر 74HC165 را شرح می‌دهم:

فرضیات:

  1. میکروکنترلر ATmega8 دارای پورت‌های I/O دیجیتال است که می‌توانیم از آن‌ها برای دریافت سیگنال‌های دیجیتال از دتکتورها استفاده کنیم.
  2. دتکتورها به گونه‌ای طراحی شده‌اند که خروجی دیجیتال دارند (مثلاً LOW یا HIGH بر اساس وجود یا عدم وجود آلودگی).
  3. برای مدیریت بیشتر از ۸ ورودی با توجه به محدودیت پین‌ها، از شیفت رجیسترها استفاده می‌کنیم.

نحوه اتصال دتکتورها به پورت C با استفاده از شیفت رجیستر 74HC165:

مرحله 1: اتصال دتکتورها به شیفت رجیستر

  • شیفت رجیستر 74HC165 دارای ۸ ورودی است.

  • هر دتکتور را می‌توان به یکی از ورودی‌های شیفت رجیستر متصل کرد.

  • در این صورت، هر شیفت رجیستر قادر خواهد بود ۸ ورودی (برای ۸ دتکتور) را دریافت کند.

  • برای ۱۲ دتکتور، به دو عدد شیفت رجیستر نیاز داریم.

    • ۸ دتکتور اول به ورودی‌های شیفت رجیستر اول متصل می‌شود.
    • ۴ دتکتور باقی‌مانده به ورودی‌های شیفت رجیستر دوم متصل می‌شود.

مرحله 2: اتصال شیفت رجیسترها به میکروکنترلر

  • هر شیفت رجیستر نیاز به ۳ سیگنال از میکروکنترلر دارد:

    • Data (D): سیگنال داده که وضعیت ورودی‌ها را به شیفت رجیستر ارسال می‌کند.
    • Clock (C): سیگنال ساعت که به شیفت رجیستر می‌گوید که باید داده‌ها را شبیه‌سازی کرده و به میکرو ارسال کند.
    • Latch (L): سیگنال لچ که به شیفت رجیستر اعلام می‌کند که باید داده‌ها را به میکرو منتقل کند.
  • در اینجا، شیفت رجیسترها به پورت‌های Data (PD0)، Clock (PD1) و Latch (PD2) از میکروکنترلر متصل می‌شوند.

    • در این حالت از پورت D میکرو استفاده خواهیم کرد.

مرحله 3: اتصال پورت C میکرو به دتکتورها از طریق شیفت رجیستر

  • شیفت رجیستر 74HC165 ۸ ورودی دارد. به این صورت که میکرو به کمک سیگنال‌های ساعت و داده، وضعیت هر ورودی را به‌صورت سریال از شیفت رجیستر دریافت می‌کند.
  • داده‌ها به صورت سریال از طریق پورت‌های D0 تا D7 میکرو دریافت می‌شود.
  • پس از دریافت سیگنال‌ها از هر دتکتور (که وضعیت آن‌ها می‌تواند نشان‌دهنده آلودگی یا عدم آلودگی باشد)، میکرو آن‌ها را پردازش می‌کند.

مثال اتصال پین‌ها:

  • پورت C میکرو (C0 تا C7):
    • پایه‌های C0 تا C3 به شیفت رجیستر اول متصل می‌شود که ۴ دتکتور اول را بررسی می‌کند.
    • پایه‌های C4 تا C7 به شیفت رجیستر دوم متصل می‌شود که ۴ دتکتور بعدی را بررسی می‌کند.

مرحله 4: کد مربوط به خواندن داده‌ها از شیفت رجیستر

در برنامه کد زیر برای خواندن وضعیت دتکتورها از شیفت رجیسترها می‌تواند استفاده شود:

#define DATA_PIN  PD0  // سیگنال داده
#define CLOCK_PIN PD1  // سیگنال ساعت
#define LATCH_PIN PD2  // سیگنال لچ

// خواندن داده‌ها از شیفت رجیستر
uint8_t readShiftRegister() {
    uint8_t value = 0;
    for (uint8_t i = 0; i < 8; i++) {
        // راه‌اندازی سیگنال ساعت
        PORTD &= ~(1 << CLOCK_PIN);  // صفر کردن ساعت
        if (PIND & (1 << DATA_PIN)) {  // خواندن داده از ورودی
            value |= (1 << i);  // قرار دادن داده در بیت مناسب
        }
        PORTD |= (1 << CLOCK_PIN);  // بالابردن ساعت
    }
    return value;
}

void main() {
    // تنظیم پورت‌ها به عنوان ورودی و خروجی
    DDRD = 0x00;  // پورت D به عنوان ورودی (برای داده از شیفت رجیستر)
    DDRC = 0xFF;  // پورت C به عنوان خروجی
    while (1) {
        uint8_t detector_status = readShiftRegister();
        // پردازش وضعیت دتکتورها
        // به ازای هر دتکتور وضعیت را بررسی کنید و در صورت آلودگی، پردازش‌های لازم را انجام دهید
    }
}

جمع‌بندی:

  • دتکتورها به شیفت رجیسترهای 74HC165 متصل می‌شوند که هر شیفت رجیستر می‌تواند ۸ ورودی را مدیریت کند.
  • میکروکنترلر ATmega8 از طریق پورت‌های خاصی (مانند پورت D) سیگنال‌ها را به شیفت رجیسترها ارسال کرده و وضعیت هر دتکتور را از طریق سیگنال‌های داده و ساعت خوانده و پردازش می‌کند.
  • با این روش می‌توان ۱۲ دتکتور را به‌طور همزمان بررسی کرد، حتی اگر تعداد پین‌های میکروکنترلر کمتر از تعداد دتکتورها باشد.

آیا این توضیحات کمکتون کرد؟


در اینجا برنامه کامل و اصلاح‌شده برای میکروکنترلر ATmega8 با استفاده از دو شیفت رجیستر 74HC165 برای اتصال ۱۲ دتکتور را می‌نویسم. برنامه به گونه‌ای طراحی شده است که دتکتورها به پورت‌های میکرو متصل می‌شوند و وضعیت آلودگی هر دتکتور بر اساس شمارش‌ها نمایش داده می‌شود.

برنامه کامل در CodeVision C

#include <mega8.h>
#include <delay.h>
#include <lcd.h>  // فرض بر این است که کتابخانه LCD در دسترس است

// پین‌های شیفت رجیستر
#define DATA_PIN   PD0   // سیگنال داده
#define CLOCK_PIN  PD1   // سیگنال ساعت
#define LATCH_PIN  PD2   // سیگنال لچ

// پین‌های متصل به موتور نوار نقاله و دکمه‌ها
#define CONVEYOR_PIN    PC0  // پین کنترل نوار نقاله
#define START_BUTTON    PC1  // پین دکمه شروع
#define INFO_BUTTON     PC2  // پین دکمه اطلاع از آلودگی

// متغیرهای وضعیت
uint8_t detector_status = 0;  // وضعیت دتکتورها
uint8_t contaminated = 0;     // وضعیت آلودگی لباس
uint8_t detector_number = 0;  // شماره دتکتور آلوده

// خواندن داده‌ها از شیفت رجیستر
uint8_t readShiftRegister() {
    uint8_t value = 0;
    uint8_t i;
    for (i = 0; i < 8; i++) {
        PORTD &= ~(1 << CLOCK_PIN);  // صفر کردن ساعت
        if (PIND & (1 << DATA_PIN)) {  // خواندن داده از ورودی
            value |= (1 << i);  // قرار دادن داده در بیت مناسب
        }
        PORTD |= (1 << CLOCK_PIN);  // بالا بردن ساعت
    }
    return value;
}

void init() {
    // تنظیم پورت‌ها به عنوان ورودی و خروجی
    DDRD = 0x00;  // پورت D به عنوان ورودی (برای داده از شیفت رجیستر)
    DDRC = 0xFF;  // پورت C به عنوان خروجی
    PORTC = 0x00; // خاموش کردن تمام پین‌های پورت C
    DDRB = 0xFF;  // پورت B به عنوان خروجی (LCD)

    // تنظیم پایه‌های شیفت رجیستر
    PORTD &= ~(1 << LATCH_PIN); // صفر کردن سیگنال لچ
}

void showInProgress() {
    lcd_clear();
    lcd_gotoxy(0, 0);
    lcd_puts("IN PROGRESS");
}

void showContaminate(uint8_t detector, uint8_t cps) {
    lcd_clear();
    lcd_gotoxy(0, 0);
    lcd_puts("CONTAMINATE");
    delay_ms(1000);  // نمایش برای 1 ثانیه
    lcd_clear();
    lcd_gotoxy(0, 0);
    lcd_puts("Detector: ");
    lcd_putc(detector + '0');  // شماره دتکتور
    lcd_gotoxy(0, 1);
    lcd_puts("CPS: ");
    lcd_putc(cps + '0');  // میزان شمارش
    delay_ms(1000);  // نمایش برای 1 ثانیه
}

void conveyorStop() {
    PORTC &= ~(1 << CONVEYOR_PIN);  // توقف نوار نقاله
}

void conveyorStart() {
    PORTC |= (1 << CONVEYOR_PIN);  // شروع حرکت نوار نقاله
}

void checkDetectors() {
    uint8_t i;
    detector_status = readShiftRegister();  // خواندن وضعیت دتکتورها از شیفت رجیستر

    for (i = 0; i < 12; i++) {
        if (detector_status & (1 << i)) {
            contaminated = 1;
            detector_number = i + 1;
            showContaminate(detector_number, detector_status);  // نمایش پیغام آلودگی
            conveyorStop();
            break;
        }
    }

    if (!contaminated) {
        lcd_clear();
        lcd_gotoxy(0, 0);
        lcd_puts("No Contaminate");
        delay_ms(1000);
    }
}

void main(void) {
    init();
    lcd_init(LCD_DISP_ON);  // راه‌اندازی نمایشگر LCD

    showInProgress();  // نمایش پیغام در حال انجام

    while (1) {
        if (PINC & (1 << START_BUTTON)) {  // بررسی وضعیت دکمه شروع
            checkDetectors();  // بررسی وضعیت دتکتورها
        }

        if (PINC & (1 << INFO_BUTTON)) {  // بررسی وضعیت دکمه اطلاع از آلودگی
            if (contaminated) {
                showContaminate(detector_number, detector_status);  // نمایش آلودگی
            } else {
                lcd_clear();
                lcd_gotoxy(0, 0);
                lcd_puts("No Contaminate");
                delay_ms(1000);
            }
            contaminated = 0;  // وضعیت آلودگی را صفر می‌کنیم
            conveyorStart();  // نوار نقاله را شروع می‌کنیم
            showInProgress();  // پیغام در حال انجام را نمایش می‌دهیم
        }
    }
}

توضیحات کد:

  1. تعریف پین‌ها:

    • DATA_PIN, CLOCK_PIN, LATCH_PIN: این پین‌ها برای ارتباط با شیفت رجیستر 74HC165 استفاده می‌شوند.
    • CONVEYOR_PIN: پین کنترل نوار نقاله است.
    • START_BUTTON و INFO_BUTTON: دکمه‌های ورودی برای شروع اندازه‌گیری و اطلاع از آلودگی هستند.
  2. تابع readShiftRegister:

    • این تابع وضعیت دتکتورها را از شیفت رجیستر 74HC165 می‌خواند.
    • داده‌های سریال را از شیفت رجیستر می‌گیرد و آن‌ها را به صورت یک عدد ۸ بیتی در متغیر value ذخیره می‌کند.
  3. تابع showInProgress:

    • وقتی که سیستم در حال بررسی لباس‌ها است، پیام "IN PROGRESS" روی صفحه نمایش داده می‌شود.
  4. تابع showContaminate:

    • وقتی که لباس آلوده است، ابتدا پیام "CONTAMINATE" نمایش داده می‌شود.
    • پس از 1 ثانیه، شماره دتکتور آلوده و میزان آلودگی آن (که در اینجا از cps به‌عنوان نمونه استفاده شده) نمایش داده می‌شود.
  5. تابع checkDetectors:

    • این تابع وضعیت هر ۱۲ دتکتور را بررسی می‌کند. اگر دتکتوری آلوده باشد، پیام آلودگی نمایش داده می‌شود و نوار نقاله متوقف می‌شود.
    • اگر لباس آلوده نباشد، پیغام "No Contaminate" نمایش داده می‌شود.
  6. کنترل نوار نقاله:

    • وقتی لباس آلوده است، نوار نقاله متوقف می‌شود (conveyorStop).
    • پس از اطلاع به اپراتور، با فشردن دکمه اطلاع از آلودگی، نوار نقاله دوباره به حرکت درمی‌آید (conveyorStart).

نحوه اتصال سخت‌افزار:

  • پورت C: برای کنترل نوار نقاله و دکمه‌های ورودی.
  • پورت D: برای ارتباط با شیفت رجیستر 74HC165 و خواندن وضعیت دتکتورها.

نکته:

  • این کد بر اساس فرض استفاده از شیفت رجیسترهای 74HC165 طراحی شده است که به شما اجازه می‌دهد تا تعداد ورودی‌های بیشتری را مدیریت کنید. اگر شیفت رجیسترها به درستی متصل شوند، وضعیت دتکتورها به‌طور دقیق خوانده خواهد شد.

اگر سوال دیگری دارید یا نیاز به توضیحات بیشتری دارید، خوشحال می‌شوم کمک کنم.

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