Forum: Compiler & IDEs UART senden, Bits verschoben, 2 Byte statt 1


von Sebastian (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

Sorry, Ergänzung


Es kommt folgendes an:

0000 0000
1111 0000
1100 0000

von Sebastian (Gast)


Lesenswert?

Wei.. schon spät, vergesst die Ergänzung. Ich muss erstmal was essen ;)

von Joe D. (kosmonaut_pirx)


Lesenswert?

hallo,
wo hast du denn dein baudrate-setting her (die '27'), selber 
ausgerechnet?
bye kosmo

von Sebastian (Gast)


Lesenswert?

Hallo,

ja, die 27 ergibt sich bei 9600Baud und 4,33Mhz Quarz.

M f G
Sebastian

von Stefan (Gast)


Lesenswert?

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

von Walter (Gast)


Lesenswert?

Sieht irgendwie wie unterschiedliche Baudraten aus,
schick doch mal was anderes, z.b. 0xaa

von Sebastian (Gast)


Lesenswert?

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?

von Stefan (Gast)


Lesenswert?

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.

von kosmonaut pirx (Gast)


Lesenswert?

hast du auch, wie vorgeschlagen, das verodern durch zuweisungen ersetzt?

von Walter (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

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

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

So sieht die Config. aus...

von Sebastian (Gast)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

Hmm. Es geht doch, aber ich muss das Teil irgenwie immer "anschuppsen" 
indem ich die Config. Bits auslese, dann läufts los.

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>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
Noch kein Account? Hier anmelden.