mikrocontroller.net

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


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, Ergänzung


Es kommt folgendes an:

0000 0000
1111 0000
1100 0000

Autor: Sebastian (Gast)
Datum:

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

Autor: Joe Die (kosmonaut_pirx)
Datum:

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

M f G
Sebastian

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Walter (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast du auch, wie vorgeschlagen, das verodern durch zuweisungen ersetzt?

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So sieht die Config. aus...

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

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

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.