اطلاعیه

Collapse
No announcement yet.

وقفه rx برای پورت سریال

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    وقفه rx برای پورت سریال

    سلام
    من از arduino uno r3 استفاده میکنم
    میخام هر زمان که پورت سریال یک کاراکتر دریافت کرد ، کاراکتر دریافتی رو پردازش کنم .
    به کد زیر توجه کنید . این پروژه در کدویژن نوشته شده با میکروی atmega88 . یک LED به پایه PD2 وصل شده . اگر از طریق پورت سریال کاراکتر 1 دریافت شود ، LED روشن خواهد شد و اگر کاراکتر 0 دریافت شود ، LED خاموش میشود.
    کد:
    #include <mega88pa.h>
    //------------------------------------------------------------------------------------
    #define  FRAMING_ERROR         0x10
    #define  PARITY_ERROR          0x04
    #define  DATA_OVERRUN          0x08
    #define  turn_led_off          PORTD &= 0xFB
    #define  turn_led_on           PORTD |= 0x04
    //------------------------------------------------------------------------------------
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
        uint8_t status,data;
        status=UCSR0A;
        data=UDR0;
        if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
        {
            if ( data == '1' )
                turn_led_on ;
            if ( data == '0' )
                turn_led_off ;
        }
    }
    //------------------------------------------------------------------------------------
    void main(void)
    {
        DDRD=0x06;
        UCSR0B=0x98;
        UCSR0C=0x86;
        UBRR0L=0x05;
        turn_led_off ;
        #asm("sei")
        while ( 1 )
        {
        }
    }​
    ولی نوشتن همچین کدی در arduino غیر ممکن است . چون در arduino وقفه سریال در اختیار خود هسته arduino است و اگر کاراکتری دریافت شود توسط خود arduino پردازش خواهد شد و به یک بافر منتقل خواهد شد و توسط تابع Serial.available و Serial.read در دسترس برنامه نویس قرار میگیرد . ( چقدر مزخرفه )
    آیا راهی هست که بشه مثل codevision در arduino خود برنامه نویس کنترل وقفه سریال رو در اختیار بگیره ؟؟؟؟؟؟
    فروم ها رو بررسی کردم . این مشکل برای خیلی ها پیش اومده بود . ولی راه حلی نداشت . در فروم خود arduino هم وقتی یک نفر سوالی میپرسه ، یه عده به اصطلاح کارشناس میان و به جای جواب دادن ، فلسفه بافی میکنن.

    #2
    شاید جواب رو پیدا کرده باشم :
    1. در محیط arduino یک sketch جدید باز کنید
    2. از منوها : Tools->Board->Arduino Uno را انتخاب کنید
    3. از منوها Files->Examples->SPI->BarometricPressureSensor را انتخاب کنید
    4. از منوها Sketch->Show Sketch Folder را انتخاب کنید. یک پنجره جدید باز میشود
    5. فولدرها را لایه به لایه به سمت بالا حرکت کنید تا به یک فولدر برسید که فایل boards.txt در آن باشد
    6. در این فولدر ، یک فولدر است به نام cores
    7. در فولدر cores یک فولدر است به نام arduino
    8. در فولدر arduino یک فایل است به نام HardwareSerial_private.h
    9. در این فایل یک تابع است به نام void HardwareSerial::_rx_complete_irq(void)
    10. این همان تابع رسیدگی به وقفه rx برای پورت سریال میباشد . کد خود را در این تابع بنویسید .
    11. چند نکته است که باید رعایت شود : اول : قبل از ویرایش تابع ، از آن یک backup باید گرفت . چون هر تغییری که در این تابع بدهیم ، در تمام محیط arduino وتمام پروژه های دیگر اعمال خواهد شد . وقتی به سراغ یک پروژه دیگر میرویم ، باید این تابع را به حالت اولیه برگردانیم. دوم : اگر داخل این تابع میخاهیم از متغیر های خاص پروژه خودمان استفاده کنیم ، باید قبل از تعریف تابع ، به صورت extern آن متغیرها را تعریف کنیم و در پروژه خود هم آن متغیر را به صورت global تعریف کرده باشیم .

    دیدگاه


      #3
      جوابی که در بالا دادم مربوط به ورژن های قدیمی arduino است . در ورژن های جدید مسیر فایل ها کلا متفاوت است . در کامپیوتر من که فایل HardwareSerial_private.h در مسیر زیر بود :

      C:\Users\Administrator\AppData\Local\Arduino15\pac kages\arduino\hardware\avr\1.8.6\cores\arduino

      دیدگاه

      لطفا صبر کنید...
      X