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
" 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.
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.
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.
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
>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...)