Ein aufgeweckter Prozessor

Verwendung von 'power down' bei AT90Sxxxx

Schaltbild Funktion Demoprogramm

zurück zur Übersicht

 

Für Mikroprozessoranwendungen, die im Batteriebetrieb arbeiten sollen, ist die Stromaufnahme im Betrieb aber besonders auch im ausgeschalteten Zustand von großer Bedeutung. Zum Ein- und Ausschalten der Stromversorgung gibt es mehrere Möglichkeiten.

Gut:
Die komplette Schaltung wird über einen manuellen Ausschalter von der Batterie getrennt; während die Stromaufnahme im Betrieb vom verwendeten Prozessor und den angeschlossenen Verbrauchern abhängt, läßt sie sich im abgeschalteten Zustand auf Null reduzieren. Nachteil: ein vergessenes Ausschalten oder Überlast können die Batterie schnell entladen.

Besser:
Eleganter wäre es, zum Ein- und Ausschalten der Schaltung ein Flip-Flop zu verwenden und über einen entprellten Taster hin- und herzuschalten. Überlast oder Timeout können das Flip-Flop gezielt zurückzusetzen und damit das Gerät ausschalten. Verwendt man CMOS-Schaltkreise, ist die Batterieentladung bei ausgeschaltetem Gerät zu vernachlässigen; eine brauchbare Lösung. Nachteil: zusätzlicher Bauteilbedarf.

Optimal:
Prozessoren der Atmel-Serie AT90Sxxxx (ab 2kB Flash-EPROM) oder auch ATmega103 (128KB Flash-EPROM, 4KB RAM,...) eignen sich für stromsparenden Betrieb im unteren bis mittleren Leistungsbereich. Neben dem Zustand 'idle', der die Stromaufnahme stark senkt und von jedem auftretenden Interrupt beendet wird, bieten sie auch 'power down' an. Mit 'power down' wird der Quarzoszillator gestoppt, und alle internen Funktionseinheiten (I/O, RAM,...) werden eingefroren. Lediglich der interne Watchdog (verbraucht ca. 50µA, wenn aktiv) und ein pegelgetriggerter externer Interrupt können den Prozessor wieder aufwecken. Hier wird eine Schaltung nebst Programm gezeigt, die mit nur zwei zusätzlichen Bauteilen den Prozessor über seinen /INT0-Eingang mittels Taster ein- und ausschalten kann: ein Widerstand 10k und ein Kondensator 100nF. Im ausgeschalteten Zustand liegt die Stromaufnahme im nA-Bereich - internes RAM wird nicht verändert, I/O-Leitungen können ihren Zustand beibehalten ! zum Seitenanfang

Beispielhafte Realisierung der 'optimalen' Lösung:
Das Schaltbild zeigt die einfache Grundschaltung des AT90S2313; R2 und LED1 werden vom Demoprogramm angesteuert. Für die Ein-/Ausschaltfunktion sind neben dem Taster SW1 lediglich R1 und C1 erforderlich.

zum Seitenanfang

Funktion:
Nach Anlegen der Versorgungsspannung wird der Prozessor initialisiert und geht in den Zustand 'power down'. Im Ruhezustand wird /INT0 über einen prozessorinternen Pullup-Widerstand (ca. 100k) auf '1'-Pegel gehalten. Drücken des Taster SW1 zieht den Eingang /INT0 über R1 gegen GND und legt /INT0 auf '0'-Pegel, der zum Aufwecken des Prozessors erforderlich ist. Öffnen des Tasters liefert an /INT0 wieder den Ruhepegel. C1 filtert das Prellen des Tasters. Ausgehend vom schlafenden Prozessor sind folgende vier Zustände des Tasters zu unterscheiden:

  1. Schließen im Zustand 'power down': Nach dem Anschwingen des Quarzoszillators (ca. 16ms) führt der Prozessor zunächst den ausgelösten Interrupt von /INT0 aus und anschließend sein normales Programm fort: 'loop:'. Die Interruptroutine programmiert die Interruptauslösung von negativ-pegelgetriggert auf positiv-flankengetriggert um. Beim Öffnen des Tasters wird dann erneut die Interruptroutine aufgerufen.
  2. anschließendes Öffnen des Tasters: Der Prozessor arbeitet bereits sein normales Programm ab. Die positive Flanke an /INT0 löst die Interruptroutine aus. Hierbei wird lediglich die Interruptauslösung von positiv-flankengetriggert auf negativ-flankengetriggert umgeschaltet, um den Prozessor fürs Ausschalten vorzubereiten.
  3. Schließen bei laufendem Prozessor: Die negative Flanke an /INT0 triggert die Interruptroutine, die alle zusätzlichen Interruptquellen sperrt und die I/O-Leitungen auf einen definierten '1' Pegel legt. Hierdurch werden offene Eingänge vermieden (Querströme). Abschließend wird die Interruptauslösung von positiv-flankengetriggert auf negativ-flankengetriggert umgeschaltet.
  4. anschließendes Öffnen des Tasters: Die Interruptroutine löscht ihr eigenes /INT0-enable-bit. Das Bit wird vom laufenden Programm abgefragt und löst einen Sprung zur Marke 'schlafen:' aus, sobald es gelöscht ist. Wie nach einem Reset des Prozessors wird die /INT0-Interruptauslösung auf negativ-pegelgetriggert programmiert und der Prozessor mit einer 'sleep'-Anweisung gestoppt. zum Seitenanfang

Im Demoprogramm werden nach 'reset:' und in der 'int0:'-Routine die Routinen 'c_laden:' bzw. 'c_entladen:' aufgerufen. Diese laden C1 aktiv auf den Pegel auf, der zur Auslösung des Interrupts geführt hat. Die Eingangs-Hysterese von /INT0 wird hiermit zusätzlich vergrößert. Das Demoprogramm zeigt zum einen, wie sich ein Programm selbst beenden kann - nach 20 x Blinken legt sich der Prozessor schlafen - und zum anderen, wie 'sleep'-Befehle im normalen Programmablauf verwendet werden können. Die Routine 'wait10:' wartet mittels 'sleep' auf Interrupts vom T0. Aufpassen: 'sleep' darf nur ausgeführt werden, wenn /INT0-enable noch aktiv ist, anderfalls gäbe es keinen Interrupt mehr, der den Prozessor aufwecken könnte.

Das Demoprogramm läuft auch auf einem AT90S1200; wird der interne Oszillator aktiviert, ist kein externer Quarzoszillator notwendig. Das Quellprogramm ist für IAR-Assembler geschrieben. AVRASM von Atmel erfordert ein paar Änderungen. Die Assembler findet man hier zum download. Zum schnellen Probieren kann auch avr_on.hex verwendet werden. Wie man den AT90S2313 effizient programmiert wird hier gezeigt.

Fragen, Tipps, Kontakt:

zum Seitenanfang zurück zur Übersicht