Langzeitzähler mit ATtiny2313          

von Gerd Sinning                      
Elektronik-Labor   Projekte   AVR 

Inzwischen hat sicher jeder mal einen Frequenzzähler gebaut. Dieser ist etwas anders, er zählt und zählt...und zeigt alle Ereignisse und die Zeit an. Verwenden lässt sich das z. B., um alle Blitze von einem Gewittermelder über eine lange Zeit zu zählen. Ebenso kann er wie eine Stoppuhr die Zeit messen: z. B. wenn man die Blumen bewässert hat und Reset drückt, dann sieht man vieviele Tage vergangen sind und sie wieder Wasser brauchen.

Das Display hat nur 8 Zeichen pro Zeile, deshalb werden in der 2. Zeile alle 5 Sekunden die Tage angezeigt, sonst ist da die Zeitanzeige hh:mm:ss und in der 1, Zeile ist immer der aktuelle Zählerstand. Das Programm ist entsprechend einfach, Timer/Counter1 zählt und Timer/Counter2 ist die Zeitbasis. Der Timer2 Overflow feuert mit 36 Hz, bei 8MHz Clock genauer gesagt mit 35,967180 Hz. Das lässt sich mit OSCCAL noch trimmen, Portd.6 toggelt und so sollte man da 18 Hz messen. An Portb.7 ist ein Sekundensignal, da kann man eine Led anschliessen oder auch an Portd.3, die blitzt nur kurz ca. 30 ms jede Sekunde. Wenn man Rs232 Alias Pind.4 auf GND legt, dann wird der Zählerstand über die serielle Schnittstelle übertragen. Mit Reset wird alles wieder auf Null gestellt. Im Programm sind sind 2 Zeilen mit einem Kommentar versehen, wenn man die Häkchen entfernt, dann wird er zu einem Frequenzzähler mit 1 Sekunde gate-time.

Die Schaltung des Zählers und das Programm sind einfach, etwas schwieriger ist es, den Anschluss vom Pollin-Display auf eine 2,54 mm Steckerleiste zu löten. Ich habe dazu das 10-polige Flexkabel mit einem scharfen Messer aufgeschnitten und an die Steckerleiste gelötet. Das sieht nicht gut aus aber es funktioniert.

Das Display wird dann einfach auf den ATtiny2313 geklebt, mit BluTack oder mit Klebepads, so ist das recht kompakt und stabil. Ein gutes Projekt für ein Winterwochenende.

Jetzt im Gehäuse aus dem 3D-Drucker....

References

LCD-Modul C0802-04, www.pollin.de
Datasheet ATtiny2313, Atmel.com

Download: Cnt_LCD2.zip
'***************************************************************************
' ATTiny2313 LCD digital up counter GS 2014
'
' upper line displays counter T1 ,
' lower line displays time , days every 5 sec
'
' display updated every second
' use reset to zero
'
' LCD display:
' 12345678
' --------
' 12345678
' 12:03:01
' --------
'
' This program is free software; you can redistribute it and/or
' modify it under the terms of the GNU General Public License.
' This program is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY;
'
'***************************************************************************
'
' ATiny2313 PDIP
'
' (RESET/dW) PA2 1 20 VCC
' (RXD) PD0 2 19 PB7 (UCSK/SCK/PCINT7)
' (TXD) PD1 3 18 PB6 (MISO/DO/PCINT6)
' (XTAL2) PA1 4 17 PB5 (MOSI/DI/SDA/PCINT5)
' (XTAL1) PA0 5 16 PB4 (OC1B/PCINT4)
' (INT0) PD2 6 15 PB3 (OC1A/PCINT3)
' (INT1) PD3 7 14 PB2 (OC0A/PCINT2)
' (T0) PD4 8 13 PB1 (AIN1/PCINT1)
' (OC0B/T1) PD5 9 12 PB0 (AIN0/PCINT0)
' GND 10 11 PD6 (ICP)
'
'***************************************************************************

$regfile = "ATtiny2313.dat"
$crystal = 8000000
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
$baud = 9600

'*********************************************************************

Ipulse Alias Portd.6
Mpulse Alias Portb.7
Rs232 Alias Pind.4
Ledpulse Alias Portd.3

Const T0comp = 256 - 217 '36 Hz Timer0

Dim I As Byte
Dim Dispcnt As Byte 'display counter
Dim Icnt As Byte 'ISR counter
Dim T1ovfcnt As Byte 'ISR ovf counter

Dim Seconds As Byte
Dim Minutes As Byte
Dim Hours As Byte
Dim Days As Word
Dim Totalcnt As Long

Dim S As String * 10
Dim S1 As String * 4
Dim S2 As String * 4
Dim S3 As String * 4
Dim S4 As String * 4


'*********************************************************************
Config Lcd = 16 * 1a
Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portb.1 , Db5 = Portb.2 , Db4 = Portb.3 , E = Portb.4 , Rs = Portb.6

Ddrb = &B11111111
Portb = &B00000000

Ddrd = &B11001110
Portd = &B11111111

' Config Timer0 , timebase
Config Timer0 = Timer , Prescale = 1024
Timer0 = T0comp
Enable Ovf0
On Ovf0 T0ovf

' Config Timer1 , Counter
Config Timer1 = Counter , Edge = Rising
Enable Ovf1
On Ovf1 T1ovf

Start Timer0
Start Timer1

Enable Interrupts

'*********************************************************************
Lcd "Count"
Wait 2
Cls
Cursor Off

Totalcnt = 12345

Do

' TotalCnt loop

If Dispcnt = 1 Then '1 s
Dispcnt = 0 ' update display
Totalcnt = 65536 * T1ovfcnt
Totalcnt = Timer1 + Totalcnt

'TIMER1 = 0 'uncomment
'T1ovfcnt = 0 'for frequency counter

S1 = Str(totalcnt)
I = Seconds Mod 5

If I <> 0 Then
S2 = Str(hours)
S3 = Str(minutes)
S4 = Str(seconds)
S = Format(s2 , "00") + ":" + Format(s3 , "00") + ":" + Format(s4 , "00")
Else
S = "Day " + Str(days) '5 sec
Cls
End If

Home Upper
'Lcd " "
Lcd S1
Locate 2 , 1
Lcd S

If Rs232 = 0 Then 'send data
Print S1
End If
Toggle Mpulse

End If 'if dispcnt

Loop ' do again

'*********************************************************************

T0ovf: 'interrupt 36 Hz

Timer0 = T0comp ' reload Timer0
Incr Icnt
If Icnt = 36 Then '1 sec
Dispcnt = 1
Icnt = 0 '1 second
Incr Seconds
If Seconds = 60 Then
Seconds = 0 : Incr Minutes
End If
If Minutes = 60 Then
Minutes = 0 : Incr Hours
End If
If Hours = 24 Then
Hours = 0 : Incr Days
End If
Ledpulse = 1
Else
Ledpulse = 0
End If 'Icnt
Toggle Ipulse

Return 'reti

T1ovf:
Incr T1ovfcnt
Return

End

'*********************************************************************

                              


 Elektronik-Labor   Projekte   AVR