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.