' Oster-Contest, Wordclock13, ausser Konkurenz weil zu gross
'
' es geht los mit 10 vor halb eins
'
' die Uhr ist ungenau, kann in ISR justiert werden
'
' o----------o----------o----------o---------o---------------o PB.4
' FÜNF | ZEHN | VOR | NACH | ___ | /
' o--|<|--o o--|<|--o o--|<|--o o--|<|--o o-|___|-o--o o--o +h
' | L16-1 | L16-2 | L16-4 | L16-8 | R4 T4 |
' | o--|-------o--|-------o--|-------o-|-------o-------|-------o PB.3
' | eins | | zwei | | vier | | ___ | | HALB | / |
' o--|<|--o o--|<|--o o--|<|--o o-|___|-o o--|<|--o--o o--o -h
' | L8-1 | L8-2 | L8-4 | R3 | L8-16 T3 |
' | o--|-------o--|-------o--|-------o-|-------o-------|-------o PB.2
' | EINS | | ZWEI | | ___ | | DREI | | VIER | / |
' o--|<|--o o--|<|--o o-|___|-o o--|<|--o o--|<|--o--o o--o +5min
' | L4-1 | L4-2 | R2 | L4-8 | L4-16 T2 |
' | o--|-------o--|-------o--|-------o-|-------o-------|-------o PB.1
' | FÜNF | | ___ | | SECHS | | SIEBEN| | ACHT | / |
' o--|<|--o o-|___|-o o--|<|--o o--|<|--o o--|<|--o--o o--o -5min
' | L2-1 | R1 | L2-4 | L2-8 | L2-16 T1 |
' | o--|-------o--|-------o--|-------o-|-------o-------|-------o PB.0
' | ___ | | NEUN | | ZEHN | | ELF | | ZWÖLF | / | ___
' o-|___|-o o--|<|--o o--|<|--o o--|<|--o o--|<|--o--o o--o-|___|-| GND
' R0 L1-2 L1-4 L1-8 L1-16 T0 >120R
'
' Die LED-Bezeichnung ist 'L port-ddr+'; z.B. L4-2: PortB=4 : DDRB=6 (4+2)
'
' alle LED der unteren Reihe: PortB=1 : DDRB=1+2+4+8+16=31
'-------------------------------------------------------------------------------
$regfile = "attiny13.dat"
$prog &HFF , &H6A , &HFF , &H00
$crystal = 1200000 ' 9,6MHz/8
$hwstack = 8
Config Timer0 = Timer , Prescale = 1024 '1,2MHz / 1024 = 1171,875 Hz
On Ovf0 Int_t0 : Enable Timer0 : Start Timer0 : Enable Interrupts
Dim Minute5 As Byte '* 5 min.
Dim Temp As Byte 'temp
Dim Freq_5hz As Word '4,8Hz
Dim Ddr As Byte 'ddrb
Dim Minute As Byte 'optional 54s
Do 'Hauptprogramm
Main:
Ddrb = 0 : Portb = 31 : Temp = Pinb 'Taste ?
Do : Loop Until Pinb = 31 'warte bis keine Taste
If Temp = 16 Then Minute5 = Minute5 + 1 '+5 min.
If Temp = 8 Then Minute5 = Minute5 -1 '-5 min.
If Temp = 4 Then Minute5 = Minute5 + 12 '+1 stunde
If Temp = 2 Then Minute5 = Minute5 - 12 '-1 stunde
If Minute5 > 143 Then Minute5 = 0 'fehler
'L16-x -------------------------------------------------------------------------
Temp = Minute5 Mod 12 ' rest 0..11*5 Minuten
Ddrb = 0
Select Case Temp
Case 0 : Ddrb = 22 '16+ zehn(+2) vor(+4) (halb)
Case 1 : Ddrb = 21 '16+ fünf(+1) vor(+4) (halb)
' Case 2 : Ddrb = 0 ' (halb)
Case 3 : Ddrb = 25 '16+ fünf(+1) nach(+8) (halb)
Case 4 : Ddrb = 26 '16+ zehn(+2) nach(+8) (halb)
Case 5 : Ddrb = 23 '16+ fünf(+1) zehn(+2) vor(+4)
Case 6 : Ddrb = 22 '16+ zehn(+2) vor(+4)
Case 7 : Ddrb = 21 '16+ fünf(+1) vor(+4)
' Case 8 : Ddrb = 0 ' (voll)
Case 9 : Ddrb = 25 '16+ fünf(+1) nach(+8)
Case 10 : Ddrb = 26 '16+ zehn(+2) nach(+8)
Case 11 : Ddrb = 27 '16+ fünf(+1) zehn(+2) nach(+8)
End Select
Portb = 16 'PB.4
Waitms 1 'helligkeit
Portb = 31 'LED aus
'L8-x --------------------------------------------------------------------------
Ddr = 8
Ddr = Ddr Or Minute
If Minute5 >= 0 Then :
If Minute5 < 5 Then Ddr = Ddr Or 16 : End If 'halb
Ddrb = Ddr
Portb = 8 'PB.3
Waitms 1 'helligkeit
Portb = 31 'LED aus
'L4-x, L2-x, L1-x --------------------------------------------------------------
Temp = Minute5 / 12 'Stunden
Select Case Temp
Case 0 : Ddrb = &B00101 'L4-1
Case 1 : Ddrb = &B00110 'L4-2
Case 2 : Ddrb = &B01100 'L4-8
Case 3 : Ddrb = &B10100 'l4-16
Case 4 : Ddrb = &B00011 'L2-1
Case 5 : Ddrb = &B00110 'L2-4
Case 6 : Ddrb = &B01010 'L2-8
Case 7 : Ddrb = &B10010 'L2-16
Case 8 : Ddrb = &B00011 'L1-2
Case 9 : Ddrb = &B00101 'L1-4
Case 10 : Ddrb = &B01001 'L1-8
Case 11 : Ddrb = &B10001 'L1-16
End Select
Select Case Temp
Case 0 To 3 : Portb = 4 'L4-x
Case 4 To 7 : Portb = 2 'L2-x
Case 8 To 1 : Portb = 2 'L1-x
End Select
Waitms 1 'helligkeit
Loop 'nochmal
'-------------------------------------------------------------------------------
' 9,6MHz / 8 / 1024 = 1171,875Hz = 853,333 us
' * 244 = 208,2133 ms
' * 1440 ~ 299,8272s (Fehler = 0,06%)
Int_t0:
Timer0 = 12 '244=256-12
If Freq_5hz <= 1438 Then '1440 * 0,2s
Freq_5hz = Freq_5hz + 1
Else
Freq_5hz = 0
Minute5 = Minute5 + 1 'nach 5 min. = 300s
End If
Minute = High(freq_5hz) 'optionale anzeige = 53s
Return
' End Program