Hallo ich arbeite mit einem Atmega164 P und benötige eine ISR die die ausgelöst wird, wenn sich der an einem bestimmten Eingangs-Pin anliegende Pegel ändert, dieser Pin aber nicht INT0 oder INT1 ist. Kann mir da jemand bei der Initialisierung weiterhelfen.(In welchen Regiestern ich welche Bits setzen muss) Danke
An den Pins PC0, PC1 und PC2 hängt jewils ein Taster welche gegen Masse geschaltet ist. Also soll das Interrupt ausgelöst werden wenn eil LOW am Pin anliegt
Mark schrieb: > An den Pins PC0, PC1 und PC2 hängt jewils ein Taster welche gegen Masse > geschaltet ist. Dann ist ein Timerinterrupt viel besser geeignet: Beitrag "Universelle Tastenabfrage" Peter
Hatte es gerade mal mit einem Pin Change Interrupt versucht bin mir aber nicht ganz sicher ob ich etwas bei der Initilaisierung vergessen habe. Hier mein Code #include <avr/io.h> #include <avr/interrupt.h> ISR(PCINT0_vect){ DDRC |= (1<<3); PORTC |= (1<<3); } int main(void) { DDRC &= ~(1<<0); PCMSK3 |= (1<<PCINT0); PCICR |= (1<<PCIE0); // Interrupt wird freigegeben sei(); while(1) {} } Was habe ich vergessen oder falsch gemacht? Vielen Dank schon mal im Voraus!
Mark schrieb: > Was habe ich vergessen oder falsch gemacht? 1. PCINT0_vect ist der Interruptvektor für die Pins PCINT0 bis PCINT7 (entspricht PA0 bis PA7). Du hast Deine Taster aber an den Pins PCINT16 bis PCINT18 (entspricht PC0 bis PC2). Der zugehörige Interruptvektor ist PCINT2_vect. 2. Das Register PCMSK3 ist für die Maskierung der Pins PCINT24 bis PCINT31 (entspricht PD0 bis PD7) zuständig. Für die von Dir verwendeten Pins ist das Register PCMSK2 vorgesehen. In diesem Registster solltest Du die richtigen Bits setzten. Bezüglich der Sinnhaftigkeit Deiner Lösung verweise ich auf den Post von Peter Dannegger.
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.