ISR Abarbeitung nach cli, sei

Gast #692260
Lesenswert?

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
#692297
Lesenswert?

> 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.
Gast #692306
Lesenswert?

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?
#692310
Lesenswert?

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.
#692398
Lesenswert?

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.
#692471
Lesenswert?

_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.
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.