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
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.
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.
>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
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).
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.
"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)"
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.