Forum: Mikrocontroller und Digitale Elektronik (8515) Probleme mit Interrupt - wird von selbst ausgelöst


von ottom (Gast)


Lesenswert?

Hallo,

ich bin ein Anfänger und experementiere gerade mit einem AT90S8515 und
versuche einen Interrupt-Handler zu starten, sobald eine der beiden
Tasten, die an INT0 und INT1 angeschlossen sind, gedrückt wird.

Die Tasten sind so anschlossen, wie in "AVR-Tutorial - 2.
I/O-Grundlagen" gezeigt.

Auch die Interrupt-Behandlung erfolgt analog zum Quellcode, der in
"AVR-Tutorial - 5. Interrupts" vorgestellt ist.

Die Steuer-Register sind folgendermaßen belegt:

MCUCR <- 0b00001010
GIMSK <- 0b11000000

Dann wird mit SEI das Interrupt aktiviert.


Interrupt0-Handler inkrementiert den Wert eines Registers und gibt ihn
auf die LED-Leiste am Port A aus und kehrt mit RETI zurück.

Interrupt1-Handler tut nichts und kehrt mit RETI zurück.

Ansonsten befindet sich das Programm in einer Endlossschleife:

loop:
RJMP loop

Folgendes passiert aber: ohne, dass ich die Tasten berühre, wird der
LED-Register hochfrequent inkrementiert, sodass die LED des
niederwertigsten Bits mit vermutlich 20 Hz flimmert.

Drücke ich nun auf eine der BEIDEN Tasten, hält der Zähler an! Wie
gesagt: es ist egal, ob ich auf Int0- oder Int1-Taste drücke; beide
bewirken das Gleiche!

Wo liegt das Problem?! Warum löst der Interrupt von alleine aus?

Mux

von Mathias (Gast)


Lesenswert?

is der interrupt low oder high aktiv? hast du eventuell pull ups
vergessen?? So wie es aussieht hast du den Taster falsch belegt! Also
beim Drücken auf GND statt VCC oder auf VCC statt GND ziehen!

Mfg, Mathias

von ottom (Gast)


Lesenswert?

Hallo Mathias,

Unter
http://www.avr-asm-tutorial.net/avr_de/beginner/portdetail.html#MCUCR
ist dokumentiert, welche Bits für Interrupt verantwortlich sind.

Zitat: "10: Fallende Flanke löst Interrupt aus", d.h. MCUCR <-
0b00001010 sorgt dafür, dass Interrupt auf der fallenden Flanke
ausgelöst wird. Im Zweifel habe ich aber alle Kombinationen
ausprobiert, ohne dass es was gebracht hat.

Über ein Widerstand wird der Pegel an INT-Eingängen stabil gehalten
(Widerstand ist an Vcc angeschlossen).

Die Tasten verbinden die INT-Eingänge dann direkt mit GND.

Mux

von A.K. (Gast)


Lesenswert?

Die Fehlerbeschreibung passt exakt zum Verhalten von offenen Eingängen -
erst wenn der Eingang per Taster auf GND gezogen wird, ist Ruhe.
Aktiviere mal die Port-eigenen Pullups.

von ottom (Gast)


Lesenswert?

Jetzt gefunden: die Widerstände waren gar nicht an Vcc angeschlossen!
Danke für die Tipps!

von Paul Baumann (Gast)


Lesenswert?

@OTTOM
Hallo, mit den internen Pull-up Widerständen hatte ich auch keinen
Erfolg; ich mußte extern 10 Kiloohm vorsehen, dann war es i.O.
Komischerweise aber nur bei diesen Eingängen.

MfG Paul

von Hannes L. (hannes)


Lesenswert?

Der erste Fehler ist je nun gefunden...

Aber:
Mechanische Taster prellen. Sie lösen daher den Interrupt nicht nur
einmal aus, sondern mehrmals hintereinander. Es ist daher besser,
Taster zyklisch im Timer-Interrupt abzufragen und zu entprellen. Mehr
Informationen dazu gibt es hier:
 http://www.mikrocontroller.net/articles/Entprellung

...

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.