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
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
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
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.
Jetzt gefunden: die Widerstände waren gar nicht an Vcc angeschlossen! Danke für die Tipps!
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.