Upline: Infos & Dokus Elektronik

KnightRider-Lauflicht mit ATMEL AVR Mikrocontroller


Die Filme und Serien unter dem Namen Knight Rider haben Kultstaus erlangt und kaum jemand es sie nicht, dieses typische Knight-Rider-Lauflicht. Dabei leuchtet in einer Lampen- oder LED-Reihe immer nur ein Licht und läuft hierbei kontinuierlich von einer Seite zur anderen und wieder zurück.
Dieses mit Hilfe eines Mikrocontrollers und einer Hand voll zusätzlicher Bauteile nachzubauen, ist ein Kinderspiel. Im Folgenden findet sich eine Anleitung für die beliebten Atmel-Mikrocontroller, die auch ein schönes Beispiel für die Timerprogrammierung ist.

Software

Das Programm wurde mit dem Atmel AVRStudio 4 und dem GCC (WinAVR-20100110) entwickelt.
Der Quelltext ist so kurz gehalten, dass man dieses Lauflicht mit einem beliebigen AVR-µC mit ausreichend Ausgängen (1 Port mit 8 Pins wird benötigt) aufbauen kann. Ich selbst habe nur einige ATmega-µC herumzuliegen, ein ATtiny24 würde aber auch genügen. In der main-Routine werden nur einige Initialisierungen vorgenommen: Der PortB wird als Ausgang eingerichtet und derfür den Timer0 wird die Interruptsteuerung aktiviert.
Die Interruptserviceroutine übernimmt das Zählen der Überläufe und bei der gewünschten Anzahl wird das "LED-Schieben" ausgelöst. Den Teiler (TCCR0) und den Zähler (Overflow_cnt) kann man nach Bedarf anpassen und so auch stromsparendere Lösungen aufbauen, die sich mit 1MHz µC-Takt begnügen. Im hier dargestellten SourcCode wird bereits bei jedem Overflow ausgelöst, da der Source so im Simulator getestet wurde.
// KnightRider-Lauflicht (Program 180B, Data 2B)
// angelehnt an XOR-LED-Blinker siehe http://www.mikrocontroller.net/topic/93570
// läuft auch mit den kleinen ATtiny ab 14 Pins, dort aber PortB durch PortA ersetzen

#include <avr/io.h>
#include <avr/interrupt.h>

unsigned char Overflow_cnt;
unsigned char LED_direction;

ISR(TIMER0_OVF_vect){
 Overflow_cnt++;
 if(Overflow_cnt>0){
  if(LED_direction==0){ // LED links schieben, ganz links wieder einen nach rechts
   if(PORTB<0x80)PORTB=PORTB<<1;else{LED_direction=1;PORTB=PORTB>>1;}
  }else{                // LED rechts schieben, ganz rechts wieder einen nach links
   if(PORTB>0x01)PORTB=PORTB>>1;else{LED_direction=0;PORTB=PORTB<<1;}
  }
  Overflow_cnt=0;
 }
}

int main(void){

 DDRB  = 0xFF; // Ausgang LED
 TCCR0 = (0 << WGM01)|(0 << WGM00)|(1 << CS02)|(0 << CS01)|(0 << CS00); // 8-Bit TIMER0 Normal Mode, Prescaler 256

 TIMSK = (1 << TOIE0); // Timer/Counter Interrupt Mask Register setzen (Timer0 Overflow)
 PORTB=0x01; // erste LED einschalten

 LED_direction=0;
 sei();
 while(1);
}

Hardware

Für Übungszwecke genügt hier ein beliebiges Evaluation-Board mit geeignetem µC und 8 LEDs. Wer sich die Schaltung direkt aufbauen möchte, benötigt auch nur Folgendes:
  • Atmel-µC mit einem I/O-Port (z.B. ATtiny24, ATmega8, ATmega8515, ...)
  • 8 LEDs
  • 8 Vorwiderstände (z.B. 220 Ohm an 5V, anpassen an LED-Typ und Spannung nicht vergessen!)
  • Spannungsversorgung mit 2.7V-5.5V (je nach Controller oder entsprechend mit Spannungsregler anpassen, LV-Varianten laufen auch schon mit mit 1.8V)
  • ein paar cm² Lochrasterplatine, Lötzeug und 1h Zeit :)

Fragen, Kommentare

Wer Fragen hat oder etwas ergänzen möchte, kann gerne den zugehörigen Blogbeitrag nutzen.