Upline: Infos & Dokus
Elektronik
KnightRider-Lauflicht mit ATMEL AVR MikrocontrollerDie 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. SoftwareDas 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); } HardwareFü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:
Fragen, KommentareWer Fragen hat oder etwas ergänzen möchte, kann gerne den zugehörigen Blogbeitrag nutzen. |