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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren