Hallo liebe Mikrocontroller Gemeinde,
ich verzweifle grade bei dem Versuch, einen externen Interrupt am
Atmega328p zu nutzen und brauche eure Hilfe. Im Ganzen geht es um eine
Drehzahlerfassung.
1. Am Atmega328p an PC5 (PCINT13) habe ich das Ausgangssignal eines
Hallsensors. Dieses liefert stets 5 V und fällt ab und zu mal auf 0 V.
Dies sehe ich mit dem Oszilloskop.
2. Im C-Programm habe ich die
eingebunden.
3. Als erstes setzte ich Pin 5 an Port C auf Eingang. (
)
4. Dann rufe ich die Funktion sei() auf um Interrupts zu zulassen.
5. Mit
1 | EICRA = EICRA | 0b00001000;
|
wähle ich die fallende Flanke als Auslöser für INT1.
6. Mit
1 | EIMSK = EIMSK | 0b00000010;
|
aktiviere ich INT1.
7. Mit
1 | PCICR = PCICR | 0b00000010;
|
erlaube ich Pin Change Interrupt 1.
8. Mit
1 | PCMSK1 = PCMSK1 | 0b00100000;
|
wähle ich PCINT13 als Signalquelle.
9. Über der Mainfunktion habe ich die ISR implementiert:
1 | ISR(INT1_vect)
|
2 | {
|
3 | [...]
|
4 | }
|
Mein Problem ist nun, dass, wenn ich die Flanke an PCINT13 fallen lasse,
die ISR nicht ausgeführt wird.
Kann mir jemand helfen? Vielleicht habe ich etwas wichtiges übersehen?
In den Tutorials wird immer von den Registern MCUCR und GICR
geschrieben. Diese kommen in meinem Datenblatt unter "external
Interrupts" aber nicht vor. Stattdessen werden die o.g. erwähnt, die ich
nun entsprechend gesetzt habe.
Ich freue mich auf eure Rückmeldungen und bedanke mich schonmal
herzlich.
Felix