Forum: Mikrocontroller und Digitale Elektronik unterbricht ein zweiter Interrupt einen anderen ?


von Max K. (madget)


Lesenswert?

Tja wußte nicht so recht wie ichs beschreiben sollte.

Ich möchte in bascom einen timerinterrupt machen der taster ausliest
(ca 5 mal pro sek) und gleichzeitig ein software pwm auch mit
timerinterupt laufen lassen. nun meine frage: kann der pwm interrupt
den interrupt für die taster unterbrechen? denn das möchte ich ja
ansonsten wirds warscheinlich nen bisschen flackern (pwm steuert leds
an).

wäre nett wenn mich da jemand aufklären könnte nach welchen prioritäten
das abgearbeitet wird.(müsste doch in jeder sprache gleich sein, oder
?)

mit nem minimalprogramm hats funkltioniert aber wenn mein programm
größer wird wärs zum programmieren ganz praktisch zu wissen wies genau
funktioniert.

also: bin dankbar für jede antwort

von anm (Gast)


Lesenswert?

hallo

welchen controller verwendest du denn? meine glaskugel ist verstaubt
:D

mfg anm

von Max K. (madget)


Lesenswert?

ach ja die glaskugel :)
nen maga8 hab ich

von Max K. (madget)


Lesenswert?

nein, natürlich mega8

von Wolle (Gast)


Lesenswert?

Zunächsteinmal sind Interrupts hardwareabhängig. In der Auslegung wird
die Priorität eines Interrupts entschieden.
Bei den AVRs sind alle Interrupts gleichwertig. D.h. alle Interrupts
können andere Interrupts beeinflussen.
Per Software hast du aber die Möglichkeit, generell Interupts zu
verhindern oder auch nur einzelne Interrupts zu unterdrücken. Dazu gibt
es bestimmte Befehle (z.B. sei, cli etc.)
Welcher Interrupt wie ein- oder ausgeschaltet werden kann, steht in der
Befehlsliste der entsprechenden Controller.

von anm (Gast)


Lesenswert?

hmmm mega8 klingt gut!

die interrupts werden immer aneinandergereiht! also immer einer fertig
abgearbeitet und dann der nächste (nach der priorität - siehe
interruptvektoren)....
ich bin mir nicht sicher ob man es umstellen kann! müsste im datenblatt
schaun - aber du könntest mich per icq (163582709) kontaktieren - dann
helf ich dir gerne weiter

mfg andi

von anm (Gast)


Lesenswert?

folgender auszug aus dem datenblatt vom ATmega8:

When an interrupt occurs, the Global Interrupt Enable I-bit is cleared
and all interrupts
are disabled. The user software can write logic one to the I-bit to
enable nested interrupts.
All enabled interrupts can then interrupt the current interrupt
routine. The I-bit is
automatically set when a Return from Interrupt instruction – RETI – is
executed.

also kannst du das gobale interruptflag in deinem pwm interrupt setzen
und dadurch das taster auslesen aktivieren! aufpassen musst du vor
allem bei den prioritäten!!
vergiss auch nicht den taster zu entprellen, da ansonsten die
interruptroutine zu oftg ausgeführt werden könnte!

mfg andi

von crazy horse (Gast)


Lesenswert?

es gibt keine Priorität beim AVR - allenfalls in dem Sinne, dass bei
gleichzeitig auftretenden eine Reihenfolge eingehalten wird. Läuft
einmal eine ISR, kann ein anderer Int diese erstmal nicht unterbrechen,
es sei denn, man programmiert dieses explizit, nicht ganz einfach, geht
aber.
Einfacher: Int-Programme kurz halten.

von anm (Gast)


Lesenswert?

@crazy horse: die "niederwertigen" - also die interrupts mit niedriger
adresse werden aber zuerst ausgeführt wenn 2 zugleich auftreten sollten!
ich hab dies einmal mit timern ausprobiert die vollkommen zugleich
übergelaufen sind - immer der mit der niedrigeren adresse hatte
vorrang! und dass es so schwierig geht in einem interrupt einen
weiteren interrupt auszuführen stimmt schon! man muss halt
rücksprungadresse, sreg usw. sichern und dann das globale interruptflag
setzen und sonst noch einiges beachten! möglich ist es aber auch alle
fälle!!

@threateröffner: warum muss der taster alle 5ms ausgelesen werden? dies
"überfordert" den controller ziemlich und ist nicht der sinn von
interrupts! wie wärs wenn du den taster auf steigende flanke triggerst?
dann merkst du wenn der taster gedrückt wird! du könntest sogar dann den
interrupt auf fallende flanke umstellen und dadurch beim loslassen einen
interrupt erhalten! allerdings muss dann der taster super entprellt
sein!

mfg andi

von crazy horse (Gast)


Lesenswert?

"allenfalls in dem Sinne, dass bei gleichzeitig auftretenden eine
Reihenfolge eingehalten wird" hatte ich geschrieben, lies es dir
nochmal durch :-)
Und zur eigentlichen Frage: hänge doch die Tasterabfrage ans Ende des
Timerints für die Software-PWM und alle Probleme verschwunden.

von anm (Gast)


Lesenswert?

ups sorry crazy horse - hab deinen text falsch interpretiert - tut mir
leid :-( :-(
hab das echt nicht überzuckert :-)

mfg andi

von Max K. (madget)


Lesenswert?

tja also erst mal danke für die schnellen antworten. ich werde erst mal
versuchen den interrupt so kurz wie möglich zu halten.

ach ja und der "threateröffner" ;) möchte nicht alle 5ms sondern 5
mal in der sekunde den taster bzw. 3 von der sorte auslesen um eben das
entprellen zu umgehen. wenns nur ein taster wäre wäre das aber wohl die
elegantere lösung den direkt auf nen interrupt zu legen.

wobei, man könnte doch auch alle drei taster mit jeweils dem
interrupteingang und mit nem signaleingang verbinden, oder ? wie kann
ich das denn hardwareseitig  machen ?

von anm (Gast)


Lesenswert?

hardwareseitig dürfte das kleinste problem sein! willst du nicht in den
chat kommen um zu diskutieren?

mfg andi

von Peter D. (peda)


Lesenswert?

@Andi

> warum muss der taster alle 5ms ausgelesen werden? dies
> "überfordert" den controller ziemlich und ist nicht der sinn von
> interrupts!

Das ist Quatsch mit Soße.

5ms sind aufm ATMega8 bei 16MHz riesige 80.000 Zyklen !

Ich habe schon auf nem 8051 viel kürzere Interrupts gemacht (30µs mit
DS80C320 bei 24MHz).

Im  Gegenteil, es ist der Sinn eines Interrupts, schnell und oft auf
irgendwas zu reagieren.

5ms ist auch ein sehr guter Wert, um darin die Tastenerkennungs- und
Entprellroutine mit 4-fach Abfrage für bis zu 8 Tasten auszuführen,
kostet etwa 20 Zyklen also 0,025% CPU-Zeit.


Überfordern kann man nur dann, wenn man in Interrupts riesige
Wartezeiten mit einfügt.
Und dann ist es völlig egal ob 30µs, 5ms oder 1s, Wartezeiten in
Interrupts machen Dir jedes Programm kaputt.


Peter

von dunkelmann (Gast)


Lesenswert?

zum Thema Software PWM und Taster:

Ich hab selbst schon einige Software-PWM mit Taster implementiert (auf
Atmel Tiny12/15 etc.. in Assembler), da sieht man kein flackern wenn
Tasten gedrückt werden.

dkm
www.loetstelle.net

von Thomas K. (thkais)


Lesenswert?

Die Abfrage der Taster in die PWM-Routine mit hineinlegen. Da wird er
zwar öfters abgefragt, aber das sollte nicht schaden. (Gilt natürlich
nur, wenns um die reine Abfrage geht - die Auswertung darf nicht im
Interrupt gemacht werden, sondern muß im Hauptprogramm geschehen)

von Looser (Gast)


Lesenswert?

Geiler satz:

All enabled interrupts can then interrupt the current interrupt routine

von Looser (Gast)


Lesenswert?

Geiler Satz:

All enabled interrupts can then interrupt the current interrupt
routine

von Werner B. (Gast)


Lesenswert?

> All enabled interrupts can then interrupt the current interrupt
> routine

<joke>
Wobei sich das auch auf die momentan aktive interrupt routine bezieht.
 Sozusagen ein "Rekursiver Interrupt"  ;-)
</joke>

Und "Rekursiver Interrupt"!
Das ist etwas was man in 99,99999% aller Fälle vermeiden will/muss,
sonst ist der stack in lichtgeschwindigkeit übergelaufen.

von ftur (Gast)


Lesenswert?

klare antwort: JA, wenn der gerade ausgeführte interrupt (der global
interrupts am anfang bekanntlich sperrt) via 'sei' global interrupts
vorzeitig wieder erlaubt hat (was ja sonst erst mit reti der fall ist)
UND die priorität des antragstellers höher ist (avr-interrupts sind
eben NICHT gleichwertig).

von crazy horse (Gast)


Lesenswert?

das ist schlicht und ergreifend einfach nur falsch.
Wird in einer ISR das I-Bit wieder gesetzt, kann jeder andere Int die
laufende ISR unterbrechen (und tut es auch, Priorität spielt dafür
keine Rolle). Stehen mehrere Ints zum Zeitpunkt der Freigabe an, greift
die Ausführungsreihenfolge (Int0, Int1 usw)
Eine echte Priorisierung geht nach folgendem Schema:
In jeder ISR dürfen nur die Ints freigegeben bleiben, die eine höhere
Priorität haben sollen, alle anderen müssen gesperrt werden, also
Einstellung über GIMSK, TIMSK usw. Anschliessend kann mit sei innerhalb
der ISR freigegeben werden. Vor Ende der ISR müssen dann natürlich die
bis dahin gesperrten, also mit kleinerer Priorität eingestuften, auch
wieder freigeben werden. Dazu zu jeder ISR die entsprechende Sicherung
von SREG und benutzen Registern.
Alles viel Aufwand und fehlerträchtig, lieber die Finger davon lassen,
wenn es nicht unbedingt nötig ist. Meist lässt sich das machen, ich
hatte noch kein3e Anwendung, wo es wirklich unabdingbar gewesen wäre.
Laufzeiten kurz halten, zeitintensive Sachen in die main auslagern, nur
über flags anzeigen, dass dieser Prozess zur Verarbeitung ansteht.

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.