Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: AVR Mikrokontrolleri 8 ledin vilkku

Sampe [19.10.2009 23:16:32]

#

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;
}

TVdata [07.02.2012 13:55:16]

#

Onkohan koodi omasi? Tai miksi käytät englanninkielisiä kommentteja?

vesikuusi [01.03.2012 21:29:40]

#

Käytän minäkin englanninkielisiä kommentteja, jos nyt viitsin kommentoida. Siten ohjelmakoodia voi jakaa muillekin kuin suomalaisille.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta