Tässä olisi lyhyt ohjelma, jossa tehdään AVR:n mikrokontrollerilla kaksiefektinen 8 ledin vilkku. Koodi demonstroi joitain yksinkertaisia toimintoja mm:
- Pinnin suunta output
- Yksinkertainen delay sisäisellä oskillaattorilla
- Pinnien arvon muuttaminen
Tässä vielä lisäksi minimaalinen kytkentäkaavio kyseisen ledvilkun toteuttamiseksi. Kytkentäkaavio ei ole absoluuttinen eikä ainoa mahdollinen, mutta tuolla pitäisi toimia, kunhan piiri on ohjelmoitu oikein.
http://www.students.tut.fi/~pietika2/mikrokontrolleri/ledvilkku.png
Ohjelma on testattu AVR Attiny2313 mikrokontrollerilla, mutta koska sitä ei piirto-ohjelman kirjastosta löytynyt kuvassa on AT90S2313P, jossa on sama pinnien määrä ja numerointi.
Kehittävä kritiikki ja kommentit ovat tervetulleita.
/////////////////////////////////////////////// // // Made by: Sami Pietikäinen // Date: 17.10.2009 // /////////////////////////////////////////////// // // Infinitive loop with 8 led chase // effect (nightrider) and "butterfly // effect. Tested and working with // AVR attiny2313. // // Compiled and built with WinAVR. // Chip programmed with AVRDUDE // and serial bit banging programmer // ////////////////////////////////////////////// #include <avr/io.h> // Define CPU speed for delay #define F_CPU 8000000 #include <util/delay.h> // Entry point int main(void) { // Variables for loops char a; char b; // Delay int wait = 15; // Set pins B0-B7 to output DDRB |= 0xFF; // Infinitive loop while(1) { // The nightrider effect for(b=0; b<3; b++) { // Light up the first led (B0) _delay_ms(wait); PORTB = 0x01; // in binary 00000001 // Loop through the leds with left bit shift // 00000001 << 1 == 00000010 etc. for(a=0; a<8; a++) { _delay_ms(wait); PORTB = PORTB << 1; } // Light up the last led (B7) _delay_ms(wait); PORTB = 0x80; // In binary 10000000 // Loop through the leds with right bit shift // 10000000 >> 1 == 01000000 for(a=0; a<8; a++) { _delay_ms(wait); PORTB = PORTB >> 1; } } // "butterfly effect" // Since theres only 8 leds I delayed and put // the ports manually instead of loop for(b=0; b<6; b++) { _delay_ms(wait); PORTB = 0x81; // 10000001 _delay_ms(wait); PORTB = 0x42; // 01000010 _delay_ms(wait); PORTB = 0x24; // 00100100 _delay_ms(wait); PORTB = 0x18; // 00011000 _delay_ms(wait); PORTB = 0x00; // 00000000 } } // Never reached return 0; }
Onkohan koodi omasi? Tai miksi käytät englanninkielisiä kommentteja?
Käytän minäkin englanninkielisiä kommentteja, jos nyt viitsin kommentoida. Siten ohjelmakoodia voi jakaa muillekin kuin suomalaisille.
Aihe on jo aika vanha, joten et voi enää vastata siihen.