
ATtiny13-Mutteruhr
von Ralf Beesner, DK5BU
Elektronik-Labor Projekte AVR
Allein unter Nicht-Elektronikern
In
der Firma wird man von Kolleginnen und Kollegen ja auch gern zu
Elektronikproblemen aus dem privaten Bereich befragt. Neulich kam ein
Kollege mit einer TN (Telefonbau+Normalzeit)-Tochteruhr in
Sahnetortengröße; sie hatte ihn zwar nichts gekostet; er war
aber ziemlich enttäuscht, als sie nach Anlegen von 12 V
Gleichspannung nur einmal zuckte, statt loszulaufen.
Ich wusste
auch nur, dass die Dinger externe Minutenimpulse von einer Mutteruhr
erwarten. Hässlicherweise sind das keine Gleichstromimpulse mit 12
V bzw. 24 V, sondern beim Ausprobieren stellte ich fest, dass die
Minutenimpulse mit jeweils wechselnder Polarität angelegt werden
müssen. Wikipedia beschreibt das Funktionsprinzip:
http://de.wikipedia.org/wiki/Lavet-Schrittmotor
Mit einem
Mikrocontroller kann man das Problem der Signalerzeugung mit wenigen
Zeilen Bascom-Code erschlagen. Auch die wechselnde Polarität
könnte man einfachst erzeugen, wenn man die Uhr mit ihren beiden
Anschlüssen an zwei Portpins legt und diese immer wechselseitig
auf High und Low legt. Leider läuft die Uhr nicht mit 5 V, sondern
wird erst bei 7 V oder 8 V lebendig; darum wird es dann doch
komplizierter.
Die "phantasielose" Lösung wäre die
Verwendung eines Netzteils mit zwei Betriebsspannungen (5 V und 12 V)
und einer Transistor-Brückenschaltung, die nebenbei auch die
Pegelanpassung 5 V / 12 V übernimmt. Die Brücke könnte
mit diskreten Transistoren aufgebaut werden, es müsste sich aber
auch ein Schrittmotor-Ansteuer-IC wie das L293D eignen, das etliche
periphere Bauteile spart, weil es gegen Kurzschluss und
Überspannung (Selbstinduktion der Uhrenspule) gesichert ist. Um es
etwas spannender zu machen, wollte ich aber versuchen, mit 6 V
Batteriespannung auszukommen.
Der erste Anlauf ging schief...
Ich
versuchte mich zunächst an einer Schaltung, die mit zwei
abwechselnd aktivierten PWM-Ausgängen eines ATtiny 25, zwei
Villard-Spannungsvervielfacherschaltungen und möglichst wenig
Umschaltmimik mindestens +/-8 V erzeugen sollte. Mit Schaltdioden
ließen sich die Signale wechselnder Polarität jedoch nicht
zusammenführen; es kam dabei immer ein Kurzschluss heraus. Und die
Verwendung von Schalttransistoren drohte relativ aufwendig zu werden,
da Spannungspegel jenseits von 0 V bzw. 5 V eine komplizierte
Ansteuerung erfordern würden.
Da der Strombedarf der Uhr
relativ gering ist (10 mA bei 12 V), bot sich jedoch an, einen
RS232-Pegelwandler MAX232 zweckentfremdet einzusetzen.
Quarzoszillator
Erledigt
ein MAX232 die Spannungswandlung, hat der Mikrocontroller nicht mehr
viel zu tun; er braucht nur mit einem einzelner Timer aus einer
quarzstabilisierten Frequenz periodische Interrupts zu erzeugen, auf
denen die Zeitberechnung aufbaut, und er muss dann einmal pro Minute
mit einem bzw. zwei Ports "wackeln".
Da nur noch ein Timer
erforderlich ist, kam statt eines ATtiny25 der ATtiny13 ins Blickfeld,
der mir wegen des LP Mikrocontroller "ans Herz gewachsen ist". Jedoch
lässt sich der ATtiny 13 nicht im Quarzoszillator-Modus betreiben.
Aber da ich schon immer mal einen ATtiny 13 mit externem Oszillator
betreiben wollte, war dies eine gute Gelegenheit.
Es stellte
jedoch sich heraus, dass es nicht gar nicht so einfach ist,
Low-Power-Quarzoszillatoren mit großem Ausgangsspannungshub zu
bauen. Die meist verwendete Pierce-Schaltung (Details findet man
auf Wikipedia) machte mit einem Kollektorwiderstand von 33 kOhm
(Basiswiderstand 2,2 MOhm) nur noch ca. 200 mV SS Ausgangssignal; ein
Verstärker bzw. Impulsformer hätte weiteren Aufwand und Strom
gekostet.
Mehr Erfolg hatte ich jedoch mit
32768-Hz-Uhrenquarzen. Da sie nicht als Dickenschwinger arbeiten,
sondern wie eine Stimmgabel schwingen, ist ihr elektrisches Verhalten
völlig anders. Ihr Serienresonanzwiderstand liegt bei 30 -50 kOhm,
der von Dickenschwingern bei einigen hundert Ohm.
Wegen des
hohen Resonanzwiderstands schien es mir es ziemlich aussichtslos, sie
in einstufigen Oszillatoren zum schwingen zu bekommen.
Überraschend gut schwingen sie jedoch in einer
Multivibrator-Schaltung, in der einer der Koppelkondensatoren durch den
Uhrenquarz ersetzt wird.
Mit Kollektorwiderständen von 39
kOhm setzen die Schwingungen bei etwa 1 V ein, und man könnte die
Kollektorwiderstände noch deutlich vergrößern (und den
Stromverbrauch weit unter 100 µA drücken). Aber für die
vorgesehene Anwendung sind 100 µA gut genug.
Da die
Schaltung so schwingfreudig und hochohmig ist, muss man sie halbwegs
kapazitätsarm aufbauen, sonst besteht die Gefahr, dass sie auch
ohne den Quarz parasitär schwingt (auf dem Steckbrett reichte die
Parasitärkapazität zweier nebeneinander liegender
Kontaktreihen).
Übrige Hardware
Der
Quarzoszillator genehmigt sich ständig 100 µA Strom; der
ATtiny13 verbraucht im Idle-Modus 300 µA. Der MAX232
benötigt zwar unter Last 25 mA, wird aber nur 0,8 Sekunden pro
Minute aktiviert.
Das sind pro Jahr etwa 7 Ah. Das ist recht
viel für Mignonzellen, passt aber gut zu 6-V-Laternenbatterien,
die es z.Zt. bei Reichelt ab EUR 2,20 gibt.
Die
Stromversorgung erfolgt daher aus einer solchen Laternenbatterie. Da
sie in "frischem" Zustand eine Leerlaufspannung von etwas über 6 V
hat und die ICs nur max. 6 V vertragen, liegt eine Diode 1N4001 in
Reihe, die 0,7 V vernichtet und nebenbei den Verpolungsschutz
übernimmt.
Der
Quarzoszillator wurde bereits beschrieben. Da es bei der Inbetriebnahme
der Uhr "nervt", auf die Minutenimpulse zu warten, kann man über
den Taster S1 die Mutteruhr in einen 2-Sekunden-Zeitraffer-Modus
versetzen; der Taster liegt an PB1.
Das Signal an PB0 legt die
Polarität des Ausgangssignals fest. PB3 und PB4 schalten die
Betriebsspannung für den MAX232. Eigentlich kann ein einzelner
Ausgang bis zu 40 mA liefern; die Spannung ist aber bei zwei parallel
geschalteten Ausgängen etwas höher.
Der MAX232
arbeitet nicht nur als Ladungspumpe und 2-Kanal-Pegelwandler, sondern
stellt auch über einen seiner RS232-Eingangssignal-Wandler (Pin 8
zu Pin 9) einen Inverter bereit. So wird nur ein
Mikrocontroller-Ausgang benötigt, um die MAX232-Pegelwandler
gegenphasig anzusteuern.
Familienbande
Im
Leerlauf erzeugt der MAX232 ein Ausgangssignal von +/-9 V. Leider
bricht die Spannung unter Last deutlich zusammen. Bei meinem Exemplar
sind es bei 4,5 V Batteriespannung nur noch +3 V / -4 V. Die Uhr wird
also stehen bleiben, wenn die Batterie unter 4,5 V absackt; die
Batterie ist dann leider noch nicht komplett entladen.
Das
MAX232-Datenblatt spricht etwas unspezifisch davon, dass der MAX232
kurzschlussfest mit einer Strombegrenzung auf ca. 10 mA ist. Neben dem
MAX232 wird jedoch ein ganzer "`Zoo"' ähnlicher ICs angeboten, bei
denen zwar auch nur 10 mA garantiert werden, als Maximalwert aber
größere Ströme angegeben sind. Der (deutlich teurere)
MAX 3232 kann laut Datenblatt je nach Exemplar bis zu 60 mA liefern.
Mit ihm waren die Ausgangsspannungen deutlich höher.
Software
Im
Prinzip kann man den AtTiny 13 mit einem geeigneten Flash-Programm wie
z.B. avrdude auf externen Takt umfusen und so komplett aus dem
32-kHz-Takt betreiben. Einfacher ist es jedoch, den AtTiny 13-Takt
weiterhin durch den internen RC-Oszillator zu erzeugen und lediglich
Timer0 mit dem externen Takt zu versorgen.
Aus
Stromspargründen beträgt die Taktfrequenz des
Mikrocontrollers 4,8 MHz / 8 = 600 kHz (interner RC-Oszillator). Der
externe 32 kHz-Oszillator liegt an Timereingang T0. Da es für
diesen Eingang keinen Vorteiler gibt, gehen die Impulse direkt an
Timer0, der die 32 kHz maximal durch 256 teilen kann und somit
128 mal pro Sekunde einen Interrupt auslöst, wenn er
überläuft.
Da Bascom keinen Config-Befehl für
externe Taktquellen kennt, werden die Timer0-Register TCRR0A, TCRR0B
und TIMSK0 direkt gesetzt.
Pro Interrupt wird die Variable S
inkrementiert; beim Stand von 128 * 60 = 7680 ist eine Minute
verstrichen. Dann wird S auf 0 gesetzt und die Ausgänge für
400 ms geschaltet. Die Variable T wird einmal pro Minute
getoggelt und sorgt dafür, dass bei jedem Minutenimpuls die
Polarität gewechselt wird.
Wird der Taster S1 gedrückt, wird der Minutentakt auf 2 Sekunden herabgesetzt.
Download:
Dieser Artikel als PDF
Software
' Attiny-13-Mutteruhr
' Dient zur Anstuerung von Tochteruhren mit Minutenschaltung
'
' Ein mal pro Minute wird ein Impuls von 400 ms Dauer erzeugt. Die Polaritaet muss
' bei jedem Impuls gewechselt werden (Brückenschaltung mit MAX232)
' Durch einen Taster kann in einen Testmodus umgeschaltet werden; die Minutenimpulse
' kommen dann alle 2 sec.
'
'
' Pinbelegung:
'
' PB0: Minuten- Ausgang
' PB1: Taster fuer Testmodus
' PB2: Eingang 32 kHz- Oszillator
' PB3 + PB4: Betriebsspannung Max232
'
' 32768 / 356 = 128
' -> 128 Interrupts / sec
' benoetigt wird Minutentakt
' -> 128 * 60 = 7680
' da Oszillator etwas zu langsam (20 sec / Tag): Überlauf bei 7678 statt 7680
'
'----------------------------------------------------------
$regfile = "Attiny13.dat"
$crystal = 600000 ' gefust auf 4,8 MHz / 8
$hwstack = 36
$swstack = 4
$framesize = 4
' Variablen fuer Zeitberechnung
Dim S As Word ' Zaehler 1/128 Sekunden
Dim T As Bit ' T togglebit
Dim C As Word ' Vergleichswert für Zaehler
Portb = &B00000010 ' Pullup für Eingang PB1
Ddrb = &B00011001 ' PB0 Takt fuer Max232, PB3 und 4 schalten Versorgung Max232
' Stromspar- Funktionen nutzen
Acsr.acd = 0 ' Analog-Komparator ausschalten
' Timer zu Fuss konfigurieren:
Tccr0a = 0 ' Betrieb als Zaehler bis 255; einfach nur Überlauf
Tccr0b = &B00000110 ' externer Takt an TO; falling edge
Timsk0 = &B00000010 ' Interruptquelle: Counter0 overflow
Sreg.7 = 1 ' Interrupts global freigeben
On Timer0 Ontimer0 ' Interrupt-Routine für Timer0-Overflow
'----------------------------------------------------------
Portb.3 = 1 ' Betriebsspannung für MAX232 einschalten
Portb.4 = 1
Wait 2 ' abwarten, damit die Ladungspumpe die Kondensatoren laedt
Portb.3 = 0 ' Betriebsspannung für MAX232 ausschalten
Portb.4 = 0
Do ' Hauptschleife
If Pinb.1 = 0 Then
C = 254 ' statt Minuten- Modus 2sec- Modus (Test)
Else
C = 7677 ' 1 Min- Modus incl. Korrekturfaktor, da Oszillator zu langsam
End If
If S > C Then ' Minutenzaehler uebergelaufen
S = 0 ' Zähler zurücksetzen
Toggle T ' Togglebit umschalten
If T = 0 Then
Portb.0 = 1 ' MAX232 soll Polaritaet A ausgeben
Portb.3 = 1 ' Betriebsspannung MAX232 ein
Portb.4 = 1
Waitms 400
Portb.3 = 0 ' Betriebsspannung MAX232 aus
Portb.4 = 0
Portb.0 = 0
Else
Portb.0 = 0 ' MAX232 soll Plaritaet B ausgeben
Portb.3 = 1
Portb.4 = 1
Waitms 400
Portb.3 = 0
Portb.4 = 0
End If
End If
Idle
Loop
'--- Interrupt- Routine ----------------------------------
Ontimer0:
Incr S
Return
Elektronik-Labor Projekte AVR