mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupt A abschalten und IRQ B lauffähig lassen


Autor: ISR_Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gemeinde,

ich suche gerade eine feine Art zum programmieren (AVR-GCC/ATmega2560).

Ich bin gerade am überlegen, wie ich folgendes Problem am elegantesten 
löse und die "alten" Forumseinträge helfen mir nicht weiter...

Also, ggf. hat ja einer von euch Zeit mir ein paar schmankerl eurer 
Künste beizubringen:-)

Ich habe derzeit meine Hardware mit mehreren IRQs am laufen. Das 
Szenario ist:

IRQ A muss immer an sein --> IRQ nicht deaktivieren via cli();
IRQ B soll nur an sein, bis Event ihn auf Low zieht und erst nach 
weiterer Ausführung wieder reagieren.

Also... IRQ B --> EVENT PIN-X auf LOW --> Springe in ISR für IRQ B --> 
Bleibt in IRQ B, da PIN auf Low bleibt! Prob:

Der Low-Pegel erzeugt mir immer und immer wieder nen IRQ (Das darf aber 
nicht sein..!) Das heißt, ich möchte, dass er nicht auf den LOW-Pegel 
reagiert, wenn ich einmal drauf reagiert habe(Verständlich?) Ich möchte 
ihn quasi zwischenzeitlich deaktivieren. Nun die Frage nach der 
elegantesten Art ?

einfach

....
EICRA = (0<<ISC31);
ÉIMSK = (0<<INT3);   // Ausschalten
....
// Mache was und reagiere nicht auf IRQ B
....
Schalte ihn wieder ein... 


Danke für Tipps!

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Der Low-Pegel erzeugt mir immer und immer wieder nen IRQ (Das darf aber
>nicht sein..!) Das heißt, ich möchte, dass er nicht auf den LOW-Pegel
>reagiert, wenn ich einmal drauf reagiert habe(Verständlich?) Ich möchte
>ihn quasi zwischenzeitlich deaktivieren. Nun die Frage nach der
>elegantesten Art ?


Du solltest die Interruptauslösung auf fallende Flanke einstellen, nicht 
auf Low Pegel. Dann wird der Interrupt nur einmal ausgelöst.

MfG Spess

Autor: ISR_Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm,

ein wahrlich einfache Idee :-) Danke!

Autor: ISR_Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...wobei er ja auf fallende Flanke schon eingestellt ist...
den:

EICRA = (1<<ISC31);
EIMSK = (1<<INT3);

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Der Low-Pegel erzeugt mir immer und immer wieder nen IRQ (Das darf aber
>nicht sein..!) Das heißt, ich möchte, dass er nicht auf den LOW-Pegel

>...wobei er ja auf fallende Flanke schon eingestellt ist...

Das widerspricht sich aber. Wie stellst du denn den anderen Interrupt 
ein?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
EICRA = (0<<ISC31);
ÉIMSK = (0<<INT3);   // Ausschalten

ist natürlich Quatsch.

Aber generell ist der Ansatz schon richtig: Interrupts werden aktiviert 
durch setzten des zugehörigen Bits im Controlregister, und deaktiviert 
durch rücksetzen. Das kann auch innerhalb der ISR geschehen.

>Der Low-Pegel erzeugt mir immer und immer wieder nen IRQ (Das darf aber
>nicht sein..!)

Womit erzeugst du denn den low-Pegel?

Oliver

Autor: ISR_Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich korriegiere mich :-) Er muss auf fallende Flanke reagieren und nicht 
auf Low-Pegel!

Der Low-Pegel wird durch ein externes Display erzeugt (Daten am Disp zum 
abholen --> Low Pegel, bis abgeholt!)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Welche Interrupts benutzt du denn?

MfG Spess

Autor: ISR_Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich nutze einen zwei - Timer-IRQ. und bisher einen externen(den vom dem 
ich erzähle!)

grüßken

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ISR_Anfänger wrote:
>
> 
> ....
> EICRA = (0<<ISC31);
> ÉIMSK = (0<<INT3);   // Ausschalten
> ....
> 

damit steht in beiden Registern eine kmpl. NULL... du löscht mit dieser 
Operation kein einzelnes Bit SONDERN setzt das ganze Register auf 0

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.