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.
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.
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.
vkkd here