Forum: Mikrocontroller und Digitale Elektronik ATmega16 UART: Bits vertauscht?!


von Sebastian (Gast)


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

von Aleksej Kiselev (Gast)


Lesenswert?

Versuch mal nicht in ucsrc zu schreiben, die sind schon am Start richtig
eingestellt. Und noch was - was meinst du mit ursel? Umsel? Dann ist es
ja falsch, es soll 0 sein.

von Sebastian (Gast)


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

von Simon K. (simon) Benutzerseite


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.

von Aleksej Kiselev (Gast)


Lesenswert?

Ja, ist richtig, man soll UCSRS mit 0x86 beschreiben. Wahrscheinlich
liegt das Problem wo anders. Habe die falsche Anleitung, sorry :(

von Sebastian (Gast)


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

von Wolfram (Gast)


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

von thkais (Gast)


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.

von Sebastian (Gast)


Lesenswert?

Hi,

nur noch der vollstaende halber. Mit einem externen Quartz laeuft alles
wie es soll. Danke fuer Eure Ueberlegungen und Hilfestellungen.

Thanks,
  Sebastian

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.