Forum: Mikrocontroller und Digitale Elektronik Blockieren sich Interrupts gegenseitig?


von Mike (Gast)


Lesenswert?

Hallo,

ich habe hier gerade ein dringendes Problem. Ich habe eine Timer0 
Routine, die ausgelöst werden soll, wenn der INT0-Interrupt ausgelöst 
wurde. Kurz: Wenn an INT0 ein Taster gedrückt wurde, soll der Timer0 
gestartet werden und bei einem CompareMatch den Timer0-Interrupt 
auslösen, der dann etwas tut. Ist er damit fertig, soll der Timer0 
wieder abgeschaltet werden.

Der Timer0 für sich funktioniert einwandfrei. Er startet, verrichtet 
über den Interruptservice seinen Dienst und stellt sich nachdem wieder 
ab. Ausgelöst durch ISR (INT0_vect) hingegen zählt er sein 
Compareregister (im Debugger gesehen) hoch, löst aber offenbar seinen 
Interruptservice nicht aus.

Hat einer von Euch da eine Idee?

Mit Gruß

Mike

von Haudrauf ! (Gast)


Lesenswert?

code ?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Mike schrieb:
> Wenn an INT0 ein Taster gedrückt wurde

Taster prellen und erzeugen 1...sehr viele Pulse.

von JojoS (Gast)


Lesenswert?

DEN INT0 gibts sowieso nicht, jede µC Serie hat gerade bei INTs ihre 
Eigenheiten, da müsste man schon wissen um welchen Proz. es geht.

von 42 (Gast)


Lesenswert?

Alleine schon die Angabe der Prozessorfamilie könnte das Rätselraten 
deutlich einschränken.

von Yaro (Gast)


Lesenswert?

Wenn es um AVR geht, so musst du in deinem ersten Interrupt mittels
"sei()" die Interrupts freischalten.

Vergiss aber nicht, deinen Taster zu entprellen, oder andere Maßnahmen 
dafür vorzunehmen.

Gruß, Yaro

von Sascha W. (sascha-w)


Lesenswert?

Yaro schrieb:
> Wenn es um AVR geht, so musst du in deinem ersten Interrupt mittels
> "sei()" die Interrupts freischalten.
das ist unnötig, wenn die INT0_ISR nur den Timer startet und dann 
beendet ist so wird auch der Timer-Int ausgelöst.

> Vergiss aber nicht, deinen Taster zu entprellen, oder andere Maßnahmen
> dafür vorzunehmen.
da liegt schon eher das Problem,
wobei der ausgelöste Timer-Int ja nicht verloren geht - warten wir mal 
auf den Code ...

Sascha

von Mike (Gast)


Lesenswert?

Hallo,

vielen Dank für die vielen Hinweise. Ich muss wohl etwas konkreter 
werden. Den Code selbst kann ich hier leider nicht posten und er müsste 
auch aus zahlreichen Dateien zusammen geschustert werden.

uC: Atmega32

Den INT0 Interrupt gibt es wohl schon eindeutig. Hat ja auch einen 
eigenen ISR :).

Die Taste ist entprellt über einen Kondensator (100nF) und der INT0 soll 
nur auf eine fallende Flanke reagieren. Das Schaltverhalten sieht auf 
dem Oszi sehr sauber aus.

Wie ich nun gelesen habe kann es wohl daran liegen, dass ich aus einem 
Interrupthandler einen anderen aktiviere (also in ISR wird Timer0 
gestartet und es soll über ISR (TIMER0xxxx) etwas gemacht werden). 
Solange ich den ersten nicht verlassen habe, wird der zweite seine 
ISR-Routine nicht aufrufen können, da der Interrupt gesperrt wird.

Gibt es da vielleicht noch andere Möglichkeiten oder Triks? Sonst müsste 
ich eine etwas umständlichere Routine als Dauerschleife implementieren.

Gruß

Mike

von Karl H. (kbuchegg)


Lesenswert?

Mike schrieb:
> Hallo,
>
> vielen Dank für die vielen Hinweise. Ich muss wohl etwas konkreter
> werden. Den Code selbst kann ich hier leider nicht posten und er müsste
> auch aus zahlreichen Dateien zusammen geschustert werden.

Dann mach das.
Es wird dir helfen deine Gedanken zu ordnen und es wird uns helfen dir 
die Fehler zu zeigen.

Zuma ja wohl die von dir beschriebene Funktionalität von weiter oben 
sich in maximal ein einhalb Bildschirmseiten Code auch neu (nur so zum 
Testen) schreiben lässt.

> Solange ich den ersten nicht verlassen habe, wird der zweite seine
> ISR-Routine nicht aufrufen können, da der Interrupt gesperrt wird.

Ähm.
In einer ISR wird nicht gewartet.
Auf nichts und niemanden!
Und ich sehe in deiner Aufgabenbeschreibung ehrlich gesagt auch nicht, 
warum das notwendig sein sollte.

> Sonst müsste ich eine etwas umständlichere Routine als Dauerschleife
> implementieren.

Was hat eine Dauerschleife damit zu tun?
Die eine ISR konfiguriert und startet einen Timer
Der Timer stellt sich selber wieder ab.

Wo ist da eine Schleife notwendig?

von LuXXuS 9. (aichn)


Lesenswert?

Mike schrieb:
> Solange ich den ersten nicht verlassen habe, wird der zweite seine
> ISR-Routine nicht aufrufen können, da der Interrupt gesperrt wird.

Also spätestens hier solltest du mal deinen Code rausrücken, denn da 
scheint was falsch umgesetzt zu sein. Wenn ein Interrupt läuft, kann 
kein zweiter aktiv werden, das stimmt - dieser würde direkt nach dem 
Verlassen der einen ISR aufgerufen werden.

Aber was hast du da programmiert? In wie fern wartet dein 
Taster-Interrupt auf den Timer-Interrupt? Da stimmt doch was nicht.

von Oliver (Gast)


Lesenswert?

LuXXuS 909 schrieb:
> Wenn ein Interrupt läuft, kann
> kein zweiter aktiv werden, das stimmt -

Ich wage es bei dieser Frage ja kaum zu schreiben, aber können kann der 
zweite Interrupt schon, wenn man ihn freigibt.

@ Mike:
NEIN, DAS WILLST DU NICHT !!!

Zeig lieber deinen Code, das bringt dir mehr.

Oliver

von Falk B. (falk)


Lesenswert?

@  Mike (Gast)

>Die Taste ist entprellt über einen Kondensator (100nF)

Dass allein reicht nicht. Fehlt mindestens ein Widerstand, siehe 
Entprellung.

>und der INT0 soll
>nur auf eine fallende Flanke reagieren. Das Schaltverhalten sieht auf
>dem Oszi sehr sauber aus.

>Wie ich nun gelesen habe kann es wohl daran liegen, dass ich aus einem
>Interrupthandler einen anderen aktiviere (also in ISR wird Timer0
>gestartet und es soll über ISR (TIMER0xxxx) etwas gemacht werden).
>Solange ich den ersten nicht verlassen habe, wird der zweite seine
>ISR-Routine nicht aufrufen können, da der Interrupt gesperrt wird.

Ja, siehe Interrupt.

>Gibt es da vielleicht noch andere Möglichkeiten oder Triks?

Tricks brauchst es hier sicher wenige, dafür mehr solide Grundlagen und 
Konzepte. Siehe oben.

MFG
Falk

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.