Forum: Compiler & IDEs externe Interrupts auf INT13 (avrlib,atmega168)


von Slater (Gast)


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

von Karl heinz B. (kbucheg)


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)

von Slater (Gast)


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...

von johnny.m (Gast)


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

von johnny.m (Gast)


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.

von Slater (Gast)


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...

von johnny.m (Gast)


Lesenswert?

Dann solltest Du die entsprechenden Bits definiert auf Null setzen (also
z.B. im obigen Besipiel die '|' vor den '=' weglassen).

von Werner (Gast)


Lesenswert?

Oder du fragst in der Interruptroutine ab, ob der Pin gesetzt ist...

von johnny.m (Gast)


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!

von Slater (Gast)


Lesenswert?

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...

von johnny.m (Gast)


Lesenswert?

Na, das halte ich wirklich für 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
Noch kein Account? Hier anmelden.