Programmierbares Lauflicht mit ATtiny13 (8 LEDs)

testaufbau_mit_programmer_mittel.jpg

Projektbeschreibung

Als kleines Nachmittagsprojekt habe ich mir heute ein kleines Lauflicht ausgedacht. Ein Lauflicht mit acht LEDs, die direkt an einen ATtiny13 angeschlossen werden. Mein Ziel war es, mit sehr wenigen Bauteilen auszukommen. Um dieses Ziel zu erreichen, muss man mit der Einschränkung leben, dass immer nur eine LED leuchten darf.

Der ATtiny13 hat fünf Pins übrig (VCC, GND und Reset fallen weg), an denen man etwas anschließen kann. Jeder dieser fünf Pins kann drei Zustände einnehmen. Wenn der Pin in den INPUT-Modus geschaltet wird, dann ist der Pin hochohmig (falls man nicht den internen PullUp-Widerstand aktiviert). Wenn der Pin in den OUTPUT-Modus geschaltet wird, dann kann der Pin entweder nach GND (=LOW) oder nach VCC (=HIGH) ziehen.

Eine LED leuchtet nur dann, wenn die Anode nach + und die Kathode nach - zeigt. Genau diesen Effekt möchte ich ausnutzen und je eine der beiden angeschlossenen LEDs leuchten lassen. Durch umpolen der Anschlüsse leuchtet entweder die eine oder die andere LED.

LEDs

Wenn man einen Pin des ATtiny13 gleichzeitig an alle LEDs anschließt, dann kann man mit fünf Pins bis zu acht LEDs ansteuern. Um die LEDs auszuschalten, stellt man die zugehörigen Pins in den INPUT-Modus, damit diese hochohmig werden.

ATtiny13

ATtiny13 Foto

Der ATtiny13 ist ein sehr kleiner Mikrocontroller mit nur acht Beinchen (Pins). Zwei der Pins fallen für die Stromversorgung (5 Volt und GND) weg und ein Pin ist für den Reset reserviert. Dann bleiben noch fünf Pins übrig, mit denen wir arbeiten können.

Wie man hier im Anschlussplan gut sehen kann, sind das die Pins PB0...PB4.

ATtiny13 Anschlussplan

Der ATtiny13 kann in der fertigen Schaltung programmiert werden. Dafür muss man den Programmer an die Pins RESET, VCC, GND, MOSI, MISO und SCK anschließen.

Schaltplan

Schaltplan

Der Schaltplan kann mit dem sPlan-Viewer in hoher Qualität betrachtet und gedruckt werden.

Wenn der ATtiny13 einmal fertig programmiert ist, dann kann man auf den Reset-Widerstand und die ISP-Anschlüsse verzichten. Der endgültige Aufbau sieht dann so aus:

Schaltplan abgespeckt

Programmierung

Wie bei mir üblich, programmiere ich den ATtiny13 mit Bascom. Zuerst ein einfaches Lauflicht. Dann kommt noch ein einfaches "Knight Rider"-Lauflicht mit dazu.

testaufbau_mit_programmer_2_mittel.jpg

Im Quellcode verwende ich so kryptische Zeilen wie z.B. DDRB = &B00000000. Was das zu bedeuten hat wird im "Kleinen Bascom AVR Kurs - Hallo Welt" erklärt.

Einfaches Lauflicht

$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 16
$swstack = 5
$framesize = 16


Macro Leds_off
   Ddrb = &B00000000
   Portb = &B00000000
End Macro

Macro Led1
   Ddrb = &B00010001
   Portb = &B00000001
End Macro

Macro Led2
   Ddrb = &B00010001
   Portb = &B00010000
End Macro

Macro Led3
   Ddrb = &B00010010
   Portb = &B00000010
End Macro

Macro Led4
   Ddrb = &B00010010
   Portb = &B00010000
End Macro

Macro Led5
   Ddrb = &B00010100
   Portb = &B00000100
End Macro

Macro Led6
   Ddrb = &B00010100
   Portb = &B00010000
End Macro

Macro Led7
   Ddrb = &B00011000
   Portb = &B00001000
End Macro

Macro Led8
   Ddrb = &B00011000
   Portb = &B00010000
End Macro


Do
   Led1 : Waitms 100
   Led2 : Waitms 100
   Led3 : Waitms 100
   Led4 : Waitms 100
   Led5 : Waitms 100
   Led6 : Waitms 100
   Led7 : Waitms 100
   Led8 : Waitms 100
Loop
End

Eine Mischung aus Lauflicht und "Knight Rider"

$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 16
$swstack = 5
$framesize = 16


Dim I As Byte


Macro Leds_off
   Ddrb = &B00000000
   Portb = &B00000000
End Macro

Macro Led1
   Ddrb = &B00010001
   Portb = &B00000001
End Macro

Macro Led2
   Ddrb = &B00010001
   Portb = &B00010000
End Macro

Macro Led3
   Ddrb = &B00010010
   Portb = &B00000010
End Macro

Macro Led4
   Ddrb = &B00010010
   Portb = &B00010000
End Macro

Macro Led5
   Ddrb = &B00010100
   Portb = &B00000100
End Macro

Macro Led6
   Ddrb = &B00010100
   Portb = &B00010000
End Macro

Macro Led7
   Ddrb = &B00011000
   Portb = &B00001000
End Macro

Macro Led8
   Ddrb = &B00011000
   Portb = &B00010000
End Macro

Macro Einfaches_lauflicht
   Led1 : Waitms 100
   Led2 : Waitms 100
   Led3 : Waitms 100
   Led4 : Waitms 100
   Led5 : Waitms 100
   Led6 : Waitms 100
   Led7 : Waitms 100
   Led8 : Waitms 100
End Macro

Macro Knight_rider
   Led1 : Waitms 100
   Led2 : Waitms 100
   Led3 : Waitms 100
   Led4 : Waitms 100
   Led5 : Waitms 100
   Led6 : Waitms 100
   Led7 : Waitms 100
   Led8 : Waitms 100
   Led7 : Waitms 100
   Led6 : Waitms 100
   Led5 : Waitms 100
   Led4 : Waitms 100
   Led3 : Waitms 100
   Led2 : Waitms 100
End Macro


Do
   For I = 1 To 2
      Einfaches_lauflicht
   Next I
   For I = 1 To 2
      Knight_rider
   Next I
Loop
End

Erweitertes "Knight Rider"-Lauflicht

Bei diesem Programm sieht es so aus, als ob zwei LEDs gleichzeitig hin und her laufen würden.

$regfile = "attiny13.dat"
$crystal = 1200000
$hwstack = 16
$swstack = 5
$framesize = 16


Dim Bt As Byte


Macro Leds_off
   Ddrb = &B00000000
   Portb = &B00000000
End Macro

Macro Led1
   Ddrb = &B00010001
   Portb = &B00000001
End Macro

Macro Led2
   Ddrb = &B00010001
   Portb = &B00010000
End Macro

Macro Led3
   Ddrb = &B00010010
   Portb = &B00000010
End Macro

Macro Led4
   Ddrb = &B00010010
   Portb = &B00010000
End Macro

Macro Led5
   Ddrb = &B00010100
   Portb = &B00000100
End Macro

Macro Led6
   Ddrb = &B00010100
   Portb = &B00010000
End Macro

Macro Led7
   Ddrb = &B00011000
   Portb = &B00001000
End Macro

Macro Led8
   Ddrb = &B00011000
   Portb = &B00010000
End Macro


Const Loopsize = 50

Do
   For Bt = 0 To Loopsize
      Led1 : Waitms 1
      Led2 : Waitms 1
   Next Bt
   For Bt = 0 To Loopsize
      Led2 : Waitms 1
      Led3 : Waitms 1
   Next Bt
   For Bt = 0 To Loopsize
      Led3 : Waitms 1
      Led4 : Waitms 1
   Next Bt
   For Bt = 0 To Loopsize
      Led4 : Waitms 1
      Led5 : Waitms 1
   Next Bt
   For Bt = 0 To Loopsize
      Led5 : Waitms 1
      Led6 : Waitms 1
   Next Bt
   For Bt = 0 To Loopsize
      Led6 : Waitms 1
      Led7 : Waitms 1
   Next Bt
   For Bt = 0 To Loopsize
      Led7 : Waitms 1
      Led8 : Waitms 1
   Next Bt
   For Bt = 0 To Loopsize
      Led6 : Waitms 1
      Led7 : Waitms 1
   Next Bt
   For Bt = 0 To Loopsize
      Led5 : Waitms 1
      Led6 : Waitms 1
   Next Bt
   For Bt = 0 To Loopsize
      Led4 : Waitms 1
      Led5 : Waitms 1
   Next Bt
   For Bt = 0 To Loopsize
      Led3 : Waitms 1
      Led4 : Waitms 1
   Next Bt
   For Bt = 0 To Loopsize
      Led2 : Waitms 1
      Led3 : Waitms 1
   Next Bt
Loop
End

Abschließende Worte

Anstatt der üblichen stabilisierten Stromversorgung kann man für dieses Lauflicht problemlos einen 4,5 Volt Batterieblock oder drei kleine Mignonbatterien (AA) verwenden. Da immer nur eine LED leuchtet, ist die durchschnittliche Stromaufnahme dieser Schaltung 20 mA. Die Schaltung funktioniert in einem Spannungsbereich zwischen 2,8 und 5 Volt. Höher als 5 Volt darf die Spannung niemals sein, da ansonsten die LEDs Schaden nehmen würden.

Das Feine an so einem Mikrocontroller wie dem ATtiny13 ist, dass man ohne viel Aufwand das Programm ändern kann. Wenn du also ein anderes Lauflicht damit machen möchtest -- gerne, nur zu. :-) Wenn du zu dieser Schaltung einen interessanten Bascom-Quellcode hast -- schreibe mir ein Email. Die Emailadresse findest du im Impressum. Ich werde deinen Quellcode hier anhängen. Wenn du auch noch ein Foto von deiner Testschaltung hättest, dann wäre das sogar perfekt -- muss aber nicht unbedingt sein.

Das war es -- mein kleines Nachmittagsprojekt. Ich musste einfach mal wieder ein kleines Projekt starten, damit ich nicht einroste. ;-)

lg Gerold :-)

Fragen/Diskussion/Hilfe

Stelle Fragen zu diesem Projekt bitte im Strippenstrolch-Forum: http://www.strippenstrolch.de/board/thema.php?board=1&thema=79

Schicke bitte keine Fragen per Email an mich. Die Fragen, die du zu diesem Projekt hast und deren Antworten oder auch deine Vorschläge, sind auch für Andere interessant.

Projekterweiterung von dm09 -- 12 LEDs

dm09 hat mich per Email und im Strippenstrolch-Forum darauf aufmerksam gemacht, dass man bis zu 12 LEDs an den ATtiny13 anschließen kann. Vielen Dank dafür! :-) Da sieht man erst, dass man auch mit so einem kleinen Ding, wie dem ATtiny13, viel anfangen kann, wenn man sich etwas einfallen lässt. :D

Hier ist die Nachricht von dm09:

Wie schon besprochen, stelle ich hier den Schaltplan und den Bascom Code zur Verfügung. Die Idee beruht auf deiner Idee und deinem AVR Kurs. Meine Modfikation beruht auf der Überlegung an einer LED-Matrix die ich mit antiparallen Dioden ausgestatte habe. Somit kann ich statt 8 LED`s, 12 LED`s ansteuern. Hier nun der Bascom Code:

$regfile = "attiny13.dat"
$crystal = 4800000
$hwstack = 16
$swstack = 5
$framesize = 16


Macro Leds_off
   Ddrb = &B00000000
   Portb = &B00000000
End Macro

Macro Led1
   Ddrb = &B00010001
   Portb = &B00000001
End Macro

Macro Led2
   Ddrb = &B00010001
   Portb = &B00010000
End Macro

Macro Led3
   Ddrb = &B00010010
   Portb = &B00000010
End Macro

Macro Led4
   Ddrb = &B00010010
   Portb = &B00010000
End Macro

Macro Led5
   Ddrb = &B00010100
   Portb = &B00000100
End Macro

Macro Led6
   Ddrb = &B00010100
   Portb = &B00010000
End Macro

Macro Led7
   Ddrb = &B00001001
   Portb = &B00000001
End Macro

Macro Led8
   Ddrb = &B00001001
   Portb = &B00001000
End Macro

Macro Led9
   Ddrb = &B00001010
   Portb = &B00000010
End Macro

Macro Led10
   Ddrb = &B00001010
   Portb = &B00001000
End Macro

Macro Led11
   Ddrb = &B00001100
   Portb = &B00000100
End Macro

Macro Led12
   Ddrb = &B00001100
   Portb = &B00001000
End Macro


Do
   Led1 : Waitms 500
   Led2 : Waitms 500
   Led3 : Waitms 500
   Led4 : Waitms 500
   Led5 : Waitms 500
   Led6 : Waitms 500
   Led7 : Waitms 500
   Led8 : Waitms 500
   Led9 : Waitms 500
   Led10 : Waitms 500
   Led11 : Waitms 500
   Led12 : Waitms 500

Loop
End

Hier der Schaltplan des 12 Led Lauflichtes:

12_led_lauflicht.gif

Und hier noch ein Bild:

12_led_lauflicht.jpg