اطلاعیه

Collapse
No announcement yet.

مشکل در وقفه ارتباط سریال

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

    مشکل در وقفه ارتباط سریال

    سلام،

    تو پروژه ای که تو کدویژن درست کردم برای جلوگیری از ایجاد مکث در حلقه ی اصلی while به خاطر تابع ()getchar می خوام از وقفه ارنباط سریال استفاده کنم اما برنامه اصلا کار نمیکنه و از خطی که تابع getchar داره رد نمیشه.... ممنون میشم اگه کمک کنید.

    کد:
    #include <mega16.h>
    #include <delay.h>
    
    #define RXB8 1
    #define TXB8 0
    #define UPE 2
    #define OVR 3
    #define FE 4
    #define UDRE 5
    #define RXC 7
    
    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<OVR)
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)
    
    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];
    
    #if RX_BUFFER_SIZE<256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif
    
    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;
    
    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    status=UCSRA;
    data=UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
      {
      rx_buffer[rx_wr_index]=data;
      if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
      if (++rx_counter == RX_BUFFER_SIZE)
       {
       rx_counter=0;
       rx_buffer_overflow=1;
       };
      };
    }
    
    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index];
    if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #asm("cli")
    --rx_counter;
    #asm("sei")
    return data;
    }
    #pragma used-
    #endif
    
    // Standard Input/Output functions
    #include <stdio.h>
    
    // Declare your global variables here
    
    void main(void)
    {
    // Declare your local variables here
    unsigned char n;
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 9600
    UCSRA=0x00;
    UCSRB=0x98;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x33;
    
    
    // LCD module initialization
    lcd_init(16);
    
    // Global enable interrupts
    #asm("sei")
    
    while (1)
       {
         n=getchar()-48;
             putsf("line passed");
    
       };
    }

    #2
    پاسخ : مشکل در وقفه ارتباط سریال

    دوست عزیز شما هرجا getchar بزارین برنامه منتظر دریافت میمونه! حالا شما توی while 1 امودین اونا گذاشتین ! در صورتی که وقفه را هم فعال کردین ! یعنی اول توی while 1 پشت getchar منتظر میمونه به محض اینکه یه بایت دریافت شد میره تو اینتراپت و بعد دوباره میاد تو while 1!
    یعنی شما هیچ وقت نمی ذارین خط putsf("line passed" توی while 1 اجرا بشه oo:
    چیزی را بگو که بتوانی بنویسی
    چیزی را بنویس که بتوانی امضا کنی
    چیزی را امضا کن که بتوانی به آن عمل کنی (ناپلئون)

    دیدگاه


      #3
      پاسخ : مشکل در وقفه ارتباط سریال

      با تشکر از جوابتون ولی با عوض کردن برنامه و حذف getchar() باز هم به مشکل خوردم. انگار که برنامه هیچ وقت وارد اینتراپت نمیشه. برنامه زیر به این صورت هست که بعد از وارد شدن به اینتراپت ، متغیر n یک میشه و به واسطه ی اون در حلقه while اصلی برنامه باید رشته ی "n=1" دائما ارسال بشه ولی این اتفاق نمیفته. در ضمن رشته hi رو برای تست اطمینان از رسیدن داده به کامپیوتر قرار دادم که موقع شروع برنامه به کامپیوتر ارسال میشه وکار میکنه.
      کد:
      #include <mega16.h>
      #include <delay.h>
      #include <stdio.h>
      
      unsigned char n=0;
      
      #define RXB8 1
      #define TXB8 0
      #define UPE 2
      #define OVR 3
      #define FE 4
      #define UDRE 5
      #define RXC 7
      
      #define FRAMING_ERROR (1<<FE)
      #define PARITY_ERROR (1<<UPE)
      #define DATA_OVERRUN (1<<OVR)
      #define DATA_REGISTER_EMPTY (1<<UDRE)
      #define RX_COMPLETE (1<<RXC)
      
      // USART Receiver buffer
      #define RX_BUFFER_SIZE 8
      char rx_buffer[RX_BUFFER_SIZE];
      
      #if RX_BUFFER_SIZE<256
      unsigned char rx_wr_index,rx_rd_index,rx_counter;
      #else
      unsigned int rx_wr_index,rx_rd_index,rx_counter;
      #endif
      
      // This flag is set on USART Receiver buffer overflow
      bit rx_buffer_overflow;
      
      // USART Receiver interrupt service routine
      interrupt [USART_RXC] void usart_rx_isr(void)
      {
      char status,data;
      status=UCSRA;
      data=UDR;
        n=1;
      if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
        {
      
        rx_buffer[rx_wr_index]=data;
        if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
        if (++rx_counter == RX_BUFFER_SIZE)
         {
         rx_counter=0;
         rx_buffer_overflow=1;
         };
        };
      }
      
      #ifndef _DEBUG_TERMINAL_IO_
      // Get a character from the USART Receiver buffer
      #define _ALTERNATE_GETCHAR_
      #pragma used+
      char getchar(void)
      {
      char data;
      while (rx_counter==0);
      data=rx_buffer[rx_rd_index];
      if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
      #asm("cli")
      --rx_counter;
      #asm("sei")
      return data;
      }
      #pragma used-
      #endif
      
      void main(void)
      {
      
      // USART initialization
      // Communication Parameters: 8 Data, 1 Stop, No Parity
      // USART Receiver: On
      // USART Transmitter: On
      // USART Mode: Asynchronous
      // USART Baud Rate: 9600
      UCSRA=0x00;
      UCSRB=0x98;
      UCSRC=0x86;
      UBRRH=0x00;
      UBRRL=0x33;
      
      
      // Global enable interrupts
      #asm("sei")
      
      putsf("hi");
      
      while (1)
         {
      
         if(n==1){putsf("n=1");}
      
         };
      }

      دیدگاه


        #4
        پاسخ : مشکل در وقفه ارتباط سریال

        همون کار ارسال hi را تو جاهای مختلف بذارین ببینیند برنامه دقیقا کجا گیر میکنه
        چیزی را بگو که بتوانی بنویسی
        چیزی را بنویس که بتوانی امضا کنی
        چیزی را امضا کن که بتوانی به آن عمل کنی (ناپلئون)

        دیدگاه


          #5
          پاسخ : مشکل در وقفه ارتباط سریال

          سلام من یک برنامه با روند کلی برای ارتباط سریال با وقفه سریال می گذارم نگاه کنید شاید مشکلتان حل شد
          کد:
          #include <mega8.h>
          #include <stdio.h>
          #include <delay.h>             
          // USART Receiver interrupt service routine
          interrupt [USART_RXC] void usart_rx_isr(void)
          {
          char Receive;
          Receive=UDR;
          //your program
           
          }
          void main(void)
          {
          PORTB=0x00;
          DDRB=0xFF;
          PORTC=0x00;
          DDRC=0x00;
          PORTD=0x00;
          DDRD=0xC0;
          // USART initialization
          UCSRA=0x00;
          UCSRB=0x98;
          UCSRC=0x86;
          UBRRH=0x00;
          UBRRL=0x33;
          // Global enable interrupts
          #asm("sei")
          
          while (1)
             {
              //your program  
             };
          }
          معجزه این است که هرچه داشته هایت را بیشتر با دیگران سهیم شوی،داراتر می شوی (لئونارد نیموی)
          اگر مغزانسان،چنان ساده می بود که ما از آن سر در می آوردیم،هنوز چنان احمق بودیم که هیچ از آن سر در نمی آوردیم!
          آموزش Modelsim

          دیدگاه


            #6
            پاسخ : مشکل در وقفه ارتباط سریال

            خوشبختانه مشکل حل شد...
            ورژن جدید کدویژن 2.05.3رو نصب کردم و برنامه کار کرد ولی به نظرم یه جایی توی تنظیمات نوع آی سی اشتباه کرده بودم و نمیشه تقصیر رو گردن ورژن قدیمی کدویژن انداخت.
            نتیجه اینکه کد های بالا مشکل ندارن و اگه قراره از اینتراپت ارتباط سریال استفاده کنید میشه از کد های بالا استفاده کرد. با تشکر از پاسخ دوستان

            دیدگاه

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