Interrupt auslösen außerhalb von Main

Gast #742419
Lesenswert?

Hallo!

Ich habe ein interessantes Phänomen!
Mein Externer INT0 wird nur aus der Main-Funktion gestartet.
Rufe ich aus der Main eine andere Funktion auf, wied der Interrupt 
ignoriert.
Ich verwende momentan den CCS- Compiler und dieses Problem ist mir bei 
anderen µC-Umgebungen noch nicht untergekommen!

Möglicherweise habe ich heute einen Denkfehler und es kann mir wer mit 
einem kleinem Satz aus der Patsche helfen gg, danke!

mfg. Chri
#742428
Lesenswert?

Warum ist das eigentlich so schwer, sich vor dem Posten mal die 
Forenregeln durchzulesen? Ich musste erst Google bemühen, um 
festzustellen, dass es sich bei dem genannten Compiler um einen für 
PIC-Controller handelt. Es ist manchmal echt zum kotzen. Und dann auch 
wieder keinen Code gepostet, anhand dessen man den Fehler reproduzieren 
könnte. Wieder Arbeit für die Glaskugel.

Viel Spaß noch beim heiteren Ratespiel...
Gast #742433
Lesenswert?

Der Interrupt soll durch eine Pegeländerung ausgelöst werden.
Die INT-Service-Routine wird aber leider nur dann durch eine 
Pegeländerung aufgerufen, wenn der Programm-Pointer/Counter irgendo in 
der Funktion von Main steht.

Programmbeispiel:

#int_EXT
EXT_isr()
{
   GetHeaderData(&MyReceived);
   GotStream = 1;
}


void abarbeitung(){
...
}



void main()
{
...
...
...
if(GotStream) abarbeitung()
...
}



wenn die Funktion 'abarbeitung'  "aktiv" ist, wird der INT nicht mehr 
ausgelöst, nur wenn das Programm wieder in die Main zurrückspringt, wird 
das Flag 'GotStream' erneut gesetzt bei der Pegeländerung.
Die Priorität von 'abarbeitung' sollte doch gleichzusetzten sein mit der 
von main in diesem fall...
Gast #742441
Lesenswert?

Der INT0 wird nirgends deaktiviert, für mich wäre ja nur grundsätzlich 
interessant ob es bei jemandem fälle gibt, bei dem solch eine anwendung 
grundsätzlich funktioniert. Bei Keil µ-Vision für Atmel funktioniert 
das. Nur die PICs machen mir auch Sorgen...
Gast #742444
Lesenswert?

Hi,

also ich kenne das nur von AVRs, wenn die gerade eine andere ISR 
abarbeiten. Wird ein Interrupt ausgelöst, so werden per Flag erstmal 
alle anderen gesperrt. Der nächste Interrupt kann erst nach rücksetzen 
des entsprechenden Bits (Flag) ausgelöst werden. Dies geschieht meist 
durch Rücksprung aus der ISR in das Hauptprogramm (also main). 
Alternativ kann man das Ganze auch manuell innerhalb einer ISR tun. 
Dabei aber extrem aufpassen, sonst wird man schnell zum 
(stack)Hochstapler, wenn zuviele Interrupts verschachtelt werden.
Gruß

Fred
#742498
Lesenswert?

Chri wrote:

> wenn die Funktion 'abarbeitung'  "aktiv" ist, wird der INT nicht mehr
> ausgelöst, nur wenn das Programm wieder in die Main zurrückspringt, wird
> das Flag 'GotStream' erneut gesetzt bei der Pegeländerung.

Dein 'abarbeitung'  wird nach dem ersten Interrupt ständig aufgerufen, 
da 'GotStream' nie gelöscht wird.

Ist es denn so schwer, mal nen relevanten Code zu posten?

Daß man Fehler im Code nur per copy&paste übernimmt, sollte auch jedem 
klar sein.
Irgendwelche Fragmente mit vielen ... aus dem Gedächtnis sind völlig 
sinnlos zur Fehlersuche.

Manmanman.


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren