Hallo zusammen ich habe ein Problem mit der Initialisierung der UART Schnittselle am Atmega16. Wärend der Initialisierungsphase soll das UCSRC gelesen Beziehungsweise die Steuerbits geschaltet werden. Diese fuktioniert leider nicht ich habe schon so ziemlich alles versucht. Das UBRRH Register was die gleich Adresse verwendet läßt sich auch nicht beschreiben. Hat jemand einen Tipp ?
Guckst Du Datenblatt: URSEL gesetzt -> UCSRC wird geschrieben URSEL nicht gesetzt -> UBRRH wird geschrieben
Hallo danke für eure Antworten habe ich schon getestet funzt leider nicht. URSEL habe ich gelöscht und gesetzt leider alles zecklos.
Warum gibt sich Atmel eigentlich immer solche Mühe mit den Datenblättern, wenn keiner reinguckt? Auf Seite 148 ist die USART-Initialisierung inklusive Beispiel beschrieben.
Hier der Code void init_uart (unsigned char baud ) { // baud = 51 UBRRH = (unsigned char)(baud>>8); UBRRL = (unsigned char)baud; /* Enable Transmitter */ UCSRB = (1<<TXEN); UCSRC = (1<<USBS)|(1<<UCSZ0);; }
> UCSRC = (1<<USBS)|(1<<UCSZ0);
Und wo hast Du da URSEL gesetzt? Es muss heißen
1 | UCSRC = (1 << URSEL) | (1 << USBS) | (1 << UCSZ0); |
baud sollte eigentlich eher einen grösseren Datentyp haben. Tut hier aber nichts zur Sache. Welche Taktfrequenz und Baudrate hast du denn?
Bei F_CPU musst du noch deine tatsächliche Taktfrequenz einstellen. Die Initialisierung des Baudratenregisters klappt bei mir nur dann, wenn ich sie nach dem Beschreiben von UCSCRC mache.
1 | #ifndef F_CPU
|
2 | #define F_CPU 7372800UL
|
3 | #endif
|
4 | |
5 | #include <avr/io.h> |
6 | |
7 | |
8 | void InitUart( unsigned int Baud ) |
9 | {
|
10 | UCSRB |= (1<<TXEN) | (1<<RXEN); |
11 | UCSRC |= (1<<URSEL)| (1<<USBS) | (3<<UCSZ0); |
12 | |
13 | Baud = F_CPU / (Baud * 16L) - 1; |
14 | |
15 | UBRRH = (unsigned char)( Baud >> 8 ); |
16 | UBRRL = (unsigned char)Baud; |
17 | }
|
18 | |
19 | void uart_putc( const char c ) |
20 | {
|
21 | while( !( UCSRA & (1<<UDRE) ) ) |
22 | ;
|
23 | UDR = c; |
24 | }
|
25 | |
26 | int main() |
27 | {
|
28 | InitUart( 4800U ); |
29 | |
30 | while( 1 ) { |
31 | uart_putc( 'X' ); |
32 | }
|
33 | }
|
Habe ich hier nochmal sder neue Code mit URSEL P.s ich verwende einen JTAG von Atmel und AVR Studio mit Sp2 void init_uart (unsigned char baud ) { // baud = 51 UBRRH = (unsigned char)(baud>>8); UBRRL = (unsigned char)baud; /* Enable Receiver and Transmitter */ UCSRB = (1<<TXEN); UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ0);; /* Set data Frame 8 Data Bits 1 Parity */ }
...Und, klappt es? Vermutlich nicht. Aber wenn Du jetzt noch, wie von Karl Heinz angemerkt, erst die Steuerregister und dann die Baudratenregister schreibst, dann sollte es gehen, vorausgesetzt, Du hast die korrekte Taktfrequenz eingestellt...
Danke an alle funzt leider nicht UBRRH und UCSRC werden nicht beschieben
Strippi wrote: > ja wir es, UCSRB = (1<<TXEN) wird ausgeführt Woher weist du das? Simulator? Vergiss ihn! Welches Program? Das das ich gepostet habe stammt von gestern abend direkt von meinem Mega16. Das geht nachweislich. Wenn du damit am PC keinen Empfang hast, dann hast du ein anderes Problem. (Kabel gekreuzt, MAX232 geht nicht, flasche Taktfrequenz, etc...)
>Woher weist du das? >Simulator? Vergiss ihn! >ich verwende einen JTAG von Atmel und AVR Studio mit Sp2 Nix Simulator...Emulator! Solange die Baudrate und die Taktfrequenz unbekannt sind, ist das wieder nur Rumgestochere...
Ich messe direkt an dem TX Pin vom ATmega 16. Taktfrequenz ist 8 MHz intern. Kabel sind auch nicht gekreuzt.
>// baud = 51
Würde zu 2MHz und 2400Baud (0,2%Fehler) oder 8MHz und 9600baud oder
16MHz und 19,2kbaud oder 16MHz, 38,4kbaud und U2X=1 passen...
Mehr dazu findet man in Tabelle 68ff im Datenblatt...
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.