Sparrow-Kurzzeit-Timer         

von Ralf Beesner                     
      
Elektronik-Labor  Projekte  AVR  Sparrow  Contest          




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.


Download: Sparrow_Kurzzeit_Timer.zip  
Direkt laden: http://tiny.systems/categorie/cheepit/KurzzeitTimer.html

' 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



Elektronik-Labor  Projekte  AVR  Sparrow Contest