Ich habe zuhause ein Philips Hue System installiert, mit einigen Lampen, Motion Sensoren und Schaltern. Damit ich mein vorhandenes Schalterprogramm (GIRA S-Color) weiterverwenden kann, anstatt die Hue Dimming Schalter daneben zu kleben, habe ich diese auseinandergebaut und in meine Schalterdosen integriert. Nebenbei habe ich die Schaltung der Platine analysiert, damit ich die SMD Touchbuttons gegen GIRA Taster tauschen kann. Mir ist aufgefallen, dass die Entwickler eine verrückte Schaltung verwenden, anstatt einfach 3V über die Taster auf 4 GPIOs zu legen. Mir ist noch nicht ganz klar, wie diese funktioniert (siehe Anhang). Der verwendete Microcontroller ist vom Typ Atmel M2564RFR2. Die Taster sind "paarweise miteinander verschaltet" und gehen dann jeweils zu zwei GPIOs. Insgesamt also 4 GPIOs, die aber nicht normal verwendet werden. An PD0, PD1 liegt 3V an (interner Pullup). An den anderen PD4, PD5 liegt keine Spannung an = 0V. Lege ich nun einfach 3V an z.B. PD4, passiert nichts. Ziehe ich PD0 oder PD1 auf GND, passiert auch nichts. Nur die Kombination PD0 auf PD4 legen usw. funktioniert. Dabei fällt sinkt die 3V auf 0. LAut Handbuch können alle 4 (5 mit Reset) GPIOs als externer Interrupt verwendet werden, bestimmt um den uC aufzuwecken. Aber warum die Schaltung so aufgebaut wurde, verstehe ich nicht. Kann mir da einer helfen? Ich wollte es nur rein informativ wissen. Eine Anleitung zum Umbau habe ich auf ottelo.jimdo.de
:
Bearbeitet durch User
Der AVR wird in einen Deep Sleep Modus versetzt aus dem man nur mit einem Low Level Triggered Interrupt rauskommt. Dh. PD1,PD0 werden mit PullUps auf Eingang gesetzt und deren Low Level INTs aktiviert. PD4,PD5 (die keinen solchen IQR unterstützen) als Ausgänge auf Low Level. Nun geht der AVR in den Sleep Modus. Wird eine der 4 Tasten betätigt so wird einer der zwei Low Level IRQs an PD1/PD0 die MCU aufwecken. Nun wird zur Auswertung bei zB. PD0-IRQ die Pins PD4 und PD5 nacheinander von Low-Level auf High-Z Input programmiert und gleichzeitig PD0 abgefragt. So hat man 4 Taster die auf 2 Low-Level IRQs gemappt sind und damit den AVR aufwecken können. Und man kann jede der Kombinationen über vier Taster gleichzeitig drücken und unterscheiden. Geschickt würde ich sagen da eben diese Low-Level-Triggered Eingänge bei AVRs dünn gesäht sind, heist nicht jeder Pin unterstützt das und der Pin-Change Interrupt kann den AVR nicht aus den tiefen Sleep Modis aufwecken. Gruß hagen
:
Bearbeitet durch User
Das geht auch einfacher. Man benötigt nur einen Pin wie PD0 mit PullUp und Low-Level-IRQ Feature. Alle anderen Pins gehen über einen Taster an diesen gemeinsammen Input. Die MCU wird bei Low-Level am Pin PD0 aufgeweckt und ruft die PD0 Low-Level-ISR auf. In dieser werden dann alle Taster-Pins auf High-Z geschaltet und nacheinander abgefragt indem man sie auf Low-Level-Ausgang setzt. So benötigt man nur einen Pin und dessen Low-Level-IRQ samt ISR, statt wie oben eben zwei solcher ISRs. Gruß Hagen
Danke für die ausführliche Erklärung. Das macht Sinn.
Hagen R. schrieb: > Der AVR wird in einen Deep Sleep Modus versetzt aus dem man nur mit > einem Low Level Triggered Interrupt rauskommt. Es gibt 8 Interruptpins bzw. fast alle Pins können Pin-Change-Interrupt. An den fehlenden Aufwachquellen liegt es daher nicht. Vermutlich gibt es auch eine Bedieneinheit mit mehreren Tasten und dann spart die Matrixabfrage Pins. Und für die Sparvariante mit nur 4 Tasten wollte man nicht extra das ganze Programm umschreiben.
Mal eben selbst nachgeguckt...Alle Pins vom Port B können Pin change interrupts. Die verwendeten Pins vom Port D können nur teilweise external interrupt. Schon merkwürdig wieso sie nicht einfach die anderen Pins genommen haben. Kann echt aus dem genannten Grund von dir sein.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.