Forum: Mikrocontroller und Digitale Elektronik Timer Interrupt mega128


von Brillitsch (Gast)


Lesenswert?

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

von sous (Gast)


Lesenswert?

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

von Jens D. (Gast)


Lesenswert?

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

von Irgwer (Gast)


Lesenswert?

>>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.

von Jens D. (Gast)


Lesenswert?

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

von Brillitsch (Gast)


Lesenswert?

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?

von Jens D. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.