اطلاعیه

Collapse
No announcement yet.

یک سوال در مورد UART در AVR

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

    یک سوال در مورد UART در AVR

    من با Codevision برنامه مینویسم.برای دریافت اطلاعات از RS232 میکرو دو تابع : ()gets و ()getchar وجود داره.من مشکلی با دریافت اطلاعات ندارم اما این 2 تابع طوری عمل میکنن که برنامه رو روی خودشون نگه میدارن تا دریافتشون رو انجام بدن بعد برنامه ازشون رد میشه.میخوام بدونم روشی هست که اینتوری نباشه.یعنی هر وقت دیتا دریافت میشه توی یک بافری Save بشه یا وقتی دیتا میاد مثل اینتراپت بره بگیره و بر گرده؟
    خواهشا کمکم کنید

    #2
    پاسخ : یک سوال در مورد UART در AVR

    سلام
    من با bascom برنامه می نویسم , ولی واسه دریافت اطلاعات RS232 میتونی از اینتراپت استفاده کنی اینطوری برنامت روال عادی خودشو داره هروقت دیتا رو دریافت کنه به زیر :icon_razz:برنامه وقفه میره.
    موفق باشی
    آرین شاپ : فروشگاه اختصاصی محصولات آبنما و نورپردازی
    www.Shop.ArianEng.ir

    دیدگاه


      #3
      پاسخ : یک سوال در مورد UART در AVR

      من تو یکی از برنامه هام از اینتراپت RXD استفاده کردم ولی از دستور scanf() برای دریافت کمک گرفتم. اگه اطلاعات ورودی زیاد باشه خوب جواب میده.
      روش کار هم به اینصورته که وقتی اینتراپت دریافت فعال شد یه بیت رو توی اینتراپت یک میکنم و بلافاصله بعد از اینتراپت اگه این بیت یک باشه تابع recive(); فراخوانی میشه و ....

      bit rxint=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 256
      char rx_buffer[RX_BUFFER_SIZE];
      unsigned char rx_wr_index,rx_rd_index,rx_counter;
      // This flag is set on USART Receiver buffer overflow
      bit rx_buffer_overflow;

      // USART Receiver interrupt service routine
      #pragma savereg-
      interrupt [USART_RXC] void uart_rx_isr(void)
      {
      char status,data;
      #asm
      push r26
      push r27
      push r30
      push r31
      in r26,sreg
      push r26
      #endasm
      status=UCSRA;
      data=UDR;
      if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
      {
      rxint=1;
      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;
      };
      };
      #asm
      pop r26
      out sreg,r26
      pop r31
      pop r30
      pop r27
      pop r26
      #endasm
      }
      #pragma savereg+

      #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&quot
      --rx_counter;
      #asm("sei&quot
      return data;
      }
      #pragma used-
      #endif
      اگر ندانی کجا میروی هر راهی تو را باخود خواهد برد.

      دیدگاه


        #4
        پاسخ : یک سوال در مورد UART در AVR

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

        دیدگاه


          #5
          پاسخ : یک سوال در مورد UART در AVR

          آقای روباه نظراتتون همیشه مفید هست.آیا راهی هست که هر وقت دیتا اومد یکجا ذخیره بشه بعد بریم بخونیمش؟
          مثلا تایعی باشه که هر وقت دیتا میاد اون رو بگیره و تو یک آرایه قرار بده.یا خدش اتوماتیک به اینتراپت بره؟

          دیدگاه


            #6
            پاسخ : یک سوال در مورد UART در AVR

            آقای ourman منظورتون از تابع ()recive کجاست؟

            دیدگاه


              #7
              پاسخ : یک سوال در مورد UART در AVR

              من این کدی که گفته بودین رو اجرا کردم اما هیچ اینتراپتی نمیده.دیتایی که میفرستم تو رجیستر UDR میاد اما اینتراپت نمیده.
              خواهشا کمکم کنید.راه خاصی نداره؟

              دیدگاه


                #8
                پاسخ : یک سوال در مورد UART در AVR

                چرا کسی جواب نمیده؟

                دیدگاه


                  #9
                  پاسخ : یک سوال در مورد UART در AVR

                  سلام
                  دوست عزیز من فکر میکنم شما دارین با پرتئوس تست میگیرید.
                  پرتئوس این گزینه رو اجرا نمی کنه.من قبلا به این مشکل خوردم.
                  شما عملی برنامه زیر رو تست کنید:
                  LCD رو پورت C هست و در خط اول یک متغییر در حال زیاد شدن هست و در خط دوم از کامپیوتر هرچی بفرستید میبینید در حین زیاد شدن متغیر.



                  #include <mega16.h>

                  #include <delay.h>
                  // Alphanumeric LCD Module functions
                  #asm
                  .equ __lcd_port=0x15 ;PORTC
                  #endasm
                  #include <lcd.h>



                  int i;
                  unsigned char str[8],x;

                  interrupt [USART_RXC] void usart_rx_isr(void)
                  {


                  lcd_gotoxy(x,1);
                  lcd_putchar(UDR);
                  delay_ms(1000);
                  x++;

                  }


                  #include <stdio.h>

                  // Declare your global variables here

                  void main(void)
                  {
                  // Declare your local variables here

                  // Input/Output Ports initialization
                  // Port A 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
                  PORTA=0x00;
                  DDRA=0x00;

                  // 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
                  // 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
                  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;

                  // Timer/Counter 0 initialization
                  // Clock source: System Clock
                  // Clock value: Timer 0 Stopped
                  // Mode: Normal top=FFh
                  // OC0 output: Disconnected
                  TCCR0=0x00;
                  TCNT0=0x00;
                  OCR0=0x00;

                  // Timer/Counter 1 initialization
                  // Clock source: System Clock
                  // Clock value: Timer 1 Stopped
                  // Mode: Normal top=FFFFh
                  // OC1A output: Discon.
                  // OC1B output: Discon.
                  // Noise Canceler: Off
                  // Input Capture on Falling Edge
                  // Timer 1 Overflow Interrupt: Off
                  // Input Capture Interrupt: Off
                  // Compare A Match Interrupt: Off
                  // Compare B Match Interrupt: Off
                  TCCR1A=0x00;
                  TCCR1B=0x00;
                  TCNT1H=0x00;
                  TCNT1L=0x00;
                  ICR1H=0x00;
                  ICR1L=0x00;
                  OCR1AH=0x00;
                  OCR1AL=0x00;
                  OCR1BH=0x00;
                  OCR1BL=0x00;

                  // Timer/Counter 2 initialization
                  // Clock source: System Clock
                  // Clock value: Timer 2 Stopped
                  // Mode: Normal top=FFh
                  // OC2 output: Disconnected
                  ASSR=0x00;
                  TCCR2=0x00;
                  TCNT2=0x00;
                  OCR2=0x00;

                  // External Interrupt(s) initialization
                  // INT0: Off
                  // INT1: Off
                  // INT2: Off
                  MCUCR=0x00;
                  MCUCSR=0x00;

                  // Timer(s)/Counter(s) Interrupt(s) initialization
                  TIMSK=0x00;

                  // USART initialization
                  // Communication Parameters: 8 Data, 1 Stop, No Parity
                  // USART Receiver: On
                  // USART Transmitter: Off
                  // USART Mode: Asynchronous
                  // USART Baud rate: 9600
                  UCSRA=0x00;
                  UCSRB=0x90;
                  UCSRC=0x86;
                  UBRRH=0x00;
                  UBRRL=0x19;

                  // Analog Comparator initialization
                  // Analog Comparator: Off
                  // Analog Comparator Input Capture by Timer/Counter 1: Off
                  ACSR=0x80;
                  SFIOR=0x00;

                  // LCD module initialization
                  lcd_init(16);

                  // Global enable interrupts
                  #asm("sei&quot

                  while (1)
                  {
                  i++;
                  sprintf(str,"%d",i);
                  lcd_gotoxy(0,0);
                  lcd_puts(str);
                  delay_ms(1000);

                  };
                  }
                  خدا گفت : به جهنم ببریدش، او برگشت و با تعجب به خدا نگاه کرد. خدا گفت : به بهشت ببریدش. فرشتگان پرسیدند: چرا؟! خدا گفت : او هنوز به من امیدوار است...

                  دیدگاه


                    #10
                    پاسخ : یک سوال در مورد UART در AVR

                    ببخشید یه مدت نبودم :redface:
                    ببینید تابع recive رو خودتون می تونید بنویسید و با هر دستوری که می خواهید اطلاعات رو دریافت کنید و توی یک یا چند متغیر ذخیره کنید. مثلا:

                    int data;
                    .
                    .
                    .
                    voide recive(){
                    scanf("%2d",&data);
                    }
                    .
                    .
                    .
                    while(1){
                    if(rxint==1) recive();
                    }
                    که می تونی اطلاعات ذخیره شده توویه data رو هر جایی که خواستی استفاده کنی.
                    اگر ندانی کجا میروی هر راهی تو را باخود خواهد برد.

                    دیدگاه


                      #11
                      پاسخ : یک سوال در مورد UART در AVR

                      با سلام
                      آقای نجفی آیا به این روش میشه بیش از یک بایت دیتا رو در یک سری ارسال کرد ؟
                      من از پایان می ترسیدم و آغاز کردم . . .

                      دیدگاه


                        #12
                        پاسخ : یک سوال در مورد UART در AVR

                        شما ابتدا تو تنظیمات Codewizard وقفه های ارسال و دریافت را فعال کنید
                        در ضمن همون جا میتونید برای ارسال و دریافت به صورت مجزا بافر تعیین کنید

                        با این کار ، Codevision توابع getchar , ... رو مجددا تعریف میکنه

                        حالا شما میتونید این دستورها رو در روتین وقفه به کار ببرید
                        بدون هیچ مشکلی

                        دیدگاه


                          #13
                          پاسخ : یک سوال در مورد UART در AVR

                          آقا بهترین کار اینه که شما وقفه دریافت رو راه اندازی کنی بعد هم در زیر برنامه وقفه از خود بافر سریال که یک بافر سخت افزاری هست به طور مستقیم اطلاعات رو برداری و بدون هیچ مشکلی جواب کارت رو میده حتی این کار در 8051 هم جواب میده چه برسه به avr .
                          همانطور كه مايل نيستم بنده كسي باشم، حاضر نيستم آقاي كسي باشم. كساني كه مخالف آزادي ديگرانند، خود لياقت آزادي را ندارند.((آبراهام لينكن))

                          قدرت شگفت انگيز نيروهاي خلاق و استعدادهاي نهفته آدمي هنگامي آشكار مي شود كه نيازي حياتي، تواناييهاي او را به فعاليت وادارد و كشش آرزويي، سراپاي وجودش را به جنب و جوش درآورد.((آبراهام لينكن))

                          [img width=343 height=100]http://www.elecdesigner.com/uploads/PRO-DESIGNER-GROUP.jpg[/img]

                          دیدگاه

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