Forum: Mikrocontroller und Digitale Elektronik ATMega8, UART, MIDI und jede Menge Stress :)


von Matthias Hullin (Gast)


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

von mmerten (Gast)


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.

von Matthias Hullin (Gast)


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

von TravelRec. (Gast)


Lesenswert?

Zu zweitens: sehr unwahrscheinlich, alle Register außer den 32
Arbeitsregistern und dem SRAM werden beim Chipreset auf 0b00000000
initialisiert.

von mmerten (Gast)


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.

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.