Hallo zusammen, Habe hier ein Problem mit dem UART am ATMEGA32. Ich will vorerst nur ein Zeichen (x) an den PC senden. Einstellung ist 8N1 mit 9600 Baud, denke dass ich das soweit auch alles richtig initialisiert habe mit Hilfe des Datenblatts und Tutorials. Hier die Initialisierung: void usart_init(void) { UCSRC |= ( 1 << URSEL )|( 3<<UCSZ0 ); // Asynchron 8N1 UBRRH = 0; // Highbyte ist 0 UBRRL = 27; // 4,33 MHz, 9600Baud UCSRB |= ( 1 << TXEN ); // UART TX einschalten } und en Stück aus der Senderoutine: while (!(UCSRA & (1<<UDRE))); /* warten bis Senden moeglich _delay_ms(100); UDR = 'x'; Satt 0111 0000 bekommt der PC 0000 0000 und 1111 0000 gesendet. Kennt jemand das Problem? Es ist sicher die Richtige Baudrate, Parität, Stoppbit am PC eingestellt. M f G Sebastian
Sorry, Ergänzung Es kommt folgendes an: 0000 0000 1111 0000 1100 0000
Wei.. schon spät, vergesst die Ergänzung. Ich muss erstmal was essen ;)
hallo, wo hast du denn dein baudrate-setting her (die '27'), selber ausgerechnet? bye kosmo
Hallo, ja, die 27 ergibt sich bei 9600Baud und 4,33Mhz Quarz. M f G Sebastian
" UDR = 'x'; Satt 0111 0000 bekommt der PC 0000 0000 und 1111 0000 gesendet." Wieso kommst du darauf, dass 'x' 0b0111 0000 entspricht? Meiner Ansicht nach ist 'x' 0x78 d.h. 0b01111000. Und die 4 Einsen passen doch schon gut zu deinem Ergebnis. Allerdings ist ein Offset von einem Bit drin. Kann es sein, dass sich Sender und Empfänger über die Einstellung der Schnittstelle (8N1) uneinig sind? Ansonsten würde ich beim Init die Reihenfolge aus dem Datenblatt probieren: 1. Baudrate einstellen 2. Transmitter enablen 3. Frame format einstellen. Dabei nicht mit dem unbekannten Anfangszustand verodern, sondern gezielt und komplett setzen.
Sieht irgendwie wie unterschiedliche Baudraten aus, schick doch mal was anderes, z.b. 0xaa
Also, wenn ich 0xaa sende kommen direkt mal 4 Byte an. 00h F8h 3Ch FFh die Reihenfolge der Initialisierung habe ich geändert. Tut sich nichts. Kann es sein, dass ich irgendwo noch den externen Quarz als Taktgeber auswählen muss?
Nur wenn du einen externen Quarz angeschlossen hast. Wenn du es umstellst ohne einen angeschlossen zu haben, hast du dich aus dem Atmega32 ausgesperrt. Die krumme Taktrate 4,33 MHz (UBRRL = 27;...) spricht eigentlich für einen externen Takt oder fehlerhafte Übernahme eines fremden Codes. Die normale, internen Taktraten sind 1, 2, 4 oder 8 MHz. 4,33 MHz statt 4 MHz sind 8,25% Abweichung. Bei dieser hohen Abweichung ist es kein Wunder, dass der Empfänger Müll sieht.
hast du auch, wie vorgeschlagen, das verodern durch zuweisungen ersetzt?
was definitiv fest steht ist, das Sender und Empfänger stark unterschiedliche Baudraten haben, da gibt prinzipiell zwei Fehlermöglichkeiten: - die Taktraten am Sender oder Empfänger (oder beiden) sind falsch eingestellt (Test: am PC andere Baudrate einstellen, in deinem Fall eine langsamere) - der micro läuft mit einer anderen Frequenz als gedacht (Test: mit Warteschleifen oder Timer die Frequenz bestimmen, vielleicht läuft er mit internem Takt und nicht dem ext. 4,33MHz) Grüße Walter
Hallo, Also, ich habe mal diese Configuration Bits mit Pony Prog ausgelesen. Da ist CKSEL0 gesetzt, 1, 2 und 3 nicht. (Kein Häkchen beudeutet ja wohl, dass es gesetzt ist, wenn ich das richtig verstehe). Außerdem steht im Datenblatt, dass als "default setting" diese Bits so gesetzt sind, dass der interne RC Oszillator mit 1MHz aktiviert ist. Habe mal testweise die Bits umgesetzt, wobei der µC jetzt allerdings gar nichts mehr sagt ;) ich häng nachher mal en Oszi an das Quarz, dann sehe ich ja ob er mit dem externen Takt arbeitet. M f G Sebastian
> Habe mal testweise die Bits umgesetzt, wobei der µC jetzt allerdings gar > nichts mehr sagt Weist du noch wie du sie eingestellt hast? Wahrscheinlich hast du sie auf 'externen Oszillator' eingestellt. Passiert relativ oft. Was du brauchst ist die Einstellung für 'externer Crystal'. Wiederbeleben kannst du den µC, indem du an XTAL1 eine Frequenz einspeist. Wenn du noch einen µC hast, dann programmier ihn so, dass er ständig einen PortPin toggelt. Mit dem Signal gehst du in den XTAL. Es spielt keine Rolle wo du das Signal herkriegst, die Hauptsache es hat ein paar kHz, und ist ein 5V Rechtecksignal.
Hm, danke, das kann gut sein. Ich kann ja einfach einen Frequenzgenerator dranhängen, ist weniger Aufwand als mit µC. Danke für den Tip! Sebastian
So, am Quarz-Eingang kann ich nichts messen, normal sollte man da ja mehr oder weniger ein Rechteck sehen können. Richtig eingestellt war alles, 4MHz vom F-Generator kamen an. Was nun? Wie müsste ich diese Conf. Bits setzen? Bin bisschen verwirrt, da ein gesetztes Bit = 0 ist.. Sebastian
So, hatte diese Bits falsch gesetzt, jetzt scheint es zu laufen. D.h. Buchstaben kriege ich problemlos übertragen, allerdings kommt nichts an wenn ich UDR = 0xaa; schreibe... Sebastian
Hmm. Es geht doch, aber ich muss das Teil irgenwie immer "anschuppsen" indem ich die Config. Bits auslese, dann läufts los.
>Es geht doch, aber ich muss das Teil irgenwie immer "anschuppsen" >indem ich die Config. Bits auslese, dann läufts los. Selbstbauprogrammer? An einem XP-Rechner? Miss mal den Reset-Pin nach dem Programmieren. (Hab ich gerade dank Karl-Heinz Buchegger gelernt...)
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.