Wake-up on Change ist eine der praktischsten Funktionen, um einen PIC-Mikrocontroller im Schlafmodus zu betreiben und ihn erst bei einem echten Ereignis – zum Beispiel einem Tasterdruck – aufzuwecken. Damit lässt sich der durchschnittliche Stromverbrauch drastisch reduzieren, weil der Controller nicht in festen Intervallen „nachschauen“ muss, ob etwas passiert ist. Gleichzeitig ist diese Weckmethode besonders anwenderfreundlich: Ein Benutzer drückt einen Taster, der PIC wacht auf, führt eine Aktion aus und geht anschließend wieder in den Sleep zurück. In der Praxis scheitern solche Designs jedoch häufig an Details: schwebende Eingänge, falsch konfigurierte Pull-ups, Prellprobleme, unerwartete Interrupt-Flags oder eine Weckquelle, die zwar den Schlaf beendet, aber sofort wieder einen Interrupt auslöst. Wer Wake-up on Change: Den PIC durch Tasterdruck aufwecken sauber umsetzt, erhält dagegen ein robustes, reproduzierbares Verhalten – ideal für batteriebetriebene Geräte, Bedienfelder, Datenlogger oder einfache IoT-Knoten. In diesem Artikel erfahren Sie systematisch, wie Wake-on-Change bei PICs funktioniert, welche Hardware-Beschaltung sich bewährt, wie Sie Prellen und Mehrfach-Weckereignisse beherrschen und wie Sie die Firmware so strukturieren, dass der PIC zuverlässig auf Tastendrücke reagiert und anschließend wieder sicher in den Tiefschlaf wechselt.
Was bedeutet „Wake-up on Change“ bei PIC-Mikrocontrollern?
Unter „Wake-up on Change“ versteht man die Fähigkeit des Mikrocontrollers, aus dem Schlafmodus aufzuwachen, sobald sich der Pegel an einem dafür vorgesehenen Eingang ändert. Das Ereignis ist dabei keine periodische Zeitbasis (wie ein Timer), sondern ein externer Zustandswechsel, typischerweise ausgelöst durch einen Taster, einen Reed-Kontakt, einen Sensor-Ausgang oder eine Leitung, die von einem zweiten Baustein gesteuert wird.
Wichtig ist die Unterscheidung zwischen:
- Externer Interrupt (INTx): häufig an einen bestimmten Pin gebunden, oft flankengesteuert (steigend/fallend).
- Interrupt-on-Change (IOC): mehrere Pins können Pegeländerungen melden; je nach PIC-Familie lassen sich positive und negative Flanken getrennt aktivieren.
- Port-Change-Wake-up: Bei manchen Geräten ist das Aufwachen aus Sleep eng mit dem IOC-Mechanismus verknüpft.
Für Taster ist IOC besonders attraktiv, weil Sie nicht auf einen einzigen dedizierten Interrupt-Pin festgelegt sind und mehrere Tasten an einem Port abfragen können.
Welche PIC-Familien unterstützen Wake-on-Change und wie unterschiedlich ist das?
PIC ist kein einzelner Mikrocontroller, sondern eine große Familie. Die Funktionalität rund um Interrupt-on-Change unterscheidet sich je nach Serie und Generation. Bei vielen PIC16/PIC18-Geräten gibt es IOC-Register, die pro Pin das IOC aktivieren, zusätzlich dazu oft getrennte Register für steigende/fallende Flanken. Bei neueren Geräten sind die Möglichkeiten meist feiner granulierbar, während ältere Typen mit Einschränkungen arbeiten (z. B. nur ein Port oder nur bestimmte Pins).
Für die Praxis bedeutet das:
- Prüfen Sie im Datenblatt den Abschnitt „Interrupt-on-Change“ oder „IOC“ (manchmal auch „Port Change Interrupt“ genannt).
- Verifizieren Sie, ob Wake-up aus Sleep durch IOC unterstützt wird und ob zusätzliche Bedingungen gelten (z. B. globale Interrupts, bestimmte Flags).
- Planen Sie das Pinout so, dass der gewünschte Taster an einem IOC-fähigen Pin liegt.
Wenn Sie mit MPLAB X und XC8 arbeiten, sind die Device-Daten und Header-Definitionen ein guter Startpunkt, ersetzen aber nicht die Datenblattprüfung. Als Einstieg in die Toolchain eignen sich MPLAB X IDE und die MPLAB XC Compiler-Übersicht.
Hardware-Grundlagen: Tasterbeschaltung, Pull-ups und definierte Pegel
Der wichtigste Erfolgsfaktor bei Wake-up on Change ist ein sauber definierter Pegel am Eingang – sowohl im Ruhezustand als auch während des Tastendrucks. Ein schwebender Eingang (floating) führt zu zufälligen Pegelwechseln, die den PIC ungewollt wecken oder den Stromverbrauch erhöhen. Deshalb braucht jeder Tastereingang eine definierte Beschaltung.
Typische Schaltung: Taster nach GND mit Pull-up
Ein sehr gängiges Muster ist: Der Pin wird über einen Pull-up nach VDD gezogen und der Taster verbindet den Pin beim Drücken nach GND. Vorteile: Der „nicht gedrückt“-Zustand ist logisch HIGH, das Signal ist robust, und viele PICs bieten interne Pull-ups, die den Bauteileaufwand reduzieren können.
- Externer Pull-up: z. B. 10 kΩ bis 100 kΩ, abhängig von EMV-Anforderungen und Strombudget.
- Interner Pull-up: spart Bauteile, ist aber oft weniger präzise in der Widerstandshöhe und muss per Register aktiviert werden.
- Entstörkondensator: optional (z. B. 1 nF bis 100 nF), kann Prellen und Störungen reduzieren, muss aber zum Wake-Konzept passen.
Wichtig: Je kleiner der Pull-up-Widerstand, desto höher der Strom beim Tastendruck. Für Batteriegeräte ist ein höherer Widerstand attraktiv, allerdings steigt dann die Störempfindlichkeit. Eine häufig sinnvolle Balance liegt im Bereich 47 kΩ bis 100 kΩ – abhängig von Layout, Umgebung und Leitungslängen.
Prellen verstehen: Warum ein Tastendruck viele Pegeländerungen erzeugt
Mechanische Taster prellen. Das bedeutet: Beim Drücken oder Loslassen entstehen innerhalb weniger Millisekunden mehrere schnelle Umschaltungen zwischen HIGH und LOW. Für Wake-up on Change ist das zweischneidig: Einerseits reicht bereits eine Pegeländerung zum Aufwachen. Andererseits kann Prellen direkt nach dem Wake mehrere IOC-Interrupts auslösen, die Ihre Firmware in einen unerwünschten Pfad treiben oder verhindern, dass der PIC wieder einschläft.
Die typische Prellzeit liegt oft im Bereich von 1 ms bis 20 ms, je nach Tasterqualität. In dieser Zeit kann der Eingang mehrere Flanken erzeugen. Ein robustes Design berücksichtigt das in Hardware oder Firmware – idealerweise in beiden.
Wake-up-Verhalten: Was passiert genau, wenn der PIC aufwacht?
Wenn der PIC im Sleep ist und ein IOC-Ereignis auftritt, wird der Schlafmodus beendet. Dabei sind zwei Dinge relevant:
- Wake-up: Der Core läuft wieder an, Taktquellen werden aktiv (je nach Konfiguration).
- Interrupt-Flags: Das IOC-Flag wird gesetzt. Je nach Konfiguration wird anschließend auch die ISR ausgeführt oder das Flag bleibt pending, bis Interrupts global aktiviert sind.
In vielen Fällen ist das IOC-Flag nach dem Aufwachen bereits gesetzt, bevor Ihr Code den Pinzustand ausliest. Das ist grundsätzlich richtig – aber Sie müssen damit umgehen, dass das Flag durch Prellen mehrfach gesetzt werden kann oder dass es nach dem Wake zunächst „kleben bleibt“, wenn die Port-Lese- oder Clear-Sequenz nicht stimmt.
Firmware-Architektur: Zwei bewährte Ansätze
In der Praxis haben sich zwei stabile Muster etabliert, um einen PIC per Tastendruck aufzuwecken:
- ISR setzt nur ein Flag: Die IOC-ISR ist kurz, setzt ein Software-Flag (z. B.
button_event = 1;) und beendet sich. Die Entprellung und Logik läuft im Mainloop. - ISR mit schneller Entprell-Startlogik: ISR deaktiviert IOC für diesen Pin, startet einen Timer (oder merkt sich einen Timestamp) und lässt erst nach Ablauf der Prellzeit wieder Ereignisse zu.
Für 8-Bit-PICs ist „ISR setzt nur ein Flag“ oft die robusteste und wartbarste Variante, weil sie ISR-Laufzeiten klein hält und Timingrisiken reduziert.
Entprellen in Firmware: Zeitbasiert und zuverlässig
Ein gängiger softwarebasierter Ansatz ist die zeitbasierte Entprellung. Dabei wird nach dem ersten Ereignis eine Wartezeit eingehalten, bevor der Tastenzustand als gültig akzeptiert wird. Das kann mit einem Timer-Tick oder einem einfachen Delay erfolgen – wobei Delay im Low-Power-Kontext oft unattraktiv ist, weil es den PIC aktiv hält.
Low-Power-Entprellen ohne lange Busy-Waits
- Kurzer Aktivmodus: PIC wacht auf, liest Pin, startet einen Timer und geht in Idle oder in einen leichteren Sleep, bis der Timer abläuft.
- Einmalige Verzögerung mit minimalem Aufwand: Wenn der Anwendungsfall es erlaubt, kann eine kurze Verzögerung im Millisekundenbereich akzeptabel sein – insbesondere wenn die Taste selten gedrückt wird.
- State Machine: Zustände wie „Woke“, „Debounce“, „Pressed“, „Released“ machen das Verhalten klar und testbar.
Das Ziel ist, nach einem Wake nicht unnötig lange im Vollbetrieb zu bleiben. Wenn µA-Durchschnittsströme wichtig sind, sollte die Entprellung so gestaltet sein, dass der PIC möglichst schnell wieder in einen Sleep-kompatiblen Zustand gelangt.
IOC korrekt konfigurieren: Häufige Stolperfallen
Der wichtigste Teil ist die richtige Registerkonfiguration. Die konkrete Registerbezeichnung hängt vom PIC ab, aber die Logik ist ähnlich:
- Pin als Eingang konfigurieren: Richtung (TRIS) korrekt setzen.
- Digital/Analog festlegen: Falls der Pin multiplexed ist: analoge Funktion deaktivieren oder bewusst setzen, damit der digitale Eingang wirklich arbeitet.
- Pull-up aktivieren: intern oder extern, aber eindeutig.
- IOC für den Pin aktivieren: ggf. getrennt für steigende und fallende Flanken.
- IOC-Flag initial löschen: vor dem Sleep, damit ein altes Ereignis nicht sofort „nachläuft“.
- Globale Interrupts: je nach Architektur müssen globale Interrupts und Peripheral-Interrupts passend aktiviert sein.
Ein typischer Fehler ist, dass ein IOC-Flag gesetzt bleibt, weil das Port-Latch nie gelesen wird oder weil die Clear-Sequenz falsch ist. Bei manchen PICs ist ein Lesezugriff auf den Port notwendig, um die „Mismatch“-Bedingung zu beseitigen. Das gehört zu den klassischen Datenblatt-Details, die man nicht überspringen sollte.
Wecklogik für mehrere Taster: Skalierbar ohne Chaos
Wenn mehrere Taster über IOC wecken sollen, ist eine klare Strategie wichtig, um nach dem Wake die Ursache zu identifizieren und gleichzeitig Prellen zu kontrollieren.
- Port-Snapshot: Direkt nach dem Wake den gesamten Port in eine Variable lesen und später auswerten.
- Maske je Pin: Für jeden Taster eine Bitmaske und eine Zustandsvariable.
- Einheitliche Entprellroutine: Ein Debounce-Modul, das pro Taster Zeitfenster verwaltet.
So vermeiden Sie, dass Sie pro Taste Sonderlogik in die ISR schreiben. Je einfacher die ISR, desto geringer das Risiko von Timingproblemen – besonders, wenn der PIC aus einem tiefen Sleep aufwacht und die Systemuhr erst stabilisiert werden muss.
Sleep-Übergang: Vor dem Schlafen richtig „aufräumen“
Damit Wake-up on Change zuverlässig funktioniert und gleichzeitig der Stromverbrauch niedrig bleibt, sollte der Übergang in den Sleep strukturiert sein. Eine robuste Sequenz umfasst typischerweise:
- Alle nicht benötigten Peripherien deaktivieren (ADC, Komparatoren, Referenzen, Kommunikationsmodule).
- Pinzustände prüfen (keine Floating Inputs, keine Ausgänge gegen externe Treiber).
- IOC-Flags löschen und Portzustand lesen (je nach Controlleranforderung).
- Nur die gewünschten Wake-Interrupts aktiv lassen.
- Sleep ausführen.
Diese Checkliste verhindert „Phantom-Wakes“, also ungewolltes Aufwachen, das häufig durch Störungen, Restflags oder schwebende Leitungen verursacht wird.
EMV und Störungen: Warum Wake-on-Change im Feld anders sein kann
Im Labor funktioniert Wake-up on Change oft sofort. Im Feld, bei langen Leitungen, Motoren in der Nähe oder hoher EMV-Belastung, kann ein Tastereingang als Antenne wirken. Dann führen Störspitzen zu falschen Weckereignissen. Gegenmaßnahmen:
- Saubere Pull-up-Dimensionierung: zu hohe Widerstände erhöhen die Störempfindlichkeit.
- RC-Filter: Ein kleiner Kondensator am Eingang kann hochfrequente Störungen dämpfen (mit Blick auf Reaktionszeit).
- Schmitt-Trigger-Eingänge nutzen: Falls verfügbar, sind sie deutlich robuster gegen langsame Flanken und Rauschen.
- Leitungsführung: Kurze Leitungen, Massebezug, ggf. abgeschirmte Leitungen.
Für robuste Geräte ist es sinnvoll, Wake-on-Change nicht als „einfaches Feature“, sondern als Teil eines EMV-gerechten Eingangsdesigns zu betrachten.
Mess- und Debug-Tipps: Wake-Ereignisse sichtbar machen
Wake-Probleme sind häufig „zu schnell“, um sie nur per Debugger zu verstehen. Mit einfachen Mitteln können Sie das Verhalten sichtbar machen:
- GPIO-Marker: Setzen Sie einen Pin beim Eintritt in die ISR und löschen Sie ihn danach. Das zeigt Prell-Frequenz und ISR-Laufzeit am Logic Analyzer.
- Event-Zähler: Zählen Sie IOC-Events und geben Sie den Zähler periodisch über UART aus.
- Port-Snapshots loggen: Speichern Sie den Portzustand direkt nach Wake und später ausgeben.
- Sleep-Zeitprofil: Messen Sie den Stromverlauf, um zu erkennen, ob der PIC wirklich schläft oder durch wiederholte Wakes aktiv bleibt.
Gerade für Low-Power-Projekte ist die Strommessung oft aussagekräftiger als die reine Codeanalyse: Wenn der PIC alle paar Millisekunden aufwacht, sehen Sie das sofort im Stromprofil.
Typische Fehlerbilder und schnelle Diagnosen
- Der PIC wacht sofort wieder auf: IOC-Flag nicht korrekt gelöscht, Port nicht gelesen, Eingang floating oder Störung auf der Leitung.
- Der PIC wacht nicht auf: Falscher Pin (kein IOC), Pin im Analogmodus, falsche Pull-Beschaltung, Interrupts nicht korrekt aktiviert.
- Mehrfachauslösung pro Tastendruck: Prellen, fehlende Sperrzeit, IOC nicht temporär deaktiviert.
- Hoher Sleep-Strom trotz Sleep: Pull-ups zu niederohmig, externe Baugruppe zieht Strom, Debugger/Adapter verursacht Rückstrom, Analogblöcke aktiv.
Wenn Sie systematisch vorgehen (Hardware-Pegel prüfen, IOC-Flags kontrollieren, Prellen sichtbar machen), lassen sich diese Probleme meist schnell eingrenzen.
Outbound-Links für weiterführende Informationen
- MPLAB X IDE – Entwicklungsumgebung für PIC-Projekte
- MPLAB XC Compilers – XC8/XC16/XC32 Überblick
- Entprellen – Grundlagen zu Tasterprellen und Gegenmaßnahmen
- Interrupt – Einordnung und Prinzipien in eingebetteten Systemen
- Pull-up Resistor – Dimensionierung und Wirkung
IoT-PCB-Design, Mikrocontroller-Programmierung & Firmware-Entwicklung
PCB Design • Arduino • Embedded Systems • Firmware
Ich biete professionelle Entwicklung von IoT-Hardware, einschließlich PCB-Design, Arduino- und Mikrocontroller-Programmierung sowie Firmware-Entwicklung. Die Lösungen werden zuverlässig, effizient und anwendungsorientiert umgesetzt – von der Konzeptphase bis zum funktionsfähigen Prototyp.
Diese Dienstleistung richtet sich an Unternehmen, Start-ups, Entwickler und Produktteams, die maßgeschneiderte Embedded- und IoT-Lösungen benötigen. Finden Sie mich auf Fiverr.
Leistungsumfang:
-
IoT-PCB-Design & Schaltplanerstellung
-
Leiterplattenlayout (mehrlagig, produktionstauglich)
-
Arduino- & Mikrocontroller-Programmierung (z. B. ESP32, STM32, ATmega)
-
Firmware-Entwicklung für Embedded Systems
-
Sensor- & Aktor-Integration
-
Kommunikation: Wi-Fi, Bluetooth, MQTT, I²C, SPI, UART
-
Optimierung für Leistung, Stabilität & Energieeffizienz
Lieferumfang:
-
Schaltpläne & PCB-Layouts
-
Gerber- & Produktionsdaten
-
Quellcode & Firmware
-
Dokumentation & Support zur Integration
Arbeitsweise:Strukturiert • Zuverlässig • Hardware-nah • Produktorientiert
CTA:
Planen Sie ein IoT- oder Embedded-System-Projekt?
Kontaktieren Sie mich gerne für eine technische Abstimmung oder ein unverbindliches Angebot. Finden Sie mich auf Fiverr.

