Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8] Wyświetlanie znaków na LCD poprzez USART

vlad90 24 Maj 2012 22:13 1592 2
  • #1 24 Maj 2012 22:13
    vlad90
    Poziom 7  

    Witam.
    Mam działające połączenie Atmega8 - PC za pośrednictwem USART oraz podłączony LCD 16X2 do atmegi. Chcę zrobić tak żeby można było wysyłać znaki przez terminal(np. RealTerm) i odrazu wypisywać ich na wyświetlać. Spróbowałem
    dodać lcd_string(UDR); przed zwracaniem UDR w funkcję USART_Receive() . Oraz wywołanie USART_Receive() w pętli głownej. Ale to nic porządnego nie dało, otrzymałem jakieś krzaczki.

    Pomóżcie

    Oto kod:

    Code:
    #include <avr/io.h>
    
    #include <avr/delay.h>
    #include "lcddrv/HD44780.h"
    #include "lcddrv/HD44780.C"
    #include "lcddrv/aux_globals.h"
     
    // definicja funkcji nadawczej
    void USART_Transmit(unsigned char data)
       {
       // czekaj az bufor nadawczy bedzie pusty
       while(!(UCSRA&(1<<UDRE)));
       // wrzuc dane do bufora nadawczego, start transmisji
       UDR=data;   
       }

    unsigned char USART_Receive( void )  // funkcja odbioru bajtu z RS232
    {

       while ( !(UCSRA & (1<<RXC)) );
       //odebrane = UDR;               
       
       return UDR;
    }
    void USART_write_text(char *s)
    {
       while(*s)                               // do napotkania 0
            {
            //tu by sie cos przydalo atoi np
            USART_Transmit(*s);                   // zapisz znak wskazywany przez s na LCD
            s++;                               // zwieksz s (przygotuj nastepny znak)
            }
    }
    // definicja funkcji inicjalizujacej UART
    void USART_Init(uint32_t baud)
       {
       
       // wyliczenie UBRR dla trybu asynchronicznego (U2X=0)
       uint16_t _ubr = (F_CPU/16/baud-1);
       // ustawienie predkosci
       UBRRH = (uint8_t)(_ubr>>8);
       UBRRL = (uint8_t) _ubr;
       // zalaczenie nadajnika i odbiornika
       UCSRB = (1<<RXEN)|(1<<TXEN);
       // ustawienie formatu ramki: 8 bitow danych, 1 bit stopu
       UCSRC = (1<<URSEL)|(3<<UCSZ0);
       }
     
     

    int main(void)
    {
        // inicjalizacja modulu UART
       lcd_init();                        // init the LCD screen
       lcd_clrscr();                     // initial screen cleanup
       lcd_home();
       lcd_string("Ready!");
       

       USART_Init(9600);
     
       while(1)
        {
           USART_write_text("Hello world!");
          _delay_ms(1000);
          
        }
    }

    0 2
  • Pomocny post
    #2 24 Maj 2012 22:32
    94075
    Użytkownik usunął konto  
  • #3 24 Maj 2012 22:58
    vlad90
    Poziom 7  

    Dzięki, faktycznie. Kompletnie zapomniałem i o tym że łańcuch musi kończyć się na '\0', właśnie dlatego mi się krzaczki wyświetlały.
    Teraz funkcja wygląda tak:

    Code:

    unsigned char USART_Receive( void )  // funkcja odbioru bajtu z RS232
    {

       while ( !(UCSRA & (1<<RXC)) );
       //odebrane = UDR;
       char buf[2];
       buf[0]=UDR;
       buf[1]=0;
       lcd_string(buf);
       return UDR;
    }

    0