ATMega8, UART, MIDI und jede Menge Stress :)

Gast #273054
Lesenswert?
• ▲
▼
Hi!

Ich habe meine liebe Not mit der Programmierung des ATMega8-U(S)ART.
Hoffentlich kann sich jemand eines Anfängers erbarmen und eine
Erklärung zu folgenden drei Phänomenen geben:

Erstens:
Die Probleme fangen schon mit dem Beschreiben der Register an.

; Frame-Format setzen: 1 start, 8 data, 1 stop bit
  ldi temp, 0x86    ; URSEL=1
  out UCSRC,temp    ; UBRRH UND UCSRC werden geschrieben
; Baudrate in den UART tickern
  ldi temp, 0x00    ; URSEL=0
  out UBRRH, temp    ; UBRRH UND UCSRC werden geschrieben
; etc...

Warum hat die liebe URSEL, die beim Schreiben zwischen UCSRC und UBRRH
wählt, ganz offenbar keinen Effekt?

Zweitens: Das Register UCSRC, in dem verschiedene Dinge stehen wie etwa
die Wortlänge (5-8 Bit), braucht anscheinend gar nicht geschrieben zu
werden! Mir liegen einige Beispielcodes vor, etwa der des
uC.net-MMC-MIDI-Recorders und der RozzBox (www.rozzbox.de), in denen
überhaupt kein Zugriff auf UCSRC stattfindet. Der Simulator im
AVR-Studio zeigt dieses Register standardmäßig mit dem Wert 0x00 an,
was einer Wortlänge von 5 Bit entspricht. Das MIDI-Protokoll hat aber 8
Datenbits. Warum funktionieren alle genannten Beispiele trotzdem?

Drittens: Angenommen, ich habe in meinem Programm eine Endlosschleife,
aus der heraus bei RXC in eine Interrupt-Routine gesprungen werden
soll. Ich pausiere die Ausführung des Programmes also in der
Endlosschleife, stelle im Simulator des AVR-Studio das UDR auf einen
Wert ein und setze das RXC-Bit in UCSRA. Wenn ich nun "Step-Into"
einen Schritt weitergehe, wird UDR auf null resettet, obwohl noch gar
nicht ausgelesen wurde. Warum?

Über jede hilfreiche Antwort freut sich

Matthias
Gast #273055
Lesenswert?
• ▲
▼
einfach mal die Hilfe in AVR Studio bemühen und festellen das diese
Registerzugriffe im Simulator noch nicht richtig implentiert sind. In
realer Hardware geht`s aber problemlos.

The USART's UBRRH and UCSRC registers share the same I/O address.
Writing to one of the registers will cause both registers to contain
the new value, regardless of the value of URSEL. Reading these
registers do not work as described in the datasheet.
Gast #273056
Lesenswert?
• ▲
▼
Hallo mmerten,

danke schonmal für diesen sehr wertvollen Hinweis! (Du ahnst ja gar
nicht, was ich schon in Handbüchern und Hilfeseiten geblättert habe...)
Hast du vielleicht noch irgendwelche Tipps zu
"zweitens" (erhält der UCSRC des Chips beim Reset womöglich einen
Startwert ungleich null?) und
"drittens"? (wie gebe ich im Simulator korrekt UART-RX-Daten ein?)

Viele Grüße,
Matthias
Gast #273058
Lesenswert?
• ▲
▼
Der Defaultwert für alle I/O-Register nach einem Reset ist im
entsprechenden Datenblatt ausführlich beschrieben. Also UART komplett
simulieren zu wollen ist doch etwas vergebene Mühe. Da müßte man ja
erste lange stimuli-file generieren, was wohl kaum sinnvoll sein
dürfte. Da ist der Test in real Hardware viel einfacher. Int-Routinen
kann man ja durch setzen der entsprechenden Flags testen.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.