ASM: Mega328P und das UCSR0A Register

OP #6644415
Lesenswert?
• ▲
▼
Hallo,

Ich habe gerade ein Problem mit dem Verständnis von dem UCSR0A Register, 
speziell mit dem TXC0 Bit.

Nach meiner Lesart aus dem Datenblatt wird TXC0 dann gesetzt wenn aus 
dem Shift-Register alles heraus geshiftet wurde und auch nichts mehr im 
Sendepuffer ist.

Jetzt habe ich aber festgestellt das dem irgendwie nicht so ist. Es 
liegen noch zu sendende Daten an wenn TXC0 schon gesetzt wird.

Als Beispiel habe ich ein Programm erstellt und mit dem LogikAnalysator 
verfolgt. in den Anhängen.

Das Programm setzt in der Hauptschleife fortlaufend Portbit B0 und in 
der ISR wird es dann gelöscht bis die Hauptschleife es wieder setzt.

Im ISR wird die Zeichenfolge "Hello World" gesendet und eigentlich noch 
per TXC0 gewartet das alles "raus" ist. Dem ist aber irgendwie nicht so 
wie man am LA-Bild (Channel 2 markiert den Start und das Ende der ISR) 
sehen kann wird die ISR verlassen noch bevor wirklich alles gesendet 
wurde. Es sind hier 2 Bytes offen, die zwar gesendet werden aber 
irgendwie hab ich das mit dem TXC0-Bit offenbar falsch verstanden.
Bitte um Erhellung
Angehängte Dateien:
Gast #6644423
Lesenswert?
• ▲
▼
Björn W. schrieb:
> Im ISR wird die Zeichenfolge "Hello World" gesendet

In der ISR tut man möglichst nichts Zeitaufwendiges. Wenn
du in der ISR einen String ausgibst wartest du die längste
Zeit nur darauf dass der nächste Char gesendet wird. Dein
Controller verblödet derweil.

Nein das tut man nicht!

Ausgeben mit ISR maximal ein Zeichen, aber auch das ist in
den meisten Fällen sinnlos.
Gast #6644434
Lesenswert?
• ▲
▼
Björn W. schrieb:

> Nach meiner Lesart aus dem Datenblatt wird TXC0 dann gesetzt wenn aus
> dem Shift-Register alles heraus geshiftet wurde und auch nichts mehr im
> Sendepuffer ist.

Ja.

> Jetzt habe ich aber festgestellt das dem irgendwie nicht so ist. Es
> liegen noch zu sendende Daten an wenn TXC0 schon gesetzt wird.

Das sehr wahrscheinlich daran, dass du das Bit vor Sendebeginn nicht 
resettet hattest und auch keinen Interrupthandler für den entsprechenden 
Interrupt hast (der das automagisch mit erledigen würde).
Gast #6644439
Lesenswert?
• ▲
▼
"The TXCn flag bit is automatically cleared when a transmit complete 
interrupt is executed, or it can be cleared by writing a one to its bit 
location. The TXCn flag can generate a transmit complete interrupt
(see description of the TXCIEn bit)"
#6644449
Lesenswert?
• ▲
▼
Hatte ich das falsch verstanden? Die Isr soll alles senden bevor sie 
verlassen wird? Genau das hat sie getan - sich beendet nachdem sie alle 
Zeichen losgeworden ist. Soll sie nun auch noch das System stoppen bis 
die wirklich raus sind wäre das Urdie Flag brauchbar das wird High wenn 
wirklich alles raus ist.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.