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
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.