mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer Interrupt mega128


Autor: Brillitsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: sous (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Irgwer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Brillitsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jens D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.