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
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.
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...
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...
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.
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...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.