Hallo,
eine Frage hätte ich an die Profis hier:
Wenn ich ein Zeichen über die Serielle empfange und dann mit cli(); die
Interrupt deaktiviere, wird dann ein Interrupt ausgelöst wenn ich die
Interruptus wieder aktiviere, sei(); und in der Zwischenzeit, also so
lange cli(); ein Zeichen auf der seriellen gekommen ist? Also die
Gegenstelle was gesendet hat? Oder wird das Zeichen dann Verworfen oder
geht verloren?
Danke
Nick
Geht nichts verloren, der Interrupt kommt durch sobald er eingeschaltet
wird. Geht nur was verloren, wenn in der Zwischenzeit mehr Bytes
eintrudeln, als in den Empfangspuffer der UART passen.
> oh und wie mache ich es dann das ich die zeichen verliere?> würde gerne die zeichen verlieren in der zeit darum wollte ich ISR> ausschalten
Oha, öfter mal was neues. So herum kommt der Wunsch selten.
Aber was stört dich das? Der Puffer in der UART ist nicht grad gross
(2-3 Zeichen) und wenn der voll ist gehen wie gewünscht die Zeichen
verloren. Netterweise wird das im Status vermerkt (overflow), so dass du
das zum Anlass nehmen kannst, denn verbliebenen Rest auch noch zu
verwerfen.
Aber ich glaube es wäre hilfreich, mal mehr zu verraten. Klingt nämlich
etwas schräg.
hmm ich bekomme ein paar Zeichen und wenn ein Zeichen da ist sende ich
per CAN ne Message ab.
Die Zeichen kommen von einem anderen uC die von Tasten getriggert sind,
auf dieses System hab ich keinen weiteren einfluss.
Nun ist aber auch das Tastenprellen das ich filtern wollte, nachdem ich
was empafangen habe, einfach 200ms warten und dann frühestens das
nächste Empfangen. darum ISR aus dachte ich. Wie kann ich das Flag
löschen? damit der ISR nicht abgearbeitet wird?
Du kannst die Interrupt-Generierung in der UART abschalten. Irgendwo
musst du den UART-Receive-Interrupt ja mal eingeschaltet haben, also
sollte dir das Bit bekannt sein.
Oder ganz ohne UART-Receive-Interrupt arbeiten und schlicht das
entsprechende Flag pollen. Klingt hier irgendwie sinnvoller.
Ich dachte eher an RXCIE. Die UART ganz abzuschalten kann ich nicht
empfehlen, denn wenn du dann zufällig mitten in einem Char einschaltest,
gibt's Schrott.
Was glaubst du denn passiert, wenn mitten in der Übertragung eines Bytes
der Receiver eingeschaltet wird? Die erste negative Flanke interpretiert
er als Startbit, und was danach kommt sind die Daten.
Ja, von den Daten ist was im Puffer. Na und? Hast du Angst, der fliegt
dir um die Ohren weil er platzt? Räum den Puffer auf bevor du die
Interrupts wieder einschaltest und fertig.
_Nick wrote:
> hmm ich bekomme ein paar Zeichen und wenn ein Zeichen da ist sende ich> per CAN ne Message ab.> Die Zeichen kommen von einem anderen uC die von Tasten getriggert sind,> auf dieses System hab ich keinen weiteren einfluss.> Nun ist aber auch das Tastenprellen das ich filtern wollte, nachdem ich> was empafangen habe, einfach 200ms warten und dann frühestens das> nächste Empfangen. darum ISR aus dachte ich. Wie kann ich das Flag> löschen? damit der ISR nicht abgearbeitet wird?
Wie wäre es mit:
Zeichen wird empfangen. In dem Moment startet ein Timer der auf
200 ms hochzählt. Trifft in der Zwischenzeit ein Zeichen
ein, so wird es ganz einfach verworfen. Erst nach ablauf des
Timers, also nach 200ms wird ein empfangenes Zeichen wieder
bearbeitet.
Klingt auf jeden Fall einfacher als diese Klimmzüge mit
UART aus / Interrupt ein/aus.