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