Ein dreidimensionales Modell mit insgesamt sechs LEDs sollte als
kleines Kunstobjekt entstehen. Wegen der geringen Anzahl freier Ports
geht das am besten mit Charlieplexing. So kommt man mit drei Ports aus.
Von
jeder Leitung zu jeder anderen Leitung gibt es jeweils zwei
antiparallel geschaltete LEDs. Jede der drei Leitungen ist damit an
vier LEDs angeschlossen.
Etwas
anders gezeichnet erkennt man schon die gewünschte dreidimensionale
Struktur der LEDs.
Der Fuß des Objekts besteht aus einer alten
LED-Lampe mit Schalter und Batteriefach. Ein Widerstand mit 20 Ohm
gehörte noch zur Lampe und bleibt drin, als gemeinsamer Vorwiderstand
für alle sechs LEDs. Für die Programmierung wurde eine Audiobuchse
eingebaut. Die Stiftleisten des Sparrow
sind durch das Gehäuse geführt.
Die Batterie passt zwar nicht genau in das Batteriefach, ist aber dafür
aufladbar, ein LiPo-Akku aus einer alten E-Zigarette.
Insgesamt ergibt sich damit ein praktisches kleines Entwicklungssystem,
allzeit bereit und immer wieder aufladbar.
Die Charlieplexing-LED-Ansteuerung verwendet eine Interrupt-Prozedur.
Die Variable D bestimmt, welche LED gerade an ist. Die unteren sechs
Bits stehen für jeweils eine LED. Jetzt könnte man sich zwar
noch tiefe Gedanken über die schönsten Bitmuster machen, aber eine
Zufallsfunktion tut es auch und sorgt für immer neue Muster.
Tim0_isr: Timer0 = 150 Ddrb = &B00000000 Portb = &B00000000 Ticks = Ticks + 1 If Ticks = 1 And D.0 = 1 Then Ddrb = &B00001010 Portb = &B00000010 End If If Ticks = 2 And D.1 = 1 Then Ddrb = &B00001010 Portb = &B00001000 End If If Ticks = 3 And D.2 = 1 Then Ddrb = &B00011000 Portb = &B00001000 End If If Ticks = 4 And D.3 = 1 Then Ddrb = &B00011000 Portb = &B00010000 End If If Ticks = 5 And D.4 = 1 Then Ddrb = &B00010010 Portb = &B00000010 End If If Ticks = 6 And D.5 = 1 Then Ddrb = &B00010010 Portb = &B00010000 End If If Ticks = 9 Then Ticks = 0 Return
End
Charlieplexing
2 mit RS232
Zufallsteuerung
ist gut und schön, aber auf die Dauer kann es auch nervig sein. Man
starrt das
Ding an und fragt sich die ganze Zeit: Und wann sind endlich
mal alle LEDs
gleichzeitig an? Geht das überhaupt? Also muss eine zweite
Software-Version
her, in der alles etwas geplanter abgeht. Das Programm enthält drei
Versionen
einer Steuerung, die gestartet werden, wenn man bein Einschalten S1, S2
oder
keinen von beiden drückt. Ohne Taster startet eine regelmäßige
Lightshow mit
dem krönenden Abschluss, dass sechs LEDs drei Sekunden lang
gemeinsam
leuchten. Drückt man beim Hochfahren S1, dann reagiert die
Software auf
serielle Kommandos mit 300 Baud, die man direkt über dasSoundUART
Keyboard
eingeben kann. Damit lassen sich jeweils zwei Nibbles zu einem Byte
eingeben
und damit bestimmte Muster austesten. Und drückt man beim Start auf S2,
dann
sind alle LEDs an und bleiben es auch. 3D völlig statisch.
If Pinb.0 = 0 Then Goto Cominput If Pinb.2 = 0 Then Goto All_on
Do D = &H08 : Waitms 500 D = &H33 : Waitms 500 D = &H04 : Waitms 500 D = &H00 : Waitms 500 D = &H02 : Waitms 500 D = &H01 : Waitms 500 D = &H20 : Waitms 500 D = &H10 : Waitms 500 D = &H02 : Waitms 500 D = &H08 : Waitms 500 D = &H20 : Waitms 500 D = &H04 : Waitms 500 D = &H02 : Waitms 500 D = &H00 : Waitms 500 D = &H11 : Waitms 500 D = &H22 : Waitms 500 D = &H0C : Waitms 500 D = &H00 : Waitms 500 D = &H3F : Waitms 3000 D = &H00 : Waitms 500 Loop
Cominput: Do Disable Interrupts Ddrb = &B00000000 Portb = &B00000000 Get #1 , Hi Get #1 , Lo D = Hi * 16 D = D + Lo Enable Interrupts Waitms 1000 Loop
All_on: D = &H3F Do Loop
Tim0_isr: Timer0 = 150 Ddrb = &B00000000 Portb = &B00000000 Ticks = Ticks + 1 If Ticks = 1 And D.0 = 1 Then Ddrb = &B00001010 Portb = &B00000010 End If If Ticks = 2 And D.1 = 1 Then Ddrb = &B00001010 Portb = &B00001000 End If If Ticks = 3 And D.2 = 1 Then Ddrb = &B00011000 Portb = &B00001000 End If If Ticks = 4 And D.3 = 1 Then Ddrb = &B00011000 Portb = &B00010000 End If If Ticks = 5 And D.4 = 1 Then Ddrb = &B00010010 Portb = &B00000010 End If If Ticks = 6 And D.5 = 1 Then Ddrb = &B00010010 Portb = &B00010000 End If If Ticks = 9 Then Ticks = 0 Return