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
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
> 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.
hmm daran hab ich nicht gedacht, also einfach UCSR1A=0x00; UCSR1B=0x00; und nach 200ms wieder zurück. danke werd ich mal versuchen
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.
hilft das denn wirklich weiter? oder ist solange der RX verbunden ist, nicht doch wieder das Zeichen im Buffer?
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.