Bildiğiniz üzere 16f877 gibi yaygın kullanılan pic’lerde içerisinde timer2 ile kontrol edilen 2 adet pwmyer almaktadır. İhtiyaca göre, örneğin bir RGB led projesinde 3 veya daha fazla pwm çıkışı gerkebilir. Bu gibi durumlarda çözüm olarak timer1 kullanarak kullanıcının seçeceği pinler belli sürelerde on/off yapılarak gerçek br pwm sinyalinin nasıl elde edileceği aşağıdaki kodda verilmiştir.
*Burada verilen kodda timer1 ile 25.8kHz’de gerçekleÅŸen interrupt sayesinde 256 adımlık 100Hz PWM sinyali üretilmiÅŸtir.
for döngüsü içerinde yapılacak kontrol ve güncelleme ile red_duty, green_duty, blue_duty değerleri değiştirilerekaşağıdaki gibi çok çeşitli renkler elde edilebilir.
Aşağıdaki örnekte her 100ms de bir üç ana rengin değerleri değiştirilerek rastgele çok çeşitli renkler elde edilebilir.
//************************************** // Andre Broodryk // Led fader // 2006/07 //************************************** #include <16F917> #fuses INTRC_IO,NOPROTECT,NOWDT,PUT #use delay(clock=8000000) #include#define RAND_MAX 255 #use standard_io(d) #define preload 65458 #define red pin_d0 #define green pin_d1 #define blue pin_d2 //Global variables int red_duty; int green_duty; int blue_duty; int Intcount; //100Hz pwm (interupt at 25.8kHz) #INT_TIMER1 void timer_irq() { set_timer1(preload); if (Intcount < 255) { if (Intcount == red_duty) { output_low(red); } if (Intcount == green_duty) { output_low(green); } if (Intcount == blue_duty) { output_low(blue); } } else if(Intcount == 255) { Intcount = 0; output_high(red); output_high(green); output_high(blue); } Intcount++; } //********************************************** // Main Program //********************************************** void main() { setup_oscillator(OSC_8MHZ); setup_timer_1(T1_INTERNAL | T1_DIV_BY_1); enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); red_duty = 63; green_duty = 1; blue_duty = 250; Intcount = 0; for (;;) { red_duty = rand(); green_duty = rand(); blue_duty = rand(); Intcount = 0; delay_ms(100); } }






