Leider
ist der Attiny13 nicht so recht für Langzeit-Timer und Uhr-Anwendungen
geeignet, weil er keinen internen Quarzoszillator aufweist. Man
kann zwar einen externen Quarzoszillator verwenden und daraus den Takt gewinnen
bzw. den externen Timer-Eingang ansteuern, aber es ist einfacher, statt des
Attiny13 z.B. einen Attiny25 einzusetzen.Als
Attiny13-Fan habe ich es dennoch schon gemacht, z.B. bei der "Sailor's
Clock"
' 50Hz-tiny-sailors-clock.bas
' Hardware:
' Start des Timers durch Reset
' Timer-Takt durch 50Hz-Streufeld an PB2
' Schaltausgang an PB4
' Anzeige Sekundentakt per LED an PB3 oder Buzzer an PB0
'
'----------------------------------------------------------
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 8
$swstack = 8
$framesize = 8
'Baud = 9600
Portb = &B00000011
Ddrb = &B00011001
Acsr.acd = 1 ' 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
Dim S As Long
Do
If S = 86400 Then ' Zähler auf Null setzen; 24 h sind um
S = 0
End If
If S > 10 And S < 3600 Then ' nach 10 Sekunden für 1 Stunde Schaltausgang ein
Portb.4 = 1
Else ' Rest der Zeit Schaltausgang aus
Portb.4 = 0
End If
Loop
End
Ontimer0:
Tcnt0 = 206
Portb.3 = 1 ' Sekunden-LED ein
Waitms 50
Portb.3 = 0 ' Sekunden-LED aus
' Sound Portb.0 , 100 , 100 ' alternativ: Soundausgabe an PB0
Incr S
Return
' 50Hz-Langzeittimer.bas
' Hardware:
' Start der Uhr durch Reset 8Schalter "4" des Mäuseklaviers)
' Timer-Takt durch 50Hz-Streufeld an PB2
' Buzzer an PB 0
' Halb-Stundenvorwahl (Startzeit) durch 3 Schalter an PB1, PB3, PB4 (jeweils gegen Masse)
'
' Nach Start wird die aktuelle Uhrzeit ausgegeben und 15 Sekunden lang zur Kontrolle die
' Sekundenimpulse
'----------------------------------------------------------
$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 32
$swstack = 0
$framesize = 0
'Variablen
Dim T As Word ' jeweils 2 Sekunden
Dim Q As Byte ' aufsummierte Halbstunden
Dim V As Byte ' Halbstunden für Gongausgabe
Dim H As Byte ' Stunden
Dim N As Byte ' wird in Zählschleife verwendet
Dim Clocktest As Byte
' Konstanten
Const Dit1 = 40 ' Laenge Sound
Const Dit2 = 25
Const Tonhoehe1 = 120
Const Tonhoehe2 = 160
' Register
Acsr.7 = 1 ' Analog-Komparator ausschalten, spart etwas Strom
Sreg.7 = 1 ' Global Interrupt Enable
Ddrb = &B0000_0001 ' alle Pins Eingang bis auf PB0
Portb = &B0001_1010 ' alle Pins Pullup-Widerstand bis auf PB2 und PB0
' 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
Buzzer Alias Portb.0
'----------------------------------------------------------
' Startzeit mit Dip- Schalter vorwählen; Raster: 30 min
Q = Not Pinb ' Invertieren, da gesetzter Schalter -> 0
Q = Q And &B001_1010 ' Bit 1 3 und 4 filtern
Q.2 = Q.1
Shift Q , Right , 2 ' -> Q = 1 ... 7
If Q = 0 Then
Q = 8
End If
Goto Einsprung:
Do 'Hauptschleife
' If T > 29 Then ' Testbetrieb: 30 sek statt 30 min
If T > 1799 Then ' Realbetrieb: halbe Stunde ist um
T = 0
Incr Q '
If Q > 8 Then ' Wachwechsel; Uhr auf 00 stellen
Q = 1
End If
Einsprung:
H = Q / 2 ' Stunden = aufsummierte Halbstunden / 2
V = Q Mod 2 ' Rest Stunden
' auszugebende Gongschlaege:
If V = 1 Then ' Halbe Stunde
Gosub Gong
End If
Wait 1
For N = 1 To H ' volle Stunden
Gosub Gong
Waitms 200
Gosub Gong
Waitms 800
Next
End If
Idle
Loop
Gong:
Sound Buzzer , Dit1 , Tonhoehe1
Sound Buzzer , Dit2 , Tonhoehe2
Return
'----------------------------------------------------------
Ontimer0: 'Timer1-Overflow-Interrupt-Routine
Tcnt0 = 206 ' Preset auf 206, damit er 50 Takte bis Ueberlauf zählt
Incr T ' also 1 Interrupt pro Sekunde
If Clocktest < 15 Then ' nach Start 15 Sek Test, ob die Impulse sicher erkannt werden
Sound Buzzer , Dit1 , Tonhoehe1
Incr Clocktest
End If
Return