Forum: Mikrocontroller und Digitale Elektronik Interrupt Prioritäten


von Ingo L. (grobian)


Lesenswert?

Wenn sich das Programm in der Unteruptroutine INT1(hohe Priorität) 
befindet kann dann innerhalb dieser Routine eine weiterer Interrupt 
aufgerufen werden der eine niedrigere Priorität hat (Timer0 / bzw. Timer 
1)
zum abspielen der Wave- Dateien, oder sind weitere Interrupts erst dann 
möglich wenn INT1 abgearbeitet ist ?


ISR(INT1_vect)
{
 if (!( PINC & (1<<PINC2))) // PINC2 LOW   DIL 1 
           {
          AMP_ON;
             output=1; //WAVE
             GELB_ON;

             PlayWave("WAVE3.wav");

             GELB_OFF;
             AMP_OFF;
        }
      else
        {
          AMP_ON;
             output=0; //DIN
             ROT_ON;

             PlayWave("WAVE3.wav");

             ROT_OFF;
             AMP_OFF;
        }



}

von Peter II (Gast)


Lesenswert?

um welche CPU geht es überhaupt?

von (prx) A. K. (prx)


Lesenswert?

Ist PlayWave eine Routine, die das File abspielt? Interrupt-Handler 
sollten kurz sein. Aktionen auslösen, beispielsweise indem Flags 
gesetzt werden, nicht selbst längere Aktionen durchführen.

von Ingo L. (grobian)


Lesenswert?

ohh sorry Mega32

von Peter II (Gast)


Lesenswert?

Ingo Laabs schrieb:
> ohh sorry Mega32

seit wann soll denn der Mega32 irq Prioritäten haben?

von Ingo L. (grobian)


Lesenswert?

PlayWave ist eine Routine die eine Wave-Datei abspielt in der die Int. 
der Timer benutzt werden.
Ich benutze den INT-Eingang um eine laufende WAVE Datei zu unterbrechen 
um eine Ansage machen zu können die als Wave vorliegt.

von J.-u. G. (juwe)


Lesenswert?

irq Prioritäten hin oder her...

Das Abspielen von wav-Dateien hat in einer ISR eigentlich nichts zu 
suchen.

von Nino K.L. (Gast)


Lesenswert?

Servus Ingo,

ich bin ja kein Profi, aber soweit ich gelernt habe, sollte man es 
grundsätzlich vermeiden, daß eine Interruptroutine von einem anderen 
Interrupt unterbrochen wird. Man kann sich da ziemlich verhaspeln.

Wenn man sich an diese Voraussetzung halten will (Ich habe bis jetzt 
noch jede Aufgabe so lösen können), dann schaltet man am Beginn jeder 
Interruptroutine die Interrupts aus (cli) und am Ende wieder ein (sei).

lg, Nino.

von spess53 (Gast)


Lesenswert?

Hi

>seit wann soll denn der Mega32 irq Prioritäten haben?

Selbstverstänlich gibt es Interruptprioritäten. Die haben aber nichts 
mit 'Unterbrechbarkeit' von Interrupts zu tun, sondern mit der 
Reihenfolge der Abarbeitung gleichzeitig anstehender 
Interruptanforderungen.

MfG Spess

von (prx) A. K. (prx)


Lesenswert?

Nino K.L. schrieb:

> ich bin ja kein Profi, aber soweit ich gelernt habe, sollte man es
> grundsätzlich vermeiden, daß eine Interruptroutine von einem anderen
> Interrupt unterbrochen wird. Man kann sich da ziemlich verhaspeln.

Nicht grundsätzlich. Aber bei AVRs, die von Haus aus keine über 
Priorisierung verschachtelbaren Interrupts unterstützen, ist das nicht 
ratsam. Bei andere Controller mit aufwendigeren Interrupt-Systemen sind 
priorisiert verschachtelte Interrupts völlig normal.

> Wenn man sich an diese Voraussetzung halten will (Ich habe bis jetzt
> noch jede Aufgabe so lösen können), dann schaltet man am Beginn jeder
> Interruptroutine die Interrupts aus (cli) und am Ende wieder ein (sei).

Genau das sollte man nicht tun, denn das macht der Controller sowieso 
schon selbst. Und insbesondere ein abschliessendes sei() kann die exakt 
gegenteilige Wirkung entfalten, weil zwischen dem SEI und dem Return 
noch etliche Befehle stehen, die eben dann unterbrochen werden können 
und dann exakt diese unerwünschte Verschachtelung bewirken.

von Ingo L. (grobian)


Lesenswert?

spess53 schrieb:
> Hi
>
>>seit wann soll denn der Mega32 irq Prioritäten haben?
>
> Selbstverstänlich gibt es Interruptprioritäten. Die haben aber nichts
> mit 'Unterbrechbarkeit' von Interrupts zu tun, sondern mit der
> Reihenfolge der Abarbeitung gleichzeitig anstehender
> Interruptanforderungen.
>
> MfG Spess

also kann ich den laufenden Int1 unterbrechen ..oder ?

von (prx) A. K. (prx)


Lesenswert?

Ingo Laabs schrieb:

> also kann ich den laufenden Int1 unterbrechen ..oder ?

Man kann, aber man sollte nicht. Und schon gleich garnicht bei 
deinem Interrupt-Modell, denn das ist schon im Ansatz verkehrt.

von spess53 (Gast)


Lesenswert?

Hi

>also kann ich den laufenden Int1 unterbrechen ..oder ?

Man kann, sollte es aber vermeiden. Besonders wenn man so etwas, wie du, 
erst erfragen muss. Und wie schon gesagt, ist das Abspielen von Waves in 
einer Interruptroutine das Dümmste, was man machen kann.

Such dir einen anderen Weg.

MfG Spess

von Ingo L. (grobian)


Lesenswert?

spess53 schrieb:
> Hi
>
>>also kann ich den laufenden Int1 unterbrechen ..oder ?
>
> Man kann, sollte es aber vermeiden. Besonders wenn man so etwas, wie du,
> erst erfragen muss. Und wie schon gesagt, ist das Abspielen von Waves in
> einer Interruptroutine das Dümmste, was man machen kann.
>
> Such dir einen anderen Weg.
>
> MfG Spess

 da wäre ja nur noch die Möglichkeit innerhabl des Abspielens der 
WAVE-Datei ständig den PIN von Int1 abzufragen (Int natürlich dann lahm 
gelegt)

von Peter D. (peda)


Lesenswert?

Nino K.L. schrieb:
> dann schaltet man am Beginn jeder
> Interruptroutine die Interrupts aus (cli) und am Ende wieder ein (sei).

Super Tip und dadurch gibts nen Stacküberlauf.
CLI/SEI im Interrupt ist Pfusch!

In einem Interrupthandler macht man nur das, was explizit im Datenblatt 
steht.
Ansonsten gilt:
Hände weg von der Interruptlogik!


Peter

von (prx) A. K. (prx)


Lesenswert?

Ingo Laabs schrieb:

>  da wäre ja nur noch die Möglichkeit innerhabl des Abspielens der
> WAVE-Datei ständig den PIN von Int1 abzufragen (Int natürlich dann lahm
> gelegt)

Entweder dies, oder der Interrupt-Handler setzt ein Flag, welches in der 
Routine gelegentlich abgefragt wird.

Spielt der AVR die WAVs selber ab, oder spricht er dazu einen externes 
IC an? In letzterem Fall könnte die Unterbrechung der Abspielroutine 
ohnehin recht problematisch sein.

von Peter D. (peda)


Lesenswert?

spess53 schrieb:
> Selbstverstänlich gibt es Interruptprioritäten. Die haben aber nichts
> mit 'Unterbrechbarkeit' von Interrupts zu tun, sondern mit der
> Reihenfolge der Abarbeitung gleichzeitig anstehender
> Interruptanforderungen.

Das nennt sich dann aber bei MCs, die wirklich Prioritätslevel haben, 
nicht Priorität, sondern Polling-Sequenz.

Z.B. 8051-Datenblatt:

"A low-priority interrupt can be interrupted by a high-priority
interrupt but not by another low-priority interrupt. A high-priority
interrupt can not be interrupted by any other interrupt
source.

If two requests of different priority levels are received 
simultaneously,
the request of higher priority level is serviced. If
requests of the same priority level are received simultaneously,
an internal polling sequence determines which
request is serviced."


Peter

von Ingo L. (grobian)


Lesenswert?

spess53 schrieb:
> Hi
>
>>also kann ich den laufenden Int1 unterbrechen ..oder ?
>
> Man kann, sollte es aber vermeiden. Besonders wenn man so etwas, wie du,
> erst erfragen muss. Und wie schon gesagt, ist das Abspielen von Waves in
> einer Interruptroutine das Dümmste, was man machen kann.
>
> Such dir einen anderen Weg.
>
> MfG Spess

 da wäre ja nur noch die Möglichkeit innerhabl des Abspielens der 
WAVE-Datei ständig den PIN von Int1 abzufragen (Int natürlich dann lahm 
gelegt)

A. K. schrieb:
> Ingo Laabs schrieb:
>
>>  da wäre ja nur noch die Möglichkeit innerhabl des Abspielens der
>> WAVE-Datei ständig den PIN von Int1 abzufragen (Int natürlich dann lahm
>> gelegt)
>
> Entweder dies, oder der Interrupt-Handler setzt ein Flag, welches in der
> Routine gelegentlich abgefragt wird.
>
> Spielt der AVR die WAVs selber ab, oder spricht er dazu einen externes
> IC an? In letzterem Fall könnte die Unterbrechung der Abspielroutine
> ohnehin recht problematisch sein.

der AVR spielt die WAVE von einer SD-Card ab

von Peter II (Gast)


Lesenswert?

Peter Dannegger schrieb:
> In einem Interrupthandler macht man nur das, was explizit im Datenblatt
> steht.

Wo steht denn im Datenblatt was ich im Interrupthandler machen darf? Ich 
darf doch wohl jeden ASM befehl ausführen den es gibt. Und PlayWave ist 
auch nur eine Sammlung von ASM befehlen.

Wenn man weiss was man macht, muss man sich an überhaupt nichts halten.

In diesen Fall macht es wirklich keinen sinn die Wave Datei im 
Interrupthandler abzuspielen aber als Begründung das Datenblatt zu 
erwähnen finde ich ein wenig merkwürdig.

von (prx) A. K. (prx)


Lesenswert?

Ingo Laabs schrieb:

> der AVR spielt die WAVE von einer SD-Card ab

Was bedeutet, dass du dann ab und zu mitten drin im SPI Interface 
Protocoll der SD-Card per Interrupt wiederum neu die SD-Card ansprichst 
und das ganze Protokoll völlig durcheinander bringst. Es sei denn du 
sicherst alle solche Aktivitäten in der Routine wiederum mit einer 
save-interrupt-flag + disable-interrupt - restore-interrupt-flag Klammer 
ab. Kurz: Vergiss es, der Ansatz ist Unfug.

von Ingo L. (grobian)


Lesenswert?

A. K. schrieb:
> Ingo Laabs schrieb:
>
>> der AVR spielt die WAVE von einer SD-Card ab
>
> Was bedeutet, dass du dann ab und zu mitten drin im SPI Interface
> Protocoll der SD-Card per Interrupt wiederum neu die SD-Card ansprichst
> und das ganze Protokoll völlig durcheinander bringst. Es sei denn du
> sicherst alle solche Aktivitäten in der Routine wiederum mit einer
> save-interrupt-flag + disable-interrupt - restore-interrupt-flag Klammer
> ab. Kurz: Vergiss es, der Ansatz ist Unfug.

also den PIN ständig abfragen ohne Interrupt

von (prx) A. K. (prx)


Lesenswert?

Ingo Laabs schrieb:

> also den PIN ständig abfragen ohne Interrupt

Wdh: "Entweder dies, oder der Interrupt-Handler setzt ein Flag, welches 
in der Routine gelegentlich abgefragt wird."

von Peter D. (peda)


Lesenswert?

Peter II schrieb:
> Wo steht denn im Datenblatt was ich im Interrupthandler machen darf? Ich
> darf doch wohl jeden ASM befehl ausführen den es gibt. Und PlayWave ist
> auch nur eine Sammlung von ASM befehlen.

Einfach mal den ganzen Text lesen.

Es ging um Manipulation der Interruptlogik (CLI/SEI) und die macht man 
nicht nach Gefühl, sondern exakt so, wie es im Datenblatt steht.

Insbesondere bei größeren MCs (ARM) mit 32 Interruptlevel kommt man mit 
Gefühl nicht weiter. Da ist ganz genau einzuhalten, wann und in welcher 
Reihenfolge man welche Bits und Register anfassen darf.
Beim ARM7 von ST ist die Interruptbeschreibung nur schlappe 35 Seiten 
lang.


Peter

von MCUA (Gast)


Lesenswert?

> dann schaltet man am Beginn jeder Interruptroutine die Interrupts aus
Oh Schreck, die Echtzeit ist weg.

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.