Gast
#352089
Hallo,
Ich habe ein Problem mit meinem ATMega162.
Ich will mit USART0 Zeichen zwischen dem PC und dem Atmel austauschen,
aber das kommt nur Müll zurück.
Der Atmel läuft mit 16MHz mit einem externen Quarz.
Hier mein Code:
#define F_CPU 16000000
#include <avr/io.h>
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN2 (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define baud (F_CPU/(9600*16L))-1
// 9600bit/s, 1stop, even parity
UCSR0A=0x00;
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
UCSR0C = (1<<URSEL0)|(1<<UPM10)|(1<<UCSZ10)|(1<<UCSZ00);
UBRR0H=0x00;
UBRR0L=0x67;
char ugetchar(void) {
char status,data;
while (((status=UCSR0A) & RX_COMPLETE)==0);
data = UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN2))==0) {
return data;
}
return 0;
}
void uputchar(char c) {
while ((UCSR0A & DATA_REGISTER_EMPTY)==0);
UDR0 = c;
}
int16_t main(void)
{
while(1) {
uputchar(ugetchar());
//uputchar(2);
}
}
Wenn ich mitm Oszi nachmesse kriege ich aber ca. 4400 bit/s. Wenn ich
im Terminal 4800 bit/s kommen die Zeichen fast richtig zurück.
Was mache ich falsch???