Forum: Mikrocontroller und Digitale Elektronik AVR Simulator ungenau oder falsch programmiert?


von Jonas (Gast)


Lesenswert?

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?

von risu (Gast)


Lesenswert?

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

von Jonas (Gast)


Lesenswert?

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

von risu (Gast)


Lesenswert?

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

von Jonas (Gast)


Lesenswert?

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

von Freizeitbastler (Gast)


Lesenswert?

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

von risu (Gast)


Lesenswert?

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

von Jonas (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.