اطلاعیه

Collapse
No announcement yet.

مشکل در UART در Atmel Studio

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

    مشکل در UART در Atmel Studio

    با سلام خدمت اساتید محترم. من کدی برای ارتباط UART در اتمل استودیو نوشته ام. (در ذیل کد آمده است) همچنین برای کنترل وقفه ها رو نیز فعال کردم.دو تا مشکل فقط وجود داره.
    1. در وقفه مطابق دیتاشیت پس از هر بار تکمیل شدن دریافت 8 بیت (1 بایت) اطلاعات به درگاه سریال و با فعال شدن پرچم وقفه به زیر برنامه آن پرش می کند اما در این کد با دریافت 20 بایت تنها 8 بار به وقفه پرش انجام میشه!
    2. پس از فعال شدن وقفه سرعت اجرای برنامه به شدت کاهش پیدا می کنه!
    ممنون می شوم راهنمایی بفرمایید.


    #define F_CPU 2000000UL
    #define D4 eS_PORTD4
    #define D5 eS_PORTD5
    #define D6 eS_PORTD6
    #define D7 eS_PORTD7
    #define RS eS_PORTD2
    #define EN eS_PORTD3


    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <stdlib.h>
    #include <string.h>
    #include "lcd.h"


    int num=1;


    void USART_Init()
    {
    /* Serial UART, U2X=0, Async, 8,n,1, Baud = 9600, UBRR = 12;0xC */
    UCSRA = 0x00;
    UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << UDRE) | (1 << TXCIE) | (1 << RXCIE);
    UCSRC = 0x86;
    UBRRH = 0x00;
    UBRRL = 0x0C;
    }



    void show_d ()
    {
    Lcd4_Init();
    Lcd4_Clear();
    Lcd4_Set_Cursor(0,0);
    Lcd4_Write_String("**SERIAL USART**");
    _delay_ms(10);


    }


    ISR(USART_RXC_vect)
    {
    num++; //Variable to check how many times we jump to this sub.
    Lcd4_Clear();
    Lcd4_Set_Cursor(0,0);
    Lcd4_Write_String("RX Complete");
    }




    ISR(BADISR_vect)
    {
    //No Interrupt Sub
    _delay_ms(1);
    }






    int main(void)
    {
    USART_Init(); //Init UART Communication
    DDRD = 0b11111100; //Set PortD Output
    DDRB = 0xff; //Assign Value to PortB
    show_d(); //Show On LCD
    sei(); //Enable Interrupts
    _delay_ms(1); //Delay!




    while(1)


    {
    PORTB = 0b00000001; //0
    _delay_ms(300);
    PORTB = 0b00000010; //1
    _delay_ms(300);
    PORTB = 0b00000100; //2
    _delay_ms(300);
    PORTB = 0b00001000; //3
    _delay_ms(300);
    PORTB = 0b00010000; //4
    _delay_ms(300);
    PORTB = 0b00100000; //5
    _delay_ms(300);
    }


    }
    جدیدترین ویرایش توسط Javad Moosavi; ۱۸:۲۱ ۱۳۹۵/۰۷/۲۴.
    STM32 واقعا یه چیز دیگه است...

    #2
    پاسخ : مشکل در UART در Atmel Studio

    سلام
    منظورتونو بنویسید میخواهید چیکار کنید
    این کد کلا اشتباه هست
    امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

    دیدگاه


      #3
      پاسخ : مشکل در UART در Atmel Studio

      تو روتین مربوط به وقفه که نباید کار انجام بدی فقط باید داده دریافتی رو بریزی توی یه بافر بعد بیای پردازشت یا نمایش توی ال سی دی رو توی تابع اصلی یا همون main انجام بدی. چون اگه بخوای مثلا نمایش روی ال سی دی رو در روتین وقفه انجام بدی تا کارش نمایش در ال سی دی به پایان برسه داده جدیدی از usart دریافت می کنی و چون میکرو هنوز توی روتین وقفه است پس نمی تواند داده جدید رو بگیرد و به اصطلاح دوباره روتین وقفه فراخوانی نمیشود

      دیدگاه


        #4
        پاسخ : مشکل در UART در Atmel Studio

        ضمن تشکر از پاسخ دوستان. حتی با حذف تمام کد های غیر از زیربرنامه وقفه بازهم سرعت به شدت افت می کنه. همچنین برنامه به تعداد بایت دریافتی به زیر برنامه وقفه پرش نمی کنه
        STM32 واقعا یه چیز دیگه است...

        دیدگاه

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