Hi, da der D-Port vom LCD belegt ist, möchte ich auf INT13 (PIN C5) einen externen Interrupt abgreifen... Ich bin mir nicht sicher, ob ich zu blöd bin, es hinzubekommen, oder ob die Entwickler von avrlib zu blöd waren, alle Pins beim Interrupthandling zu berücksichtigen... ISR(INT13_vect) { aktRPM++; } main { ... sei(); PCICR = 1<<PCIE1; PCMSK0 = 1<<PCINT13; ... } Hoffentlich kann mir einer helfen, sonst werd ich bekloppt... :shock: Grüße Slater
Was ist ein INT13? Hoer mal: Atmel macht sich die Mühe und benutzt sprechende Namen (na ja) für ihre Interrupts. Die Entwickler vom AVR_gcc haben sich die Mühe gemacht, extra nochmal alle Benamungen zu ändern um an das Atmel-Interrupt_ Benamungsschema anknüpfen zu können. Und dann kommst du und benutzt den 13.ten Interrupt. Das Ding hat einen Namen und der Name ist mit der Funktionalität verknüpft. (Hinweis: Du bist nicht der erste der sich verzählt hat)
Hi, INT 13 ist der Name von Atmel (siehe Datenblatt PC5 (PCINT13) ) Ich hab es natürlich nicht nur mit INT13_vect versucht, sondern mit allen möglichen in avrlib definierten Sachen... Was mit aber fehlt ist: SIG_PIN_CHANGE13 oder ähnlich, sonst bekomm ich ja keinen handler für den interrupt...
Dir ist anscheinend das Prinzip der Pin Change Interrupts nicht ganz klar: Der ATMega168 hat drei Pin Change Interrupts, denen je 8 Pins zugeordnet sind (PCI2: PCINT23..16; PCI1: PCINT15..8; PCI0: PCINT7..0). Es gibt für jeden PCI einen Interrupt-Vektor (wie der jetzt in der AVR-libc heißt, müsstest Du nachschauen). Die Pins, die einen PCI auslösen können sollen, werden über die entsprechenden PCMSK-Register ausgewählt. In Deinem Fall müsstest Du also den Pin PCINT13 im PCMSK1 auswählen und den PCI1 aktivieren. Du musst immer daran denken, dass alle maskierten Pins den zugeordneten PCI auslösen können! Also, Zusammenfassung: Den Pin Change Interrupt 13 gibt es nicht! PCINT13 ist die Bezeichnung eines Pins, der mit dem Pin Change Interrupt 1 verbunden werden und ihn auslösen kann. Ich hoffe, das hilft Dir weiter. Gruß Johnny
Also, hab mal nachgeschaut: Die Pin Change Interrupt-Vektoren heißen PCINT2_vect, PCINT1_vect und PCINT0_vect. Wenn Du die Pins korrekt maskierst und mit ISR(PCINT1_vect) arbeitest, sollte es klappen. Aber wie gesagt: Jeder Pin Change Interrupt hat 8 Pins zugeordnet, von denen jeder, der entsprechend maskiert ist den Interrupt auslösen kann. Wenn Du also nur PCINT13 maskierst, dann wird der Interrupt auf eine Änderung an PCINT13 ausgelöst. Wenn noch andere Pins aktiviert sind, dann lösen auch diese den Interrupt aus.
Ok sry mein Fehler - danke für die Hilfe! Jetzt hab ich nur noch ein Problem: ich habe mit PCICR |= (1<<PCIE1); PCMSK1 |= (1<<PCINT13); nur PCINT13 für interrupts aktiviert trotzdem entstehen auch welche wenn ich das Signal an die PINS PCINT12,PCINT11 usw. anlege also an alle von 8 bis 14...
Dann solltest Du die entsprechenden Bits definiert auf Null setzen (also z.B. im obigen Besipiel die '|' vor den '=' weglassen).
Oder du fragst in der Interruptroutine ab, ob der Pin gesetzt ist...
Naja, je nachdem, was er an den anderen Pins dran hat, kann das aber dazu führen, dass der Interrupt ständig kommt. Es ist halt ein Pin Change Interrupt, der, wie der Name schon vermuten lässt, bei jedweder Zustandsänderung an den betreffenden Pins auftritt. Wenn man nur einen Pin will, dann stellt man das entsprechend ein. Dafür gibts die Maskierung!
Hmm das mit dem | weglassen hab ich auch schon probiert... sprich alle anderen waren auf 0, aber sie haben trotzdem den interrupt ausgelöst. Komisch...
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.