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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren