ATmega16 UART: Bits vertauscht?!

Gast #349792
Lesenswert?
• ▲
▼
Hallo liebe Forumsmitglieder,

ich bin im Moment dabei eine Steuerung zu schreiben, die ueber die
serielle Schnittstelle Daten empfaengt und rausschreibt.

Jetzt habe ich bei ersten Tests das Problem, dass die Reihenfolge der
empfangenen Bits nicht stimmt. Hoert sich ziemlich bloed an, ich
weiss.
Also, normalerweise sollte ich die Bits in dieser Reihenfolge 7 6 5 4 3
2 1 0 empfangen. Tatsaechlich kommen die aber so rein: 3 7 6 5 4 2 1 0.
Kann das sein? Kann man das vielleicht irgendwo im MC einstellen und
ich habe das ausversehen mal gemacht (von der Art wie fuses oder so).
Das Problem habe ich nicht nur mit meiner eigenen Platine, sondern
auch, wenn ich die serielle Schnittstelle vom STK500 nehme.

Anbei mal ein kurzes Codefragement, wie ich das in ASM gemacht habe:


....
;Stack
ldi temp,low(ramend)
out spl,temp
ldi temp,high(ramend)
out sph,temp

;UART Initialisierung
ldi temp,low(ubrrval)
out ubrrl,temp
ldi temp,high(ubrrval)
out ubrrh,temp
ldi temp,(1<<ursel)|(3<<ucsz0)
out ucsrc,temp

sbi ucsrb,rxen ;daten empfangen
sbi ucsrb,rxcie ;interrupt bei empfang
sei

loop:
rjmp loop


.....


int_rxc:
 in temp,udr
....
reti

Und schon an dieser Stelle stimmt der Inhalt in temp nicht.

Irgendjemand vielleicht eine Idee??

Vielen vielen Dank!!

mfg,
  Sebastian
Gast #349794
Lesenswert?
• ▲
▼
Hi Aleksej,

ich hatte das alles aus dem Tutorial uebernommen. Da geht es wohl um
die Einstellungen auf 8Datenbit. Aber ich kann das gerne mal zum Spass
weglassen. Lass dann wieder von mir hoeren.

Bye,
 Sebastian
Persönliche Seite #349795
Lesenswert?
• ▲
▼
@Sebastian: Das mit den Interrupts funktioniert aber bei dir, oder? Also
Stackpointer initialisiert, Vektoren passend beschrieben?
Wie verarbeitest du 'temp' weiter ?
Besser wäre, wenn du das komplette Programm anhängst. Vielleicht liegt
der Fehler ja woanders.

@Aleksej: Es gibt auch das Bit "Ursel". Hierzu Seite 167 im
Datasheet.
Gast #349797
Lesenswert?
• ▲
▼
Hallo Leute,

ich denke ich habe jetzt meinen Fehler gefunden. Und zwar scheint es an
der Übertragungsgeschwindigkeit zu liegen. Ich muss leider 57600 Baud
verwenden. Nehme ich zum Beispiel 9600 Baud gibt es keine Fehler. Ja,
und ich habe natürlich keinen externen Quarts auf meiner Platine
vorgesehen und verwende den Internen. Da scheint es einfach zu große
Fehler/Abweichungen zu geben, da man die interne Clock ja nur auf 1MHz,
2MHz ect. einstellen kann und nicht auf Kommawerte.

Ich werde das jetzt nochmal mit einer externen Clock auf dem STK500
probieren. Denke aber mal, dass es dann auch klappt.

Hat sonst noch jemand Vorschläge?

Vielen Dank,
  Sebastian
Gast #349798
Lesenswert?
• ▲
▼
Leider hast du nicht das ganze Programm gezeigt,
Sollten bei ... Programmteile sein die ausgeführt werden, wenn auch das
Interrupt aktiv werden kann dann sollte dort temp nicht verändert
werden

>loop:rjmp loop seh ich mal nur als Bsp an , sonst wuerde ... keinen
Sinn machen
Gast #349799
Lesenswert?
• ▲
▼
Mit der Oszillatorkalibrierung kann man den internen Oszillator schon
noch ein wenig hin und her schieben. Allerdings wirst Du mit der
Temperaturstabilität nicht sehr viel Freude haben. Bei zeitkritischen
Dingen (der UART gehört bei größeren Baudraten dazu) immer einen
externen Quarz vorsehen.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.