Eine naheliegende Verwendung für den Sparrow ist der Einsatz als Kurzzeit-Timer
(für längere Zeitmessungen ist der eingebaute RC-Taktoszillator zu ungenau).
Ein einfaches Programm, der Tee-Timer, wurde bereits von Leander Hackmann geschrieben:
Meine etwas aufwendigere Version nutzt die Energiesparmöglichkeiten des
ATtiny13 und erzeugt die Zeiten mit dem Hardware-Timer des ATtiny13, so dass
die Zeitmessung nur von der (Un-)Genauigkeit des Taktoszillators beeinflusst
wird. Außerdem lässt sich optional ein Piezoschwinger (Buzzer) an PortB.4
anschließen, der nach Ablauf des Timers einen akustischen Alarm erzeugt.
Das Programm nutzt "Pin Change Interupts". Der Controller wartet im
Tiefschlaf auf einen Tastendruck des rechten Tasters (Taster2/PinB.2), der ihn
aufweckt.
Da Programm startet dann den Hardware-Timer des ATtiny13. Da die
Timer-Interrupts aktiviert sind, ruft das Programm bei jedem Interrupt die
Routine OnTimer0 auf - zwanzig mal pro Sekunde. Bei jedem zwanzigsten Interrupt
wird die grüne LED 2 für die Dauer eines Interrupts eingeschaltet; sie blitzt
also im Sekundentakt kurz auf.
Ist die Zeit verstrichen, blinkt die rote LED 1 in schneller Folge, ausserdem
liegt ein Alarmton an PortB.4. Der Alarm wird durch Drücken des linken Tasters
beendet und der Controller geht wieder in den Tiefschlaf.
Zum Einstellen der Zeit muss man beide Taster drücken, erst den linken, dann
zusätzlich den rechten. Der Controller findet dann unmittelbar nach dem
Aufwachen den gedrückten linken Taster vor und verzweigt in die
Einstellroutine. Hier wird im 0,75-Sekunden-Takt die Weckzeit um jeweils eine
Minute erhöht, bis man die rechte Taste loslässt.
Solange der Controller an der Stromversorgung hängt, bleibt die eingestellte
Weckzeit gespeichert. Eine Batterie müsste jahrelang halten, da im Tiefschlaf
nur 20 µA (also 180 mAh pro Jahr) verbraucht werden. Ist der Brownout des
Controllers deaktiviert, sind es sogar nur 1 µA. Während der Zeitmessung
verbraucht sie unter 1 mA, bei Alarm ca. 3-4 mA.
Wichtig für einen niedrigen Stromverbrauch ist, dass die Programmierschaltung,
die etwa 1,2 mA "frisst", nicht mit Spannung versorgt wird. Die
Batteriespannung darf also nur an den mit "U" gekennzeichneten Pin
und an "-" angelegt werden.
' Kurzzeit-Timer
'
' Einstellen der Zeitdauer in Minutenschritten:
' Erst linke Taste, dann zusätzlich rechte Taste drücken. Beide LEDs blinken gleichzeitig.
' Jeder Blinkimpuls steht für eine Minute.
'
' Start des Timers: rechte Taste drücken.
' Die rechte grüne LED blinkt nun im Sekundenrythmus.
' Ist die Zeit abgelaufen, erlischt die grüne LED und die rote beginnt hektisch zu blinken.
' Schließt man an Portb.4 einen Piezoschwinger an, ertönen Warnimpulse.
' Der Alarm wird mit der linken Taste gelöscht.
' Die Schaltung kann ständig an der Batterie verbleiben, da der Controller im Powerdown nur
' einige µA verbraucht.
' Der Controller "merkt" sich dann auch die zuletzt eingestellte Zeit.
' Verwendeter Compiler: BASCOM 2.0.5 DEMO
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$regfile = "ATtiny13.dat"
$crystal = 1200000 ' Taktfrequenz: 1,2MHz
$hwstack = 8 ' nur max 4 geschachtelte Unterprogramme; spart SRAM
$swstack = 0 ' nicht benötigt; spart SRAM
$framesize = 0 ' dito
Buzzer Alias Portb.4
Led1 Alias Portb.1 ' grün, rechts
Led2 Alias Portb.3 ' rot, links
Taster1 Alias Pinb.0 ' links
Taster2 Alias Pinb.2 ' rechts
Dim Ti As Byte
Dim Sekunde As Byte
Dim Minute As Byte
Dim Weckzeit As Byte
Clkpr = 128
Clkpr = 3 ' Takt herabsetzen, falls der ATtiny mit 9,6 MHz Takt läuft
Clkpr = 3
Acsr.acd = 1 ' Analog-Komparator ausschalten, spart etwas Strom
Gimsk.5 = 1 ' Pin Change Interrupt Enable
Sreg.7 = 1 ' Global Interrupt Enable
Pcmsk.2 = 1 ' Pin Change Interrupt PB2 (Taster2) aktivieren
Ddrb = &B00011010 ' Portb.1 Portb.3 und Portb.4 Ausgang
Portb = &B00000101 ' PullUp-Widerstände an Pinb.0 und Pinb.2
Didr0 = &B00011010 ' nicht benötigte Digital- Eingänge abschalten
On Timer0 Ontimer0 ' Interrupt-Routine
Config Timer0 = Timer , Prescale = 256 ' Ergibt 20 Überläufe pro Sekunde, wenn der Tomer nicht bei 0, sondern
' bei 22 startet
'
'-------------------------------------------------------------------------------
' Hauptprogramm:
Do
Gimsk.5 = 0 ' Pin Change Interrupt ausschalten
Minute = 0
If Taster1 = 0 Then ' Wirkungsweise: PCINT2 (Taster2) weckt den Controller auf. Nur wenn
Gosub Einstellen ' er Taster1 bereits gedrückt vorfindet, wird nach "Einstellen" gesprungen ' wird in die Einstell-Routine verzweigt
Goto Schlafen
End If
If Taster2 = 0 Then ' rechter Taster
Enable Timer0
Start Timer0
Do
If Ti > 18 Then ' Sekunde um
Ti = 0
Incr Sekunde
End If
If Sekunde > 59 Then
Sekunde = 0
Incr Minute
End If
If Minute >= Weckzeit Then
Stop Timer0
Led2 = 1
Sound Buzzer , 50 , 150
Led2 = 0
Waitms 200
End If
If Taster1 = 0 Then ' linker Taster stellt Alarm ab
Goto Schlafen
End If
Loop
End If
Schlafen:
Stop Timer0
Minute = 0
Gimsk.5 = 1 ' Pin Change Interrupt wieder einschalten
' Waitms 100
Powerdown
Loop
Einstellen:
Weckzeit = 0
Do
Incr Weckzeit ' Minuten-Schritte
Led1 = 1
Led2 = 1
Waitms 100
Led1 = 0
Led2 = 0
Waitms 650
Loop Until Taster2 = 1
Wait 1
return
Ontimer0: 'Timer1-Overflow-Interrupt-Routine
Tcnt0 = 22 ' Preset auf 22, damit er 234 Takte bis Ueberlauf zählt
Incr Ti
If Ti = 1 Then
Led1 = 1
Else
Led1 = 0
End If
Return
End