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
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.
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
Zu zweitens: sehr unwahrscheinlich, alle Register außer den 32 Arbeitsregistern und dem SRAM werden beim Chipreset auf 0b00000000 initialisiert.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.