Nach stundenlanger internetsuche bin ich doch ziemlich frustriert. I benutze den MEGA2560 und den Adafruit Motorshield V2, der u.a. D20 und D21 benutzt. Bisher habe ich mit 2 externen Interrupts gearbeitet, was prima klappte. Mit dem Motorshield V2 habe ich die aber nicht mehr.
Ich benötige 3 Interrupt Pins und habe es daher mit PinChangeInt und den analogen Eingängen A1,A2 und A3 versucht. Es gibt aber keine Reaktionen der Interrupts. Nun soll es Probleme mit PinChangeInt und dem Mega2560 geben. Lösungen habe ich aber keine gefunden.
Bitte beantwortet mir folgende Fragen:
- Welche Mega2560 pins sollte ich wählen, um die 3 Interrupts mit PinChangeInt zu ermöglichen?
- Hat jemand ein schlichtes Beispiel für z.B. 3 InterruptPins mit PinChgangeInt, das definitiv auf dem Mega2560 läuft?
Danke für die schnelle Antwort, aber das ist für mich etwas zu hoch.
Geht's nicht etwas schlichter, vielleicht von jemandem, der PinChangeInt mit dem Mega2560 benutzt?
EDIT:
Gerade gesehen dass die Lib schon entdeckt hattet. Sorry.
Viel einfacher wird es nicht. Vielleicht wurden die Probleme auch inzwischen behoben. Hast du mal andere Pins probiert?
Das per Hand zu machen ist nicht so extrem schwer. Du musst mal im Datenblatt durchlesen wie das genau gemacht wird.
- Im PCICR (Pin Change Interrupt Register) das Bit für entsprechenden Port setzen.
- Im zugehörigen PCMSKx (Pin Change Interrupt Masx Register) die Bits für die entsprechenden Pins setzen.
Das wars erst mal. Dann springt das Programm in die ISR für den aktivierten Port
Dort liest man den ganzen Port ein. z.B. PVal = PIND;
Und mit den Makros wie PCINT23 maskiert man den jeweiligen Pin aus. Die Nummer der Pins kann man hier ablesen:
Da sieht man, dass z.B: A15 = PCINT23
Aber so wie ich das da sehe geht auf A0 bis A7 gar keine Pin Change Interrupts! Nur Pins die als "PCINTx" bezeichnet sind können das. Da es nur 3 PCMSK Register gibt, sind PC-Interrupts nur für 3 * 8 = 24 Pins möglich, was auf dem Mega zu Einschränkungen führt. Die Arduino IDE versteckt solche Feinheiten leider viel zu leicht.
Danke zunächst 'mal für die Hilfen, mit denen ich mich allerdings noch genauer beschäftigen muss.
Inzwischen ist mir eine simplere Idee für meine drei fehlenden Interrupts gekommen. Ich verwende einfach nur externe Interrupts:
Pin18 (Interr. 4) und Pin19 (Interr.4) verwende ich eh' schon. Nun nehme ich einfach noch Pin2 (Interr. 0) dazu, der nicht vom Motorshield benutzt wird. Oder wird Pin2 anderweitig vom MEGA2560 benutzt?
Wenn du diese Pins frei hast ist das natürlich die erste Wahl. Wie gesagt ist dein PC-Int Problem wahrscheinlich, dass du einfach andere Pins nehmen musst die das auch unterstützen (z.B. A8 - A15). Dann sollte das eigentlich auch mit der Lib funktionieren, wenn sie keine Fehler hat.
Pin 2 ist ein PWM Pin und frei wenn das nicht auf dem Pin machen willst. Aber das hättest du schon beim Anschließen gemerkt