LED Show
PWM blikátko s ATtiny13
vega33, 18.08.2009-00:00



Zapojenie je veľmi jednoduché a schéma je viac-menej ilustračná, pretože samotná konštrukcia je už na fantázii každého záujemcu.


Jadrom celého zariadenia je maličký mikroprocesor ATtiny13.

Pre odskúšanie boli na jeho porty zapojené 3 rôznofarebné LED diódy D1 až D3 spolu s predradnými odpormi R1 až R3.
Ak je potrebné zapojiť viac diód, je v schéme uvedený príklad.
Miesto darlingtonoveho tranzistora je možné
použiť aj PNP tranzistor, dimenzovaný na požadovaný prúd diódami.

Program je napísaný v C a má len pár riadkov. Obsahuje tri rutiny:
- hlavnú smyčku "main", ktorá len nastaví hw mikroprocesora a premenné a viac nerobí nič, pretože všetko je riadené prerušeniami;
- obsluha prerušenia od watchdog obvodu "ISR(SIG_WATCHDOG_TIMEOUT)", ktorá je volaná každých 16 mS pri napájaní 5V (datascheet str.42).
Táto časť programu riadi stmievanie alebo rozsvietenie LED spolu s prepínaním, ktoré diódy budú svietiť.
Rutina riadi aj nastavenie a zapínanie časovača timer0 mikroprocesora. Spolu s ním tvorí PWM moduláciu pre riadenie jasu LED.
- obsluha prerušenia od timer 0 "ISR(TIM0_OVF_vect)" riadi len jas LED diód.


  1. /********************************************/
  2. /*                   Blikajuce LED                              */
  3. /*                                                                      */
  4. /* V.Chromy  (c)2009                            */
  5. /*                                                              */
  6. /* CPU:ATtiny13         Fclk:4.8MHz     */
  7. /*                                      Fwdt:128kHz*/
  8. /********************************************/
  9.  
  10. /*
  11. Program riadi rozsvietenie 3 LED
  12.  
  13. Interval        LED1    LED2    LED3
  14.  
  15. T1              Up      Down    OFF
  16. T2              Down    OFF     Up
  17. T3              Off     Up      Down
  18.  
  19. a nasledne T1
  20.  
  21.  
  22. ========  HW  ========
  23.  
  24. PB0 - LED1
  25. PB1 - LED2
  26. PB2 - LED3
  27.  
  28. */
  29.  
  30. #include <avr/io.h>                       // io
  31.  
  32. #include <avr/interrupt.h>                      //prerusenia   
  33.  
  34. //=============== Makrodefinicie ====================
  35. #define SETBIT(VAR,BIT)         (VAR|=(1<<BIT))
  36. #define CLEARBIT(VAR,BIT)       (VAR&=~(1<<BIT))
  37. #define CHECKBIT(VAR,BIT)       (VAR&(1<<BIT))
  38.  
  39. //*************** definicie ****************
  40. //HW
  41. #define Led1  PB0                               //
  42. #define Led2  PB1                               //
  43. #define Led3  PB2                               //
  44.  
  45.  
  46. //premenne
  47. volatile unsigned char Status;          //value 0-2
  48.                                                 //0 = T1
  49.                                                 //1 = T2
  50.                                                 //2 = T3
  51. volatile unsigned char Timer;           //zmena casovania
  52. volatile unsigned int Cas;                      //pocitanie casu
  53.  
  54.  
  55. //===================================================
  56. //                               Prerusenia
  57. //===================================================
  58.  
  59. //pouzijem WTD prerusenie pre casovanie a
  60. //spustanie casovaca T0 spolu so smenou hodnoty
  61.  
  62. ISR(SIG_WATCHDOG_TIMEOUT){
  63. unsigned char p;                        //pomocna premenna
  64. //kazdu periodu nastavim porty a spustim timer
  65. p=(PINB&0xf8);                          //stav portu do premennej a znulovanie dolnych bitov
  66. switch(Status){
  67.         //T1
  68.         case 0: p=p|0b00000110;break;          
  69.         //T2
  70.         case 1: p=p|0b00000011;break;
  71.         //T3
  72.         case 2: p=p|0b00000101;break;
  73.         }
  74. PORTB=p;                                        //a stav na port
  75. //nastavim timer 0 a odstartujem ho
  76. //spravne by malo byt (0x00-Timer)...ale v tomto pripade to je jedno
  77. TCNT0=(0xFF-Timer);                     //podla nastavenej timer menim hodnotu
  78. TCCR0B=0x05;                            //zapnem timer - CLK/1024
  79. //a tu podla casu to cele menim
  80. Cas++;                                          //pocita pocet preruseni
  81. //a podla dosiahnuteho casu robim zmenu
  82. Timer++;
  83. Timer++;
  84. //uplynul limit a tak dam vsetko do povodnych hodnot
  85. if(Cas>=100){Timer=1;
  86.                         Cas=0x00;
  87.                         Status++;                                       //a zmenim riadenie LED
  88.                         if(Status==0x03)Status=0x00;//pre max hodnotu sa Status=0x00
  89.                         };
  90. }
  91.  
  92.  
  93.  
  94. //timer 0 overflow
  95. ISR(TIM0_OVF_vect){
  96. unsigned char p;                //pomocna premenna
  97. //podla statusu zmenim stav
  98. p=(PINB&0xf8);                          //stav portu do premennej a znulovanie dolnych bitov
  99. switch(Status){
  100.         case 0: p=p|0b0000101;break;
  101.         case 1: p=p|0b0000110;break;
  102.         case 2: p=p|0b0000011;break;
  103.         }
  104. PORTB=p;                                        //a stav na port
  105. TCCR0B=0x00;                            //vypnem timer
  106. }
  107.  
  108.  
  109. //==========================================================
  110.  
  111. int main(){
  112. //inicializacia
  113. Timer=1;
  114. Cas=0x00;                                       //vynulujem casovanie
  115. Status=0x00;                            //nasavim status
  116. //nastavenie portu
  117. DDRB=0x07;                              //dolne 3 bity su vystupom
  118. PORTB=0x07;                             //a vsetko je zhasnute
  119. //timer
  120. TCCR0A=0x00;                            //normal timer
  121. //prerusenia
  122. TIMSK0|=(1<<TOIE0);             //TOVF je povoleny
  123. WDTCR|=(1<<WDTIE);              //WDT interupt je povoleny
  124. sei();                                          //globalne povolenie preruseni
  125.  
  126. //hlavna slucka nerobi nic,lebo cely system je riadeny preruseniami
  127. //z timer a WDT
  128. for(;;){
  129.  
  130.         }
  131. }
  132.  
  133.  


Program je okomentovaný a voľný pre nekomerčné použitie... . Samozrejme je možné zariadenie doplniť o ďaľšie svetelné efekty.

Pri programovani procesoru nastavte prepojky na :
CKSUL=01, SUT=10 t.j. RC interny oscilator 4.8 MHz
WDTON=0 WDT povoleny

Video funkcie: ledshow.mp4

Zdrojový kód: ledshow.zip


tento článok je z mikroZONE
( https://www.mikrozone.sk/pluginy/content/content.php?content.20 )