mikrocontroller.net

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


Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: risu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: risu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Freizeitbastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: risu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jonas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.