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

[ATmega128][C] problem z USART'em

m4rq 27 Maj 2009 00:04 1985 3
  • #1 6579516
    m4rq
    Poziom 11  
    Witam, problem wygląda następująco - próbuję skomunikować się z komputerem i po części wszystko działa jednak nie do końca. Otóż na najmłodszych 4 bitach dane są poprawne natomiast na czterech najstarszych zawsze jest stała wartość 1011. Poniżej zamieszczam zrzut z terminala podczas działania programy typu echo.
    [ATmega128][C] problem z USART'em

    Natomiast kod wygląda następująco:
    
    #include <avr/io.h>
    #include "lcd.h"
    #include <avr/delay.h>
    
    #define FOSC 3680000// Clock Speed
    #define BAUD 9600
    #define MYUBRR FOSC/16/BAUD-1
    
    extern unsigned char DisplayRAM[1024];
    unsigned char data;
    
    void main( void )
    {
    	USART_Init ( MYUBRR );
    
    	while(1) 
    	{
     		data = USART_Receive();
     		USART_Transmit(data);
    	}
    
    return 0;
    }
    


    oraz
    
    void USART_Init( unsigned int ubrr )
    {
    /* Set baud rate */
    UBRR1H = (unsigned char)(ubrr>>8);
    UBRR1L = (unsigned char)ubrr;
    
    /* Enable receiver and transmitter */
    UCSR1B = (1<<RXEN1)|(1<<TXEN1);
    
    /* Set frame format: 8data, 2stop bit */
    UCSR1C = (1<<USBS1)|(3<<UCSZ1);
    }
    
    void USART_Transmit( unsigned char data )
    {
    /* Wait for empty transmit buffer */
    while ( !( UCSR1A & (1<<UDRE1)) );
    /* Put data into buffer, sends the data */
    UDR1 = data;
    }
    
    unsigned char USART_Receive( void )
    {
    /* Wait for data to be received */
    while ( !(UCSR1A & (1<<RXC1)) );
    /* Get and return received data from buffer */
    return UDR1;
    }
    


    Z góry dziękuję za wszelką pomoc. Pozdrawiam.
  • #2 6579553
    elektryk
    Poziom 42  
    A mnie się wydaje że tylko jeden najstarszy bit jest błędny. Czy próbowałeś przy innych prędkościach i innych oscylatorach?
  • #3 6579916
    GienekS
    Poziom 32  
    Czy faktycznie masz do procka podpięty kwarc 3,68 MHz ???
    Czy ustawiłeś odpowiednie bezpieczniki ??
  • #4 6582539
    m4rq
    Poziom 11  
    elektryk napisał:
    A mnie się wydaje że tylko jeden najstarszy bit jest błędny.

    Tak! rzeczywiście, nie wziąłem pod uwagę, że Terminal wysyła kody ASCII czyli "0" tak naprawdę przesyłane jest jako "48" a więc reprezentacja binarna to "0011 0000" a nie "0000 0000". Mimo wszystko problemem była ta "1" na najstarszym bicie. Okazało się, że ustawiłem złą długość ramki.

    
    /* Set frame format: 8data, 2stop bit */
    UCSR1C = (1<<USBS1)|(3<<UCSZ1);
    


    Ustawiając (3<<UCSZ1) pominąłem pole UCSZ0 przez co najprawdopodobniej zostało ustawione tam "0". A według noty aplikacyjnej daje to 7 bitową ramkę:
    [ATmega128][C] problem z USART'em

    Działająca wersja tego fragmentu kodu:
    
    /* Set frame format: 8data, 1stop bit */
    UCSR1C = (1<<UCSZ1) | (1<<UCSZ0);
    

    Dziękuję za podpowiedzi i pozdrawiam serdecznie.
REKLAMA