اطلاعیه

Collapse
No announcement yet.

استفاده از Rx Interrupt در CodeVision

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

    استفاده از Rx Interrupt در CodeVision

    با سلام

    دوستان کسی میتونه راجع به تابع interrupt که برای rx استفاده میشه توضیح بده؟؟ و اینکه چطور باید از اون استفاده کنیم ؟؟

    کد:
    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_BUFFER_SIZE == 256
      // special case for receiver buffer size=256
      if (++rx_counter == 0) rx_buffer_overflow=1;
    #else
      if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
      if (++rx_counter == RX_BUFFER_SIZE)
       {
       rx_counter=0;
       rx_buffer_overflow=1;
       }
    #endif
      }
    }

    در هنگام اومدن دیتا ، اون در تابع data ریخته میشه ؟؟
    به رویاهات فکر کن!!

    #2
    پاسخ : استفاده از Rx Interrupt در CodeVision

    دوستان کسی نظری نداره ؟؟

    میخوام یه سنسور رو راه اندازی کنم ، بعد با میکرو مقدار سنسور رو با پورت سریال بفرستم به یه میکرو دیگه! ولی این عمل ارسال میخوام موقعی انحام بشه که میکرو دیگه درخواستش رو بفرسته! باید برای میکرو slave ( که همونیه که سنسور بهش وصله ) از rx interrupt استفاده کنم دیگه ؟؟میخوام ببینم چطوری؟
    به رویاهات فکر کن!!

    دیدگاه


      #3
      پاسخ : استفاده از Rx Interrupt در CodeVision

      سلام
      در این حالت دیتا در rx_buffer قرار می گیره و اندازه ی بافر هم توسط شما قابل تعیین می باشد. در هر لحظه می تونید از این دیتا استفاده کنید و توصیه می کنم قبل از کار ابتدا با استفاده از یک نمایشگر کاراکتری دیتا رو به صورت اینتراپت دریافت و روی نمایشگر نمایش دهید تا با اصول کارکردش آشنا بشید.
      سوالی هم باشه بنده در حد توان و سوادم در خدمتم
      چرا ناراحتی پاتریک!
      + امروز ی بچه دیدم سرچهارراه گل میفروخت
      - از دیدنش ناراحت شدی؟
      + نه
      پس چی ناراحتت کرده
      + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
      ------------------------------------------------------------------------------------------------------
      تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
      ------------------------------------------------------------------------------------------------------
      محصولات

      دیدگاه


        #4
        پاسخ : پاسخ : استفاده از Rx Interrupt در CodeVision

        نوشته اصلی توسط سوران آراسته
        سلام
        در این حالت دیتا در rx_buffer قرار می گیره و اندازه ی بافر هم توسط شما قابل تعیین می باشد. در هر لحظه می تونید از این دیتا استفاده کنید و توصیه می کنم قبل از کار ابتدا با استفاده از یک نمایشگر کاراکتری دیتا رو به صورت اینتراپت دریافت و روی نمایشگر نمایش دهید تا با اصول کارکردش آشنا بشید.
        سوالی هم باشه بنده در حد توان و سوادم در خدمتم
        خیلو ممنون ازت.. یعنی در گیرنده هر لحظه باید rx_buffer رو چک بکنم؟ یا متغیر data ؟؟
        به رویاهات فکر کن!!

        دیدگاه


          #5
          پاسخ : استفاده از Rx Interrupt در CodeVision

          rx_buffer
          چون همونطور که گفتم این متغیر حاوی دیتای دریافتی از پورت سریال.
          به help کدویژن مراجعه کنی در مورد کل متغیرهاشم توضیح داده.
          چرا ناراحتی پاتریک!
          + امروز ی بچه دیدم سرچهارراه گل میفروخت
          - از دیدنش ناراحت شدی؟
          + نه
          پس چی ناراحتت کرده
          + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
          ------------------------------------------------------------------------------------------------------
          تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
          ------------------------------------------------------------------------------------------------------
          محصولات

          دیدگاه


            #6
            پاسخ : پاسخ : استفاده از Rx Interrupt در CodeVision

            نوشته اصلی توسط سوران آراسته
            rx_buffer
            چون همونطور که گفتم این متغیر حاوی دیتای دریافتی از پورت سریال.
            به help کدویژن مراجعه کنی در مورد کل متغیرهاشم توضیح داده.
            همون طور که گفتی من اومدم تو قسمت گیرنده ، اینتراپتشو فعال کردم و سایزش رو هم روی 8 گذاشتم. کد قسمت گیرنده :
            در این کد اومدم گفتم اگر rx_buffer برابر با مقدار 0xaa (کدی که فرستنده باید بفرسته) بود index رو یک کن، که در صورت یک بودن آن خودش دیتای خونده شده از سنسور رو بفرسته!

            کد:
            #ifndef RXB8
            #define RXB8 1
            #endif
            
            #ifndef TXB8
            #define TXB8 0
            #endif
            
            #ifndef UPE
            #define UPE 2
            #endif
            
            #ifndef DOR
            #define DOR 3
            #endif
            
            #ifndef FE
            #define FE 4
            #endif
            
            #ifndef UDRE
            #define UDRE 5
            #endif
            
            #ifndef RXC
            #define RXC 7
            #endif
            
            #define FRAMING_ERROR (1<<FE)
            #define PARITY_ERROR (1<<UPE)
            #define DATA_OVERRUN (1<<DOR)
            #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_BUFFER_SIZE == 256
              // special case for receiver buffer size=256
              if (++rx_counter == 0)
               {
            #else
              if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
              if (++rx_counter == RX_BUFFER_SIZE)
               {
               rx_counter=0;
            #endif
               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_BUFFER_SIZE != 256
            if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
            #endif
            #asm("cli")
            --rx_counter;
            #asm("sei")
            return data;
            }
            #pragma used-
            #endif
            
            // Read the AD conversion result
            unsigned int read_adc(unsigned char adc_input)
            {
            ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
            // Delay needed for the stabilization of the ADC input voltage
            delay_us(10);
            // Start the AD conversion
            ADCSRA|=0x40;
            // Wait for the AD conversion to complete
            while ((ADCSRA & 0x10)==0);
            ADCSRA|=0x10;
            return ADCW;
            }
            // Declare your global variables here
            char Buffer[10];
            float temp[10],mean;
            bit index=0;
            
            
            void main(void)
            {
            // Declare your local variables here
            
            // Input/Output Ports initialization
            // Port B initialization
            // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
            // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
            PORTB=0x00;
            DDRB=0x00;
            
            // Port C initialization
            // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
            // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
            PORTC=0x00;
            DDRC=0x00;
            
            // Port D initialization
            // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
            // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
            PORTD=0x00;
            DDRD=0x00;
            
            // USART initialization
            // Communication Parameters: 8 Data, 1 Stop, No Parity
            // USART Receiver: On
            // USART Transmitter: On
            // USART Mode: Asynchronous
            // USART Baud Rate: 1200
            UCSRA=0x00;
            UCSRB=0x98;
            UCSRC=0x86;
            UBRRH=0x01;
            UBRRL=0xA0;
            
            
            // ADC initialization
            // ADC Clock frequency: 1000.000 kHz
            // ADC Voltage Reference: Int., cap. on AREF
            ADMUX=ADC_VREF_TYPE & 0xff;
            ADCSRA=0x83;
            
            // Global enable interrupts
            #asm("sei")
            while (1)
               {  
                  if(rx_buffer==0xaa) index=1;
                  else index=0; 
              
               temp[0]=read_adc(5);
                delay_ms(2);
                temp[1]=read_adc(5);
                delay_ms(2);
                temp[2]=read_adc(5);
                delay_ms(2);
                temp[3]=read_adc(5);
                delay_ms(2);
                temp[4]=read_adc(5);
                delay_ms(2);
                temp[5]=read_adc(5);
                delay_ms(2);
                temp[6]=read_adc(5);
                delay_ms(2);
                temp[7]=read_adc(5);
                delay_ms(2);
                temp[8]=read_adc(5);
                delay_ms(2);
                temp[9]=read_adc(5);
                delay_ms(2);
                mean=temp[0]+temp[1]+temp[2]+temp[3]+temp[4]+temp[5]+temp[6]+temp[7]+temp[8]+temp[9];
                mean=mean/40; 
                  if(index)
                  {delay_ms(20);
                  ftoa(mean,1,Buffer);
                  puts(Buffer);
                  index=0; 
                  }
                  
            
                
               }
            }
            اینم قسمت اصلی کد بخش فرستنده: ( این قسمت مشکلی نداشت و با hayperterminal چک کردم دیتا رو درست میفرسته ولی در قسمت گیرنده که کدش رو بالا گذاشتم دریافت نمیشه..
            کد:
            while (1)
               {
                  if(PINA.0==0)
                    {
                    delay_ms(20);
                    itoa(0xaa,a);
                    puts(a);
                    }
                    while(PINA.0==0);
            
               }

            اشتباهم کجاست؟؟ با تشکر :smile:
            به رویاهات فکر کن!!

            دیدگاه


              #7
              پاسخ : استفاده از Rx Interrupt در CodeVision

              موقع ارسال دیتا به صورت رشته و دریافت اون، جهت مقایسه و سایر اعمال باید از کتابخانه string.h استفاده کنید!
              چرا ناراحتی پاتریک!
              + امروز ی بچه دیدم سرچهارراه گل میفروخت
              - از دیدنش ناراحت شدی؟
              + نه
              پس چی ناراحتت کرده
              + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
              ------------------------------------------------------------------------------------------------------
              تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
              ------------------------------------------------------------------------------------------------------
              محصولات

              دیدگاه


                #8
                پاسخ : پاسخ : استفاده از Rx Interrupt در CodeVision

                نوشته اصلی توسط سوران آراسته
                موقع ارسال دیتا به صورت رشته و دریافت اون، جهت مقایسه و سایر اعمال باید از کتابخانه string.h استفاده کنید!
                میتونی یه نمونه از مثال این تابع مقایسه رو بگی ؟؟

                کد:
                signed char strcmp(char *str1, char *str2)
                من میام از این تابع استفاده میکنم ولی به آرگومان های ارور میگیره
                کد:
                char a[10]={0xaa};
                .
                .
                .
                while(1)
                	{
                	  if(!strcmp(a,rx_buffer)) index=1;
                		.
                		.
                		.
                		.
                	}
                مگه آرگومان هاش نباید از نوع رشته باشند ؟
                به رویاهات فکر کن!!

                دیدگاه


                  #9
                  پاسخ : استفاده از Rx Interrupt در CodeVision

                  آرگومان دوم از تابع strcmp() رو به صورت pointer تعریف کردم دیگه ارور نمیگیره! ولی کماکان دیتا به صورت اینتراپت دریافت نمیشه :angry: :angry: :cry2:
                  کد:
                  char *a[]={"0xaa"}
                  
                  while(1)
                  {
                  	if(!strcmp(rx_buffer,a[0]) index=1;
                  	else index=0;
                  	.	
                  	.
                  	.
                  	.
                  	.
                  }
                  .
                  .
                  .
                  آیا از تابع getchar() هم باید استفاده بشه ؟؟ منظور اینکه برای دریافت دیتا به غیر از تابع اینتراپت ، تابع دیگه ای باید استفاده بشه ؟
                  به رویاهات فکر کن!!

                  دیدگاه


                    #10
                    پاسخ : استفاده از Rx Interrupt در CodeVision

                    اولا همیشه یادتون باشه که رشته در بین جفت کتیشن قرار می گیره!

                    اینو امتحان کن :
                    [ltr]unsigned char tag[5]={"0xaa"};

                    if(!strcmp(tag,rx_buffer))[\ltr]
                    چرا ناراحتی پاتریک!
                    + امروز ی بچه دیدم سرچهارراه گل میفروخت
                    - از دیدنش ناراحت شدی؟
                    + نه
                    پس چی ناراحتت کرده
                    + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                    ------------------------------------------------------------------------------------------------------
                    تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                    ------------------------------------------------------------------------------------------------------
                    محصولات

                    دیدگاه


                      #11
                      پاسخ : پاسخ : استفاده از Rx Interrupt در CodeVision

                      نوشته اصلی توسط سوران آراسته
                      اولا همیشه یادتون باشه که رشته در بین جفت کتیشن قرار می گیره!

                      اینو امتحان کن :
                      [ltr]unsigned char tag[5]={"0xaa"};

                      if(!strcmp(tag,rx_buffer))[\ltr]
                      بله من همینو امتحان کردم بالا هم ویرایش کردم.. ولی باز چیزی دریافت نمیکنم :sad:
                      به رویاهات فکر کن!!

                      دیدگاه


                        #12
                        پاسخ : استفاده از Rx Interrupt در CodeVision

                        خب اگر هدفت فقط ارسال یک دیتا و دریافت اون از طریق اینتراپت و مقایسه با دیتای پیشفرض هست تا خودم یه مثال ساده برات بزارم؟
                        چرا ناراحتی پاتریک!
                        + امروز ی بچه دیدم سرچهارراه گل میفروخت
                        - از دیدنش ناراحت شدی؟
                        + نه
                        پس چی ناراحتت کرده
                        + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                        ------------------------------------------------------------------------------------------------------
                        تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                        ------------------------------------------------------------------------------------------------------
                        محصولات

                        دیدگاه


                          #13
                          پاسخ : پاسخ : استفاده از Rx Interrupt در CodeVision

                          نوشته اصلی توسط سوران آراسته
                          خب اگر هدفت فقط ارسال یک دیتا و دریافت اون از طریق اینتراپت و مقایسه با دیتای پیشفرض هست تا خودم یه مثال ساده برات بزارم؟
                          آره دقیقا همین چیزی که گفتی ، ممنون میشم :smile:
                          به رویاهات فکر کن!!

                          دیدگاه


                            #14
                            پاسخ : استفاده از Rx Interrupt در CodeVision

                            اینم یه سورس البته فقط جهت اموزش و آشنایی با نحوه عملکرد توابع و اینتراپت!
                            فایل های پیوست شده
                            چرا ناراحتی پاتریک!
                            + امروز ی بچه دیدم سرچهارراه گل میفروخت
                            - از دیدنش ناراحت شدی؟
                            + نه
                            پس چی ناراحتت کرده
                            + اینکه دیدن اینجور بچه ها انقدر واسم عادی شده که دیگه ناراحتم نمیکنه
                            ------------------------------------------------------------------------------------------------------
                            تاحالا فکر کردی بیسواد کیه؟- بی سواد یعنی کسی که نمیتونه ذهنیاتش رو عملی کنه!
                            ------------------------------------------------------------------------------------------------------
                            محصولات

                            دیدگاه


                              #15
                              پاسخ : پاسخ : استفاده از Rx Interrupt در CodeVision

                              دستت درد نکنه مشکل تا حد زیادی حل شد! :applause:

                              الان مشکل جدیدی که هست اینکه این عمل رو یک بار انجام میده! یعنی فقط وقتی دفعه اول دیتا ارسال میشه با دیتا اصلی مقایشه میشه و ok میده ، ولی دفعه دوم ok نمیده. :eek: به جای lcd از terminal تو کدویژن استفاده کردم
                              به رویاهات فکر کن!!

                              دیدگاه

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