Sparrow-Ereigniszähler
Im Beitrag T13-Vorteiler
hatte ich eine kleine Schaltung beschrieben, die dann doch nicht zum
Einsatz kam. aber sie lieferte die Idee für einen Ereigniszähler mit
minimalem Hardwareaufwand. Die Ausgabe erfolgt (statt mit einem LCD)
akustisch und/oder optisch (Blinken).
Da der Code in einen ATtiny13 paßt und für die optische
Ausgabe zwei LEDs verwendet werden, bot es sich an, die
Hardwarebeschaltung am Sparrow zu orientieren; man kann einen Sparrow
einsetzen, kann aber auch die Schaltung um einen "normalen" ATtiny 13
herum bauen.
Das Zählsignal hat auch hier 24V-Pegel und der Controller wird
ebenfalls aus einer 3V-Quelle gepeist; man kann aber auch den
Spannungsteiler am Zähleingang auf andere Spannungen abändern oder z.B.
einen Optokoppler verwenden.
Hardware
Ein Sparrow muß lediglich mit dem Piezo-Schallgeber (sofern man
nicht auf die akustische Ausgabe verzichtet), dem
Eingangsspannnungsteiler R1/R2 und dem Elko C1 beschaltet werden.
Die Sparrow-Kompatibilität erfordert eine kleine
Schaltungsänderung gegenüber dem T13-Vorteiler: beim Sparrow ist PinB.0
mit einem 10 kOhm-Pullup-Widerstand beschaltet. Würde man den längere
Zeit auf "low" ziehen, wäre die Lebensdauer der Batterie spürbar
verkürzt, auch wenn nur ca. 300 µA Strom fließen.
Der Spannungsteiler ist daher von der Mikrocontrollerschaltung
durch den Kondensator C1 entkoppelt, der nur die Impulsflanken
überträgt und die Gleichspannung sperrt.
Seine Größe hängt von der Software ab; da sie in der
Interrupt-Routine Impulse ausfiltert, die kürzer als 10 msec sind, muß
er etwa 2,2µF betragen. Bei kürzeren Entprellzeiten kann er verkleinert
werden (ohne Entprellung müßten 10 nF reichen).
Baut man die Schaltung ohne Verwendung eines Sparrow nach,
kann man R4 und R5 weglassen, da bereits die internen Pullups des
ATtiny in der Software aktiviert sind, und C1 auf etwa 20 %
verkleinern.
Software
Durch direkte Konfiguration der Register werden die Ausgänge
bestimmt, die Pullups aktiviert, nicht benötigte Digitaleingänge
abgeschaltet und für PinB.0 und PinB.2 Pin Change Interrupts aktiviert.
In der Interrupt-Routine "Onpcint" wird die Zählvariable
"Event" um 1 erhöht, wenn der Controller geweckt wurde und an PinB.0
"low" für länger als 10 msec vorfindet.
In der Hauptroutine wird nach dem Aufwachen geprüft, ob der
Taster an PinB.2 gedrückt wurde. Falls nicht, geht der Controller
gleich wieder in Powerdown. Falls doch, wird die Ausgabe des
Zählerstandes angestoßen.
Das Programm verzweigt dann in die Subroutine "Ausgabe" und
wandelt in einer Schleife den Zählerstand "Event" jeweils in seine
Einzelziffern um und gibt diese als Blink- und Tonsignale aus.
Eine "0" wird durch langes rotes Blinken und einen langen
tiefen Ton signalisiert. Ziffern > 0 werden als kurze grüne
Blinksignale und kurze hohe Piepstöne signalisiert. Zwischen den
Ziffern wird jeweils eine Sekunde Wartezeit eingelegt.
Um den Zähler auf "0" zurückzusetzen, muß man entweder die
Betriebsspannung unterbrechen oder Reset-Eingang des ATiny 13 (den
unbeschalteten Pin 1) provisorisch mit Masse verbinden.
Für Leser, die der Morsesprache mächig sind, ist auch eine
Variante beigefügt, die den Zählerstand in Morse ausgibt. Nullen werden
als "T" abgekürzt, um die Ausgabe zu beschleunigen.
Download des Bascom-Quelltextes: 0116-sparrow-ereigniszaehler.zip
Direkt laden: http://tiny.systems/categorie/cheepit/Ereignisz%C3%A4hler.html
Morse-Version: http://tiny.systems/categorie/cheepit/MorseEreignisz%C3%A4hler.html
' Sparrow-Ereigniszaehler 0 - 99999
' Zaehleingang PinB.0
' Abfragetaster an PinB.2
' Buzzer an PortB.4
' rote LED an PortB.3
' gruene LED an PortB.1
' Ergebnis wird ziffernweise als eine Reihe von Blinksignalen und Piepstoenen ausgegeben
' Ziffer 0: rote LED / langer tiefer Ton
' Ziffern 1-9: gruene LED /kurze hoehere Toene
' Compiler: BASCOM 2.0.7.5 Demo
$Regfile = "Attiny13.dat"
$Crystal = 1200000
$Hwstack = 32
$Swstack = 4
$Framesize = 4
DDRB = &B00011010
PORTB = &B00000101
DIDR0 = &B00011010
GIMSK.PCIE = 1
PCMSK.PCINT0 = 1
PCMSK.PCINT2 = 1
SREG.7 = 1
On PCINT0 Onpcint
Buzzer Alias PortB.4
Zaehleing Alias PinB.0
Abfrage Alias PinB.2
Rot Alias PortB.3
Gruen Alias PortB.1
Const Lang = 200 ' Laenge Sound
Const Kurz = 100
Const Tief = 300 ' Tonhoehe Sound
Const Hoch = 100
Dim I As Byte
Dim M As Byte
Dim N As Long
Dim K As Byte
Dim MS As Byte
Dim Event As Long
Dim Carry As Long
Dim Divisor As Long
Do
If Abfrage = 0 Then
Gosub Ausgabe
Powerdown
End If
Loop
' Ausgabe des Zaehlerstandes
Ausgabe:
Carry = Event
Divisor = 10000
For K = 1 to 5
N = Carry / Divisor
Gosub Beep
Carry = Carry Mod Divisor
Divisor = Divisor / 10
Next
Return
'Tonerzeugung
Beep:
If N = 0 Then
Rot = 1
Sound Buzzer , Lang , Tief
Rot = 0
End If
For I = 1 To N
Gruen = 1
Sound Buzzer , Kurz , Hoch
Gruen = 0
Waitms Kurz
Next
Wait 1
Return
End
'----------------------------------------------------------
Onpcint:
If PinB.0 = 0 Then
Waitms 10
If PinB.0 = 0 Then
Incr Event
End If
End If
Return