Wordclock13
von Heinz D.
Mehr als 20 LED kann man an einen Tiny13
nicht anschliessen (Charlieplexing, n*n-n, 5*5-5=20). Die LED in einer
Reihe können gleichzeitig leuchten. Zum schnellen scannen sind nur 5
Befehlsgruppen (DDR/Port) erforderlich. So kann das Feld wie ein
Bildschirm genutzt werden.
Die
mechanische Anordnung der LED kann so zusammengeschoben werden, dass
ein rechteckiges Feld entsteht. Die Verdrahtung muss dann aufmerksam
erfolgen. Die Widerstände richten sich nach Vcc, LED-Farbe und
Helligkeit und betragen dann >=120R bis 1k.
Ohne Quarz
läuft die 'Wordclock13' nicht genau. Als Gimmik reicht es, bis die
Batterie leer ist. Die Einminuten.Anzeige in Reihe L8 ist noch
ungenauer (53,33s), soll nur etwas Leben hinein bringen und kann
entfernt werden. In der Interrupt-Routine kann der Wert 'Timer0=12' um
je ~1s/5min. plus/minus eingestellt werden.
Die
Maske sorgt dafür, dass die Worte nicht 'offen sichtlich' sind. Durch
Pappstreifen wird ein überstrahlen verhindert. Mit den Tasten wird die
Uhr gestellt.
Die
Maske sollte spiegelverkehrt gedruckt werden, sodass außen nur weiß zu
sehen ist. Sprüht man die Maske mit Lack, Öl oder Haarspray ein, werden
die Zeichen diffus transparent. Die Vorlage befindet sich auch im
Zip:
Download: Wordclock13-bas-hex-bin.zip
' 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