Hallo, habe hier ein funktionierendes ATmega8 Programm, welches lauter 'x' ausgibt. Wollte es umschreiben auf den ATmega644, habe die Register laut Datenblatt geändert, jedoch funktioniert die Übertragung nicht mehr. Woran könnte es liegen? ATmega644: #include <avr/io.h> #define F_CPU 3686400 #define BAUD 9600 #define UBRR_VAL = ((3686400/(9600*16))-1) void uart_init(void) { UBRR0H = 0x00; UBRR0L = 0x17; UCSR0B |= (1<<TXEN0); // UART TX einschalten UCSR0C = (1<<UMSEL00)|(1<<UCSZ01)|(1<<UCSZ00); // Synchron 8N1 } int main(void) { uart_init(); while(1){ while (!(UCSR0A & (1<<UDRE0))) { // warten bis Senden moeglich } UDR0 = 'x'; //_delay_ms( 10 ); } } ATmega8: #include <avr/io.h> #define F_CPU 3686400 #define BAUD 9600 #define UBRR_VAL = ((3686400/(9600*16))-1) void uart_init(void) { UBRRH = 0x00; UBRRL = 0x17; UCSRB |= (1<<TXEN); // UART TX einschalten UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1 } int main(void) { uart_init(); while(1){ while (!(UCSRA & (1<<UDRE))) { // warten bis Senden moeglich } UDR = 'x'; //_delay_ms( 10 ); } }
> UCSR0C = (1<<UMSEL00)|(1<<UCSZ01)|(1<<UCSZ00); // Synchron 8N1
Synchron ist was anderes als asynchron.
Lass das UMSELxx einfach weg.
Oben schreibst du: UCSR0B |= (1<<TXEN0); // UART TX einschalten und weiter unten: UCSRB |= (1<<TXEN); // UART TX einschalten Evtl. mag das der Compiler nicht.
Probiert mal beim fcpu define nach der zahl noch ul dazu geben... Hat bei mir damals das Problem gelöst!
Danke für die Tipps, bekomme aber noch immer lauter wires zeugs: x<\0>x<\0>8<\0>8<\0>8<\0>x<\0>x<\0>8<\0>8<\0>x<\0>x<\0>8<\0>8<\0>x<\0>x< \0>x<\0>8<\0>8<\0>8<\0>8<\0>8<\0> Sollte ja eigentlich nur: xxxxxxxxxxxxxxxxxxxxxxxxxxx ausgeben
Wirres Zeug ist ein starkes Indiz dafür, dass die Baudrate nicht stimmt. Und die wiederrum hängt von der effektiven µC-Taktfrequenz und dem UART-Baudratenteiler in UBRRH/UBRRL ab. Wie man die effektive Taktfrequenz zumindest genau genug für UART Zwecke bestimmen kann, weißt du ja seit gestern. (Den Fehler, dass du den Empfänger auf eine laufende pausenlose Übertragung aufschaltest, wirst du ja kein 2-tes mal gemacht haben)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.