www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schleifen im Interrupt


Autor: Jürgen Hems (misteret)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo! Also ich habe mal in einem Praktikum beigebracht bekommen, im 
Interrupt möglichst wenig zeitaufwändige Dinge reinzuprogrammieren.

Ich habe hier jetzt einen OV-Interrupt, der jede Millisekunde auslöst. 
Ich will die Laufvariable i hochzählen und auf i<255 prüfen. Wenn 
i>=255, soll ein Flag gesetzt werden, was sich dann aufs main-Programm 
auswirkt.

Meine Frage:
Zähle ich im interrupt nur die Variable hoch, und Prüfe dann im main auf 
i<255?? Oder kann ich die Prüfung auch noch in der ISR machen?

Hier der Quelltext:
  mov A,i      ;i in Akku
  cjne A,255d,UNGLEICH;Test auf Gleichheit
   ;i=255, also wurde soeben der 256. Messwert addiert
  setb ausgabe   ;ausgabe-bit auf 1 setzen
  mov i,#0       ;i auf 0 setzen
  jmp ENDE
 UNGLEICH: ;wenn i != 255 (also kleiner)
  mov A,i
  add A,#1  
  mov i,A
 ENDE: 

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wozu ein Vergleich. Wenn du ein Byte hochzählst kommt es bei 255+1 zu 
einem Überlauf. Im allgemeinen wird das Carry-Flag gesetzt und das Byte 
ist wieder Null.

>ähle ich im interrupt nur die Variable hoch, und Prüfe dann im main auf
>i<255?? Oder kann ich die Prüfung auch noch in der ISR machen?

Wenn du in deiner ISR nichts weiter drin hast ist es eigentlich egal.

MfG Spess

Autor: Иван S. (ivan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jürgen Hems schrieb:
> Hallo! Also ich habe mal in einem Praktikum beigebracht bekommen, im
> Interrupt möglichst wenig zeitaufwändige Dinge reinzuprogrammieren.

Ja, das hat den Sinn, daß sonst (je nach Architektur) andere Interrupts, 
die während der Abarbeitung der Serviceroutine des Ersteren auftreten, 
verloren gehen könnten.

> Ich habe hier jetzt einen OV-Interrupt, der jede Millisekunde auslöst.
> Ich will die Laufvariable i hochzählen und auf i<255 prüfen.

Du kannst Dir, mit Kenntnis der Taktfrequenz, Kenntnis der zeitlichen 
Länge der ISR (Laufzeit der Assemblerbefehle addieren), Auftreten 
anderer Interrupts und deren Länge, ausrechnen ob es sich ausgeht.

> Zähle ich im interrupt nur die Variable hoch, und Prüfe dann im main auf
> i<255?? Oder kann ich die Prüfung auch noch in der ISR machen?

Besser ist das (es ausserhalb der ISR zu machen).

Gruß, Iwan

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Jürgen Hems (misteret)

>i<255?? Oder kann ich die Prüfung auch noch in der ISR machen?

Kannst und solltest du. Siehe Interrupt.

MFG
Falk

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Prüfen ist so kurz, dass du es im Interrupt machen kannst, und zwar 
so, dass du bei 0 (was 256 entspricht) ein Bit setzt, welches dem 
Hauptprogramm mitteilt, dass der Wert erreicht ist.
Der 8051 bietet dafür ja den JZ- bzw. JNZ-Befehl.

Also im Interrupt:
...             ;Variable hochzählen
mov a,variable  ;Variable auf 256 prüfen
jnz INT_ENDE    ;Wenn Variable kleiner als 256, Interrupt verlassen
setb complete   ;ansonsten complete-Flag setzen
...

Denk an Sichern der verwendeten Register (PUSH/POP).
Ob der Sonderfall variable=0 (nicht 256) eintreten kann, hängt von 
deiner restlichen Software ab.

Generell sollte, wie du richtig gesagt hast, jeder Interrupt so kurz wie 
möglich sein. Schleifen sind also zu vermeiden, was auch in nahezu 100% 
aller Fälle geht.

Ralf

Autor: mik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
auf Deinen asm code kann ich nicht eigehen, aber hier
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
wird das selbe mit C besprochen. Dort wird auch die Prüfung im main und 
nicht in der ISR gemacht. (Obwohl auch im ISR kurz geprüft wird und dann 
erst hochgezählt wird). es ist wahrscheinlich schnurz, wichtig ist nur 
das die eigentliche routine die gestartet werden soll nicht in der ISR 
steht.

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.