Vánoční hvězda

Blíží se vánoce a tak by se hodila nějaká vánoční odoba do okna. Chtěl jsem vymyslet něco, s čím se zabavím na víkend, kromě ledek půjdou použít součástky ze šuplíku a budu si moct pohrát s programováním.
Pro konstrukci vánoční hvězda jsem použil univerzální plošný spoj, průměr hvězdy je 35cm, aby byla vidět z ulice.
Univerzální pl. spoj moc stříhat nejde, tak jsem vzal pilku a nařezal pásky, ze kterých bude sestavena hvězda. Spoje pásků jsou zpevněny drátěnými sponkami a ze zadní strany pásku je přivázán svazek vodičů, kterým jsou propojeny jednotlivé diody. Nakonec je hvězda docela pevná, se svazkem šestnácti drátů z LPT kabelu.
Hvězdu jsem páskou nalepil na okno a ovládací destičku o kousek dál na rám okna. Celé je to napájeno z nabíječky pro mobilní telefon, která má USB konektor.

vánoční hvězda

DSCN0018

Ledky jsem zapojil do matice, jednotlivé sloupce jsou spínány dekodérem 74138. Proud tekoucí jednotlivými diodami je omezen rezistory R1 – R8, jejichž hodnota je spočítána na proud 14mA. Pokud svítí všechny diody ve sloupci, je potřeba proud 112mA, který je spínán tranzistory.
Vstup G2A dekodéru otevírá celý multiplexer. Když jej připojím na PWM kanál procesoru, bude možné plynule řídit jas hvězdy. Celé to ovládá procesor ATmega8.

Hvezda_0

Popis programu

Obsluhu multiplexeru zajišťuje program přerušení od časovače T1. Inkrementuje proměnnou Anoda_counter od 0 do 7. Tato hodnota je zkopírována na port C a tím se postupně spínají jednotlivé sloupce anod ledek. Zároveň je na port D vyslána hodnota z pole dat.

ISR(TIMER1_COMPA_vect) // podprogram preruseni casovace 1
{
    LED_74138 = Anoda_counter;                           // nove nastaveni dekoderu anod
    LED_Katoda = Array[Counter_blik][Anoda_counter];     // nastavi odpovidajici stav Katod
    Anoda_counter++;                                     // pocitadlo anod od 0 do 7
    if (Anoda_counter==8) Anoda_counter = 0;
}

Pole dat je dvojrozměrné, je uspořádáno jako 80 skupin 8 čísel. Hlavní program určuje skupinu v poli, ze které program časovače vybírá data pro ovládání katod. Takže je postupně vybíráno 80 kombinací, kterými hvězda svítí. Podprogram časovače prostřednictvím ukazatele Anoda_counter vybírá data pro multiplexer.

 while(1)
    {
        for(Counter_blik=0; Counter_blik<80; Counter_blik++) // posouva zobrazovani po poli dat
        {
            if(Counter_blik==0)    
            {
                _delay_ms(100);
                for(i=0; i<2; i++)
                {
                    PWM_Blik(800, 40); // 10us pro kroky PWM, 10ms prodlevy
                    _delay_ms(1500);
                }                
                PWM_Blik(800, 40); // 10us pro kroky PWM, 10ms prodlevy                
                _delay_ms(100);
            }
            if ((Counter_blik>0) && (Counter_blik<7))  PWM_Blik(10, 40);
// ovlada rychlost rozsveceni a zhasinani pro ruzne obrazce
            if ((Counter_blik>6) && (Counter_blik<43)) PWM_Blik(20, 40);
            if (Counter_blik>42)                       PWM_Blik(10, 40);
        }
    }

Podprogram PWM_Blik průběžně mění hodnotu registru ORC1A, takže jednotlivé obrazce z diod se postupně rozsvěcují a zhasínají.

void PWM_Blik(unsigned int time, unsigned int del)        // ridi PWM
{
    int i;
    for (PWM_a=0; PWM_a<4000; PWM_a++)                    // rozsveceni
    {
        OCR1A = PWM_a;                                    // nastavi stridu PWM
        for (i=0; i<time; i++) _delay_us(10);             // rychlost zmeny
    }
    LED_R_Set;
    for (i=0; i<del; i++) _delay_ms(10);                  // sviti 100%, ceka
    LED_R_Clr;
    for (PWM_a=0; PWM_a<4000; PWM_a++)                    // zhasina
    {
        OCR1A = 4000 - PWM_a;                             // nastavi stridu PWM
        for (i=0; i<time; i++) _delay_us(10);             // rychlost zmeny
    } 
}

Nastavení portů procesoru:

    // * * * * * * * * * * * * * * * * * * * * * * * * * Aktivace vystupnich portu
    PORTD = 0b11111111; // H-pull up, L vysoká impedance
    DDRD  = 0b11111111; // H-output, L-input
    PORTB = 0b00000110;
    DDRB  = 0b00000110; // LEDred a Enable 74HC138
    PORTC = 0b00000111;
    DDRC  = 0b00000111; // adresove vodice 74HC138
    
    Anoda_counter = 0;
    
    // * * * * * * * * * * * * * * * * * * * * * * * * * Aktivace casovace
    TCCR1A = 0b11110010;      // casovac T1 Frekvence / 1024
    TCCR1B = 0b00011001;      // rezim PWM 14
    TIMSK  = 0b00010000;      // preruseni pri preteceni
    OCR1A  = 1000;
    ICR1   = 4000;            // 100% strida PWM regulace
    SREG  |= 0x80;            // nastavi globalni preruseni

Deklarace proměnných programu:

volatile unsigned char Anoda_counter;    // pocitadlo anod obvod 74138
volatile unsigned char Counter_blik;     // ukazatel v poli dat
unsigned int PWM_a;                      // aktualni hodnota PWM
unsigned char i;

Projekt vánoční hvězda pro AVR studio 6.0 Hvezda.

Jeden myslel na “Vánoční hvězda

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.

Čeština‎EnglishFrançaisDeutschItalianoPolskiРусскийEspañol