www.mikrocontroller.net

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


Autor: Slater (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Slater (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Slater (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: johnny.m (Gast)
Datum:

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

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder du fragst in der Interruptroutine ab, ob der Pin gesetzt ist...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Slater (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na, das halte ich wirklich für komisch...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.