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

[Atmega 32] Uart odbiór przez uC

qnrad 19 Maj 2010 17:33 4277 4
REKLAMA
  • #1 8094880
    qnrad
    Poziom 10  
    Problem, w zasadzie coś co jest już wałkowane na forum wielokrotnie, ale mimo przeczytania kilku wątków nie znalazłem odpowiedzi. Otóż potrzebuję zrobić odbiór poprzez uart. Korzystam z Atmegi 32(w zestawie ewaluacyjnym, zewnętrzny kwarc) i środowiska WinAvr. Wysyłanie z mikrokontrolera udało mi się uruchomić, odbioru przez uC nie do końca.

    Komunikacja przez uart jest tylko częścią całego większego programu.
    Odbierać chce poprzez przerwanie,w momencie pojawienia się danych.

    To co mam na chwile obecną:

    #include <avr/io.h>
    
    void USART_Init(int baud)
    {
    UBRRH = (unsigned char)(baud>>8);
    UBRRL = (unsigned char)baud;
    UCSRB = (1<<RXEN)|(1<<TXEN);
    UCSRC = (1<<URSEL)|(3<<UCSZ0);
    }
    
    void USART_PutChar(unsigned char data)
    {
    while (!(UCSRA & (1 << UDRE)));
    UDR = data;
    }
    //-------------------------------------
    // Receive single char
    //-------------------------------------
    unsigned char USART_GetChar(void)
    {
    while (!(UCSRA & (1 << RXC)));
    
    return UDR;
    }
    //-------------------------------------
    // Send string
    //-------------------------------------
    void USART_PutString(char * s)
    {
    while(*s)
    	USART_PutChar(*s++);
    }
    //-------------------------------------
    // Receive string
    //-------------------------------------
    void USART_GetString(char * s)
    {
    char c;
    do{
      c = USART_GetChar();
      USART_PutChar(c);
      if(c=='\b')   // if backspace
        s--;
      else     
        *s++ = c;
      if(c == '\r') // if CR
        *s = 0;
    }while(c != '\r');
    }


    Strumień:

    FILE uart_str = FDEV_SETUP_STREAM(USART_PutChar, USART_GetChar, _FDEV_SETUP_RW);


    Chciałbym móc odczytywać gdy zgłaszane jest przerwanie. W poniższym przykładzie jest to tylko jeden znak, oczywiście najlepiej było by ze strumienia.
    niestety nie działa.Wszystko jest dobrze podłączone bo odbiór mi działa. Nadawanie zresztą też, tzn zbierał pojedyncze PRZYPADKOWE znaki gdy wpisałem to co poniżej w przerwaniu od timera(ale to było dla testów). Wolałbym jednak przez przerwanie ze względu na rozbudowany program. Może trzeba odblokować jakoś globalnie to przerwanie...

    ISR(USART0_RX_vect)
    { 
    	volatile char c;
    	c=USART_GetChar();
    	LCD_clear();
    	fprintf(stderr,"in %c",c);
    	delay_1s();
    }
  • REKLAMA
  • REKLAMA
  • #3 8094973
    qnrad
    Poziom 10  
    mam to od początku w swoim programie
    więc to nie to
  • REKLAMA
  • Pomocny post
    #4 8097009
    OlekM
    Poziom 17  
    Cytat:
    Może trzeba odblokować jakoś globalnie to przerwanie...


    Dokładnie :-)
    Należy jeszcze ustawić bit RXCIE w rejestrze UCSRB.

    Ale kiedy testy się skończą, to lepiej z przerwania usunąć czasochłonne rzeczy - typu obsługa LCD :idea:
REKLAMA