Forum: Mikrocontroller und Digitale Elektronik Interrupt auslösen außerhalb von Main


von Chri (Gast)


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

von Maximilian K. (laplace)


Lesenswert?

Ich verstehe nicht ganz was du meinst. Dein Interrupt wird weder in der 
main-Funktion, noch in einer anderen Funktion "gestartet". Er soll doch 
durch eine Pegeländerung ausgelöst werden. Oder meinst du die globale 
Aktivierung der Interrupts?

Beschreib dein Problem mal etwas genauer.

von Johannes M. (johnny-m)


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...

von Chri (Gast)


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...

von Maximilian K. (laplace)


Lesenswert?

Interessant wäre, ob irgendwo die Interrupts deaktiviert werden und wo 
und wann das Interrupt-Flag deines INT0 gelöscht wird. Leider hab ich 
keine Erfahrung mit PIC.

von Chri (Gast)


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...

von Fred (Gast)


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

von Peter D. (peda)


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

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.