PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega32 Offset-Problem, Empfang von Nachrichten via USART



buthus
17.04.2007, 12:08
Hallo zusammen,

ich bin seit wenigen Tagen stolzer Besitzer eines STK500 und eines Atmega32. Diesen kleinen Baustein moechte ich nun in Betrieb nehmen und muss leider folgendes Problem feststellen:

Schreibe ich eine Zahl via HTerm an meinen Baustein, empfaengt er die Falsche Zahl. Schreibe ich eine Zahl vom Baustein auf mein Terminal, ist sie richtig. An was kann das liegen?

Baud-Rate und 8N1 sind korrekt eingestellt, folgendes Programm wird verwendet (und via AVR8 Burn-O-Mat auf den Baustein gebracht)



#include <avr/io.h>
#include <inttypes.h>

/* frequency of 1Mhz, internal oscillator. */
#define F_CPU 1000000UL
/* baud rate */
#define BAUD 9600UL

#define UBBR_BAUD ((F_CPU/(16L*BAUD))-1)

/* initialize USART */
void uart_init(void)
{
/* specify baud rate */
UBRRH = (uint8_t)(UBBR_BAUD>>8);
UBRRL = (uint8_t)(UBBR_BAUD);

/* activate receiver and transmitter */
UCSRB = (1<<RXEN) | (1<<TXEN);

/* 8N1 asynchronous */
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

int main(void)
{
uint8_t buffer;

// portB -> outputs
DDRB=0xff;
PORTB=0xff;

// inizialize UART
uart_init();

while (1)
{
// receive message
while (!(UCSRA & (1<<RXC)));
buffer = (UDR); // *
// buffer = (buffer - 0x80); // **

// wait until write buffer is free
while ( !( UCSRA & (1<<UDRE)) );
UDR = buffer;
}

return 0;
}


Ergebnisse:
- Ich schreibe eine 1 (0x31) zum Baustein, Baustein zeigt mir 0xB1 an
- Ich ersetze die * Zeile durch die ** Zeile und bekomme als Antwort auf die 1 (0x31) eine 0xF1

Ich komm grad irgendwie nicht mehr ganz mit ... vll. kann mir jemand Helfen (Hoffentlich nur ein kleines Problem :-) )

Mit freundliche Gruessen
Florian

Hubert.G
17.04.2007, 12:25
Siehe Datenblatt Seite 163, da siehst du die Fehlerrate bei deiner Baudrate. Ändere mal auf 4800 und es wird warscheinlich funktionieren. Dein HTerm ist warscheinlich etwas Fehlertoleranter als der µC. Wenn du etwas Sicherheit bei der Datenübertragung haben willst ist ein Baudratenquarz die sicherste Lösung.
Hubert

buthus
17.04.2007, 12:46
Danke Hubert, das war das Problem. Haette ich auch selbst drauf kommen koennen, immerhin habe ich in genau dieser Tabelle schon mehrmals nachgesehen. Mir ist allerdings nie aufgefallen, dass sich die Fehlerwerte von u2x=0 udn u2x=1 so sehr unterscheiden.

Nochmal ein ganz dickes DANKE!

Mit freundlichen Gruessen
buthus

P.S.: Werde das mit dem Quarz aber auch noch testen ...