Hallo zusammen, in meinem Program habe ich ein Codeabschnitt in der der Overflow-Interrupt des Timers0 stören würde. Vor Eintritt in den Codeabschnitt schalte ich diesen Interrupt aus und nach Beendigung wieder ein. Soweit ist alles klar. Wie erfahre ich den ob ein Timer0-Interrupt innerhalb des Codeabschnittes eingetreten ist? Wird der Interrupt nach dem Einschalten automatisch ausgeführt, oder geht der verloren? Brillitsch
Wenn der Timer-Interrupt ausgeschaltet ist, sollte die entsprechende Routine auch nicht aufgerufen werden, warum bist Du da mißtrauisch? Um es dennoch auszutesten, würde ich folgendes vorschlagen: /// Global folgende zwei Definitionen: int check = 0; int control = 0; /// Dein kritischer Code-Abschnitt: interrupt aus; check = 1; ... check = 0; interrupt ein; /// In der Interrupt-Service-Routine: if(check!=0) control = check; Sollte nun jemals die Interrupt-Service-Routine während Deines kritischen Codeabschnitts laufen, dann kann man dies durch Prüfen der Variable 'control' feststellen: Ist ihr Wert 1, dann ist es mindestens einmal passiert, ist er 0, dann nicht. Modifikation: /// In der Interrupt-Service-Routine: if(check!=0) control++; Damit kann man auch die Häufigkeit ermitteln. Um sicher zu gehen: /// In der Interrupt-Service-Routine: if(check!=0) if(control<MAXINT) control++; ... damit kein Überlauf passieren kann. "Wird der Interrupt nach dem Einschalten automatisch ausgeführt, oder geht der verloren?" Ich denke mal, er geht verloren (Angabe ohne Gewähr!). Gruß, Michael
also: du wirst warscheinlich nicht um 6 - 7 Befehle rumkommen Variante 1 variable 1 hoch 1 jump -> tov tov: 2 push r16 3 lds r16 variable 4 inc r16 5 sts r16 variable 6 pop r16 7 reti Variante 2 variable auf wert xx setzen 1 jump -> tov tov: 2 push r16 3 ldi r16, 0x01 4 sts r16 variable 5 pop r16 6 reti gruss
>>Wie erfahre ich den ob ein Timer0-Interrupt innerhalb des >>Codeabschnittes eingetreten ist? Wird der Interrupt nach dem >>Einschalten automatisch ausgeführt, oder geht der verloren? Tritt der Overflow während der Interruptsperre ein, so wird ein entsprechndes Flag-Bit gesetzt (TOV1 in Register TIFR). Du kannst dies testen, ist aber nicht nötig, da bei Freigabe der Interrupts durch 'sei' der Interrupt-Handler angeprungen wird.
Irgwer das ist ja sein problem.. er will nicht, dass der int angearbeitet wird, wenn er in seiner kritischen phase ist.. ich weiss nur nicht wer und wann das flag geloescht wird, dann koennte man das flag auslesen und zuruecksetzen
Hallo, danke für rege Diskussion! @Jens D. >..das ist ja sein problem.. er will nicht, dass der int angearbeitet wird, wenn er in seiner kritischen phase ist.. Ja, und zusätzlich möchte ich nach Ende der kritischen Phase testen können ob ein Interrupt anstand. @Irgwer >..Tritt der Overflow während der Interruptsperre ein, so wird ein entsprechndes Flag-Bit gesetzt (TOV0 in Register TIFR). Du kannst dies testen, ist aber nicht nötig, da bei Freigabe der Interrupts durch 'sei' der Interrupt-Handler angeprungen wird. Das ist mein Problem: TOV0 ist gesetzt. Ich könnte es also manuell abfragen? Aber wird der Interrupt-Handler nicht auch angesprungen(bei gesetztem TOV0-Bit), wenn ich nach Ende der kritischen Phase mit 'TIMSK |= 1' den Interrupt wieder freigebe?
Ich glaube fast nciht am besten schreibst du ein kleines programm udn testest es mal aus :D Wenn du es aber mit der kleinen unterbrechung machen kannst / es nicht anders geht wuerde ich die TOV int in asm schreiben geht schneller Gruss
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.