mikrocontroller.net

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


Autor: Chri (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Maximilian K. (laplace)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Chri (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Maximilian K. (laplace)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chri (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.