Forum: Mikrocontroller und Digitale Elektronik PIC - kann sich die ISR selbst unterbrechen?


von A. S. (rava)


Lesenswert?

guten abend,

heute habe ich eine ziemliche Grundlagenfrage dabei.

ich nutze eine einzige ISR in meinem PIC Programm. Wird diese 
aufgerufen, fragt sie alle möglichen Interrupt flags der Reihe nach ab
1
void interrupt high_priority ISR_highPriority()
2
{
3
    if(INTCONbits.INT0F == 1)
4
    {
5
        INTCONbits.INT0F = 0;
6
        Int0_Code();
7
    }
8
9
10
    if(PIR5bits.TMR5IF == 1)
11
    {
12
        PIR5bits.TMR5IF = 0;                    // clear interrupt flag
13
        Timer5_Code();
14
    }
15
...
16
}


nun liest man ja im Datenblatt allerhand über Prioritäten von 
Interrupts. Im Quelltext gibt es aber nur eine einzige Routine.

Nun meine Fragen:
- kann sich die Routine selbst unterbrechen? Also wenn z.B. timer 5 
zündet und er den entsprechenden quelltext abarbeitet und dann eine 
Flanke an INT0 auftaucht. Wird dann eine neue ISR gestartet? Oder wird 
die ISR erst dann gleich nochmal gestartet, wenn der alte Aufruf 
durchgelaufen ist?
- was wenn gerade der INT0-Bereich abgearbeitet wird und währenddessen 
der timer 5 alarm schlägt? Da ich kein return am Ende des 
INT0-Quelltexts habe, könnte derselbe ISR-Aufruf direkt in die 
timer5-routine laufen. Das wäre ja nicht weiter tragisch, aber gibt's 
dann danach noch einen zweiten ISR-Aufruf, in dem nichts mehr passiert?

dank euch...
lg

von Meister E. (edson)


Lesenswert?

Nein. Beim Eintritt in die ISR wird GIE von der CPU zurückgesetzt und 
erst wieder gesetzt wenn ein retfie ausgeführt wurde.

Ein High-Priority-Interrupt kann aber die Low-Priority ISR unterbrechen.

von Meister E. (edson)


Lesenswert?

A. S. schrieb:
> Nun meine Fragen:
> - kann sich die Routine selbst unterbrechen? Also wenn z.B. timer 5
> zündet und er den entsprechenden quelltext abarbeitet und dann eine
> Flanke an INT0 auftaucht. Wird dann eine neue ISR gestartet? Oder wird
> die ISR erst dann gleich nochmal gestartet, wenn der alte Aufruf
> durchgelaufen ist?

Letzteres.

> - was wenn gerade der INT0-Bereich abgearbeitet wird und währenddessen
> der timer 5 alarm schlägt? Da ich kein return am Ende des
> INT0-Quelltexts habe, könnte derselbe ISR-Aufruf direkt in die
> timer5-routine laufen. Das wäre ja nicht weiter tragisch, aber gibt's
> dann danach noch einen zweiten ISR-Aufruf, in dem nichts mehr passiert?

Es wird so laufen, wie du schon selber geschrieben hast. Am Ende der ISR 
sind beide Flags gelöscht und es gibt keine erneute Unterbrechung wenn 
das GIE wieder freigegeben ist.

> dank euch...
> lg

Edit: Im vorigen Post habe ich die Assembler-Instruktion retfie 
angesprochen, die du möglicherweise gar nicht kennst weil das der 
C-Compiler für dich erledigt. Dieser Befehl kennzeichnet das Ende einer 
ISR und bringt die CPU wieder in den "normalen Modus" zurück.

von Carsten M. (ccp1con)


Lesenswert?

Das alles hängt natürlich auch davon ab, von welchem PIC hier die Rede 
ist!?
Manche haben nur eine ISR andere zwei (high and low priority) und manche 
haben für jede int source eine eigene mit eigenen Prioritäten.

von A. S. (rava)


Lesenswert?

Carsten M. schrieb:
> Das alles hängt natürlich auch davon ab, von welchem PIC hier die Rede
> ist!?

sorry, vergessen
PIC18F46K22

wenn ich versuche, eine low_priority und eine high_priority ISR zu 
schreiben, nörgelt der Compiler

von Carsten M. (ccp1con)


Lesenswert?

Hängt auch wieder vom Compiler ab. :-)
Aber mit XC8 sollte das gehen
1
void interrupt high_priority your_ISR(void)
2
{
3
}
4
5
void interrupt low_priority your_low_ISR(void)
6
{
7
}

von Max H. (hartl192)


Lesenswert?

Vergiss nicht die Prioritäten auch zu aktivieren (RCON.IPEN)

von Carsten M. (ccp1con)


Lesenswert?

und
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;

von Meister E. (edson)


Lesenswert?

Carsten M. schrieb:
> Das alles hängt natürlich auch davon ab, von welchem PIC hier die Rede
> ist!?

Tut es nicht. Ein einziger Blick auf den vom TE geposteten Code reicht 
übrigens aus um zu sehen, dass es sich um PIC18 handelt.

> Manche haben nur eine ISR andere zwei (high and low priority) und manche
> haben für jede int source eine eigene mit eigenen Prioritäten.

Meine Antworten stimmen sowohl für PIC mit nur einem Interrupt als auch 
für PIC18 mit seinen zwei Interrupt-Vektoren.

von Carsten M. (ccp1con)


Lesenswert?

Hat jemand gesagt, dass deine Antworten nicht stimmen?
Chill mal ..

von Meister E. (edson)


Lesenswert?

Carsten M. schrieb:
> Hat jemand gesagt, dass deine Antworten nicht stimmen?
> Chill mal ..

Hallo? Ich habe nicht gepostet um mich zu rechtfertigen sondern um hier 
ein paar eindeutige und richtige Angaben zu ergänzen. Für den TE, der 
die Frage gestellt hat. Du wurdest zitiert weil deine Aussage nicht 
stimmt, das muss man in einem Fachforum schon aushalten können, Carsten.

von Carsten M. (ccp1con)


Lesenswert?

Ja gut ... halte ich aus.

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.