In der guten alten Zeit, als man Schaltungen noch mit TTL- ICs baute, war das klassische Selbstbauprojekt ein elektronischer Würfel, der allerdings mehrere ICs umfasste: Taktgeber, Zähler und Decoder. Wer etwas auf sich hielt, benutzte als Anzeige nicht eine Reihe von LEDs oder eine numerische 7-Segment-Anzeige, sondern ordnete 7 LEDs so in Würfelform an, dass die gewürfelte Zahl im klassischen Würfelmuster dargestellt wurde. Hier nun die zeitgemäße Version mit einem Attiny13; da noch ein Pin frei war, gibt es zu Beginn und zum Ende der Anzeige ein Tonsignal.
Der Attiny wird im Powerdown-Modus betrieben. Die Betriebsspannungsversorgung erfolgt aus einer Lithiumzelle oder 3 Mignonakkus; sie ist mit 10 µF kurzzeitstabilisiert. Der Pluspol ist gut zu isolieren (auch von der Platinenunterseite) und mit einer Sicherung abzusichern; insbesondere bei Verwendung einer Lithiumzelle (Berstgefahr).
Der Würfelvorgang wird duch einen Taster an Pin PB1/INT0 gestartet (der den Attiny aus dem Powerdown holt). Um einen Würfel mit 7 LEDs anzusteuern, werden 3 Ausgangsbits (PB2, PB3, PB4) benötigt; die Zählung erfolgt binär von 1 bis 6. Das niederwertigste Bit (PB2) steuert das LED-Auge in der Mitte des Würfelbildes an. Das höchstwertige (PB4) ein Quadrat aus 4 LEDs, und das mittlere Bit 2 LEDs. Allerdings weicht so das Würfelbild für die 2 und die 3 etwas vom Original ab (waagrecht statt diagonal). Jede LED ist mit einem eigenen Vorwiderstand von 1 kOhm beschaltet. An PB0/OC0A ist ein Piezo- Schallwandler angeschlossen.

Wer keinen Wert auf das Würfelbild legt, kann sich auch mit 3 LEDs begnügen; LED1 steht für ein gewürfeltes Auge, LED2 für zwei und LED4 für vier Augen.

Software
Zunächst wird eine Interruptroutine definiert (sie enthält nur den Befehl "Return"). Die Register des Attiny werden von Hand gesetzt: Interrupts werden global freigegeben, der pegelgetriggerte Interrupt wird konfiguriert, das Datenrichtungs-Register und die Pullup-Widerstände passend gesetzt, der Timer zur Tonausgabe konfiguriert. Ein Interrupt weckt den Attiny; als erstes werden weitere Interrupts gesperrt, da pegelgetriggerte Interrupts mehrfach ausgelöst werden, wenn das Signal längere Zeit anliegt.Dann läuft der Zähler von 1 bis 6 los. Damit die LEDs flackern, wird nach jedem Inkrement 20 ms gewartet.
Da die LEDs an den Portbits 2...4 hängen, muss der Zählwert mit 4 multipliziert werden. Außerdem wird 2 addiert, damit PinB.1 (der Pullupwiderstand für PB1/INT0) immer gesetzt bleibt. Dieser Wert wird dann in das Portregister kopiert. Bei jedem Schleifendurchlauf wird abgefragt, ob PinB.1=1 ist; dann wurde nämlich der Taster losgelassen. Der Ton wird durchgeschaltet und über eine Zählschleife ein kurzer anschwellender Ton erzeugt. Das Würfelergebnis wird nun für 2 Sekunden angezeigt, und mit einem abschwellenden Ton geht der Prozessor in Powerdown.
Download: TinyWürfel
' Würfel.bas
' Piezoschallwandler an PB.0
' Taster an PB.1 / Int0 gegen Masse
' 7 LEDs je mit Vorwiderstand 1 kOhm von PB2, PB3, PB.4 an Masse in folgendem Muster
' 4 4
' 3 2 3
' 4 4
' Taktfrequenz 1200 kHz
'
' -------------------------------------------------------------------------------
' Grundeinstelllungen:
$regfile = "attiny13.dat"
$crystal = 1200000 'Standard- Takt 9,6 MHz / 8
$hwstack = 0
$swstack = 0
$framesize = 0
Baud = 9600
'
' ------------------------------------------------------------------------------
' Variable und Konstanten
Dim I As Byte
Dim N As Byte
Const Tonefreq = 120
'
' ------------------------------------------------------------------------------
' Initialisierung
On Int0 Taster ' Interruptroutine bei Drücken des Tasters
Gimsk.6 = 1 ' INT0 enable
Sreg.7 = 1 ' Global Interrupt enable
Mcucr.0 = 0 ' INT0 (wiederholt) bei L an PB0
Mcucr.1 = 0 ' INT0 zweites Bit
Acsr.acd = 1 ' Analog-Komparator off
Ddrb = &B00011100 ' Port B: PB2,3,4 Ausgänge, Rest Eingänge
Portb = &B00000011 ' Port B: Pullups an PB2,3,4
'Ton mit Timer0 erzeugen (wenn Zähler = Wert in OCR0A, wird Ausgang OC0A getoggled.
Config Timer0 = Counter , Prescale = 8 , Compare A = Toggle , Clear Timer = 1
'
' ------------------------------------------------------------------------------
'
Main:
Do
Sreg.7 = 0 ' Interrupts sperren, unterdrückt Mehrfachauslösung
For I = 1 To 6 ' Wir zählen die Würfelpositionen durch
N = I * 4 ' Verschieben um 2 Bit nach links
Waitms 20 ' damit es nett flimmert und blinkt
Portb = N + 2 ' Pullup- Widerstand an PB1 eingeschaltet lassen
If Pinb.1 = 1 Then ' wenn Taster losgelassen
Ddrb.0 = 1 ' Ton einschalten
For I = 0 To 80 Step 4 ' erzeugt anschwellenden Ton
Ocr0a = Tonefreq - I
Waitms 10
Next
Ddrb.0 = 0 ' Ton ausschalten
Wait 2 ' Würfelergebnis 2 Sekunden anzeigen
Ddrb.0 = 1 ' Ton einschalten
For I = 0 To 80 Step 4 ' abschwellenden Ton erzeugen
Ocr0a = I - Tonefreq
Waitms 10
Next
Ddrb.0 = 0 ' Ton abschalten
Portb = 2 ' Anzeige löschen (aber Pulldown an PB.1 eingeschaltet)
Sreg.7 = 1 ' Interrupts Wieder Freigeben
Powerdown
End If
Next
Loop
Taster: ' holt nur den Attiny aus dem Powerdown
Return
Literatur: Lernpaket Mikrocontroller-Technik mit Bascom
Siehe auch: Würfelbausatz mit Assembler-Firmware