Hi,
ich mache hier gerade die ersten Schritte mit Assembler, und simuliere
auf Basis des Atmega16 im AVR-Studio folgendes Programm:
http://rafb.net/p/XtjTRG10.html
Folgendes Problem:
Wenn ich die Simulation Schritt für Schritt ablaufen lasse werden die
ersten zwei Pakete abgeschickt, aber nach dem dritten UDRE nichtmehr
sofort zurückgesetzt, womit das dritte Paket hängen bleibt.
und zwar für ~4000 Takte, und dann wird das bit aufeinmal gesetzt, und
es geht weiter.
Folgende Frage:
Ist da jetzt ein Fehler in meiner Programmierung?
Ich war gerade bei euch im Chat, und dort wurde mir gesagt, dass das
möglicherweise am Simulator liegt. So ganz kann ich das jetz aber nicht
einfach hinnehmen, weil das doch sehr lästig ist.
Also hat jemand eine Idee?
Hallo Jonas,
Dein Prozessor läuft mit 1 MHz und Due hast eine Baudrate von 2400. Ein
Bit benötigt also ~0,42ms für die Übertragung; ein Byte + 1 Start- und 1
Stopp-Bit demnach ~4,2ms. Das sind also etwa 4200 Prozessor-Takte pro
Byte!
Gruß
risu
Morgen Risu,
das würde schoneinmal erklären warums überhaupt so ist, aber es sind
auch ~4200 Takte wenn ich in den Simulator Options die Taktrate auf 8MHz
stelle. Das sind dann grob 500µs also noch weit entfernt von ~4,2ms
Danke schonmal bis hierher...
Jonas
Hallo Jonas,
wenn Du UBRR nicht änderst (müsste für 2400Bd bei 8MHz 207 sein), hast
Du bei 8MHz und UBRR=25 eine Baudrate von 19200. Ein Bit braucht also
52us, 10 Bit also 520us, wie Du selbst gesehen hast.
Der Simulator hat tatsächlich ein paar kleine Probleme, aber in diesem
Fall ist es Dein Code, der direkt zu dem beobachteten Ergebnis führt!
Viele Grüße
risu
ohaaa...*Kopf*-->*Wand*
Bleibt noch die Frage warum das zweite Paket nicht verzögert wird,
sondern direkt nach dem ersten gesendet werden kann?
Gruß
Jonas
Hallo Jonas,
Die Frage beantwortet ein Blick ins Datanblatt Atmega16 Seiten 144
(Diagramm) und 163 2. Absatz von unten.
The transmit buffer can only be written when the UDRE Flag in the UCSRA
Register is set. Data
written to UDR when the UDRE Flag is not set, will be ignored by the
USART Transmitter. When
data is written to the transmit buffer, and the Transmitter is enabled,
the Transmitter will load the
data into the transmit Shift Register when the Shift Register is empty.
Then the data will be serially
transmitted on the TxD pin.
Sendeseitig sind also 2 Register im Einsatz.
Gruß, Peter
Hallo Jonas,
> Bleibt noch die Frage warum das zweite Paket nicht verzögert wird...
Du lädst das (zunächst ja leere) UDR mit Deinem ersten Byte. Die Daten
werden sofort in das Ausgabe-Schieberegister übernommen, das ja auch
leer ist, und UDR ist wieder frei, weshalb Du Dein 2. Byte sofort in das
UDR schreiben kannst. Das 2. Byte kann aber erst aus dem UDR in das
Schieberegister geladen werden, wenn dieses leer ist. Also bleibt UDR
für das 3. Byte blockiert, bis das Schieberegister frei ist.
Viele Grüße
risu
Hallo,
Ich sollte mir das Datenblatt mal mit in die Badewanne nehmen... ;)
Danke ihr beiden :) Alleine wär ich da noch bis heute Abend
drangesessen...
Viele Grüße
Jonas
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.