mikrocontroller.net

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


Autor: Sebastian (Gast)
Datum:

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

Autor: Aleksej Kiselev (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Aleksej Kiselev (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

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

Autor: Wolfram (Gast)
Datum:

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

Autor: thkais (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Thanks,
  Sebastian

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.