Serenifly:
Das erste Problem ist dass Taster mehrere Millisekunden lang Prellen, was ein vielfaches deiner ISR Dauer ist.
Man könnte aber vielleicht schon in der ISR detachInterrupt() machen und erst wieder attachInterrupt() wenn eine gewisse Zeit vorbei ist. Solange man die Zeit irgendwie außerhalb der ISR zählt.
Die Befehle zum aktivieren und deaktivieren der Interrupts kannte ich nicht, aber grundsätzlich war das mein Plan. Ich wollte die Interrupts nur zum Aufwecken des uCs nehmen, den Interrupteingang deaktivieren, zum Pollen übergehen, und wenn ich sicher sein kann, dass kein Tastenprellen mehr auftritt, würde ich den Interrupt wieder aktivieren und den uC in den Sleepmodus schicken.
Die ISR deaktiviert dann nur die Interrupts. Der Rest wird vom Hauptprogramm erledigt.
uwefed:
Du kannst die Interruptausgänge des MCP auch per Polling ausfragen und bei LOW das register abfragen um draufzukommen welcher Port den interrupt ausgelöst hat.
Wäre es denn ein nennenswerter Vorteil, wenn ich die Interruptausgänge pollen würde, statt direkt die IO-Register abzufragen?
Ich müsste dann doch trotzdem immer wieder den uC aus dem Sleepmodus holen, und das möchte ich vermeiden.
Keine Angst, Du kannst einen Schalter nicht innerhalb 50mS drücken und wieder loslassen. Arduino kontrolliert die Schalter in den 50mS bereits mehrfach.
Wie gesagt mußt Du den Interruptausgang als Open Collektor setzen da ansonsten paralellgeschaltete Ausgänge kaputtgehen. Du wirst das Datenblatt gut studieren müssen und verstehen welche Register/Bit abgefragt bzw gesetzt werden müssen.
Ja, Danke für den Hinweis. Open-Collektor war mir klar. Ich hatte mich bis gerade nur noch nicht weiter darum gekümmert, weil ich erst mal abklären wollte, ob meine Idee mit dem Interrupt grundsätzlich funktioniert.
Ich habe gerade im Datenblatt gesehen, dass das Kontrollregister IOCON dafür zuständig ist. Demnach muss Bit "ODR" auf 1 gesetzt werden. Nach einem Reset hat es eine 0.
Das ist für mich auch wichtig, weil ich die Bausteine über den uC resetten können möchte. Zu I2C habe ich gelesen, dass es sich auch mal weghängen kann und sich selbstständig nicht mehr fängt. Ich möchte also immer wieder mal die Ports abfragen und dadurch testen, ob I2C noch läuft und sinnvolle Werte ankommen. Wenn nicht, sollen die angeschlossenen Bausteine resettet und initialisiert werden.
Vielleicht sollte ich noch an jeden Interrupt-Ausgang 150 Ohm in Reihe hängen. Das sollte reichen um den Eingang auf GND zu ziehen und den Strom bei "Programmierfehlern" in Grenzen halten.