Forum: Compiler & IDEs ISR Abarbeitung nach cli, sei


von _Nick (Gast)


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

: Gesperrt durch Moderator
von Andreas K. (a-k)


Lesenswert?

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.

von _Nick (Gast)


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

von Andreas K. (a-k)


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.

von _Nick (Gast)


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?

von Andreas K. (a-k)


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.

von _Nick (Gast)


Lesenswert?

hmm daran hab ich nicht gedacht,
also einfach
UCSR1A=0x00;
UCSR1B=0x00;

und nach 200ms wieder zurück.

danke werd ich mal versuchen

von Andreas K. (a-k)


Lesenswert?

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.

von _Nick (Gast)


Lesenswert?

hilft das denn wirklich weiter? oder ist solange der RX verbunden ist, 
nicht doch wieder das Zeichen im Buffer?

von Andreas K. (a-k)


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.

von Karl H. (kbuchegg)


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.