Forum: Mikrocontroller und Digitale Elektronik ASM: Mega328P und das UCSR0A Register


von Björn W. (bwieck)


Angehängte Dateien:

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

von Planloser Assembler (Gast)


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.

von Björn W. (bwieck)


Lesenswert?

Planloser Assembler schrieb:
> Björn W. schrieb:
>> Im ISR wird die Zeichenfolge "Hello World" gesendet
>
> In der ISR tut man möglichst nichts Zeitaufwendiges.

Das weis ich, aber das geht an der Frage komplett vorbei.

von Achim H. (pluto25)


Lesenswert?

>Björn W. schrieb:die ISR verlassen noch bevor wirklich >alles 
gesendet wurde.
Ist das nicht Sinn der Sache? Das der MC alles mögliche erledigen kann 
während das Byte rausgeht und dann wieder in die Isr springt um das 
nächste zu senden. Dazu wäre jedoch das UDRE bit?

: Bearbeitet durch User
von c-hater (Gast)


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

von Planloser Assembler (Gast)


Lesenswert?

Björn W. schrieb:
> Das weis ich, aber das geht an der Frage komplett vorbei.

Auf unsinniges Vorgehen braucht man keine Antworten bzw.
Lösungsvorschläge geben.

von John Doe (Gast)


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)"

von Achim H. (pluto25)


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.

von Björn W. (bwieck)


Lesenswert?

c-hater schrieb:

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

DAS wars. Ich hab es vorher nicht gesetzt um es damit zu löschen..

Danke dir c-hater

von Björn W. (bwieck)


Lesenswert?

Nur um das mal zu Erläutern: Es war ein Beispielprogramm um das 
Verhalten darzulegen.
Und offenbar hat ausser c-hater das keiner kapiert...

Ist schon echt schwierig hier mal Testcode hinzulegen ohne dafür nicht 
gleich gedisst zu werden.

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.