logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

USART - odbieranie dancyh

patek 17 Gru 2009 21:07 1337 5
REKLAMA
  • #1 7402859
    patek
    Poziom 10  
    Wysylajać dane z terminalu "AT560" program odpowiada mi "AT50", czemu nie odpowiada "AT560"

    #include <avr/io.h> 
    #include <util/delay.h> 
    #include <avr/interrupt.h> 
    #include <avr/signal.h> 
    #define F_CPU 16000000UL 
    #define BAUD 9600 
    #define MYUBRR F_CPU/16/BAUD-1 
     
    
    char* wys;
    
    
    
    
    void usart_init(unsigned int ubrr) 
    { 
    UBRRH = (unsigned char)(ubrr>>8); 
    UBRRL = (unsigned char)ubrr; 
    UCSRB = (1<<RXEN)|(1<<TXEN); 
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); 
    } 
    
    void nadaj_znak(unsigned char data) 
    { 
    while(!(UCSRA&(1<<UDRE))); 
    UDR=data; 
    } 
    
    unsigned char odbierz_znak(void) 
    { 
    while(!(UCSRA & (1<<RXC)) ); 
    return UDR; 
    } 
    
    void wyslij_slowo(char *dana) 
    { 
    int dlugosc_slowa, k=0; 
    dlugosc_slowa=strlen(dana); 
    for(k=0;k<dlugosc_slowa;k++) 
       { 
       nadaj_znak(dana[k]); 
       } 
    } 
    
    int main(void) 
    { 
    DDRD=0x02; 
    PORTD=0x00; 
    usart_init(MYUBRR); 
    _delay_ms(100); 
    nadaj_znak(0x0D); 
    wyslij_slowo("Witam w programie testowym "); 
    while(1) 
       { 
       wys=odbierz_znak(); 
       _delay_ms(100); 
       nadaj_znak(wys); 
       _delay_ms(100);
    
       } 
    }
    
  • REKLAMA
  • Pomocny post
    #2 7403155
    kacperpk
    Poziom 14  
    wywal opóźnienia z pętli głównej
  • REKLAMA
  • #3 7403635
    gothye
    Poziom 33  
    widzisz ?
    void wyslij_slowo(char *dana) 
    { 
    int dlugosc_slowa, k=0; 
    dlugosc_slowa=strlen(dana); 
    for(k=0;k<dlugosc_slowa;k++) 
       { 
       nadaj_znak(dana[k]); 
       } 
    }



    wysyłna znak z ciągu -1 wiec :


    void wyslij_slowo(char *dana) 
    { 
    int dlugosc_slowa, k=0; 
    dlugosc_slowa=strlen(dana) + 1; 
    for(k=0;k<dlugosc_slowa;k++) 
       { 
       nadaj_znak(dana[k]); 
       } 
    }


    i zagra ;)
  • REKLAMA
  • #4 7405825
    patek
    Poziom 10  
    Kacperpk
    Cytat:
    wywal opóźnienia z pętli głównej
    Miałes racje tylko zastanawia mnie dlaczego to miało wpływ?

    Dodano po 21 [minuty]:

    Oraz zastanawia mnie kwestia obługi przerwania
    SIGNAL (SIG_UART_RECV)
    int i = 8;
    {
    o=USART_Receive();
     LCD_WriteText("O");
     LCD_WriteText(dtostrf(j,1,1,buf));
     j++;
    
    }


    Czemu na ekranie dostałej same zera. Zamiast jednego zera oraz osemki na LCD?
  • REKLAMA
  • #5 7406305
    kacperpk
    Poziom 14  
    w pierwszym przypadku nie działało ponieważ, o części sprzętowej służącej do odbierania danych można powiedzieć ze zawiera tak jakby 3 lub 4 ( nie pamiętam ile to dokładnie jest) bajtowy bufor.
    Wysyłając do niej dane szybciej niż 3-4 bajty na 200ms natrafiamy na sytuację przepełnienia bufora i część danych ginie, coś takiego się nie dzieje bez opóźnień.

    W drugim przypadku stawiam bym ze zmienna "j" nie jest zadeklarowana jako "volatile" oraz na to ze pomyliłeś zmienne "i" z "j"
  • #6 7406326
    patek
    Poziom 10  
    ta zmienna jest j, to tylko literowka.
    volatile to tez nie to. :(
REKLAMA