externe Interrupts auf INT13 (avrlib,atmega168)

Gast #367226
Lesenswert?

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
#367227
Lesenswert?

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)
Gast #367228
Lesenswert?

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...
Gast #367229
Lesenswert?

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
Gast #367230
Lesenswert?

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.
Gast #367231
Lesenswert?

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...
Gast #367234
Lesenswert?

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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren