16f877 pwm motor projesine rgb led dahil etme

Başlatan MrSecret, 12 Aralık 2011, 04:44:42

MrSecret

http://ozkanalper.blogspot.com/2011/12/lm35-scaklk-sensoru-ile-scaklg-lcd.html

Burada yayınladığım projeme aşağıdaki rgb led kodlarını uyarlamak istiyorum fakat işin içinden çıkamadım  :-\ yardımcı olursanız sevinirim :)


void RGB_ON(unsigned char tR,unsigned char tG, unsigned char tB){
unsigned char a;
unsigned int i;

for(a=0;a<25;a++){
for(i=1;i<=255;i++){  // 255 adımda 3 ayri PWM isaret uret
   if(i<=tR)RLED=1;
   if(i>tR)RLED=0;

   if(i<=tG)GLED=1;
   if(i>tG)GLED=0;
   
   if(i<=tB)BLED=1;
   if(i>tB)BLED=0; 

   DelayUs(10); 
}}
}
//---------------------------------------

//-- Sicakliga gore renk tonunu belirleyen alt program-----
void bak_renk_tablosu(void){
      if(sicaklik<20){tR=255; tG=0;   tB=255;}
if(sicaklik>=20 && sicaklik<21){tR=255; tG=0;   tB=255;} // pembe
if(sicaklik>=21 && sicaklik<22){tR=204; tG=0;   tB=255;}
if(sicaklik>=22 && sicaklik<23){tR=153; tG=0;   tB=255;}
if(sicaklik>=23 && sicaklik<24){tR=102; tG=0;   tB=255;}
if(sicaklik>=24 && sicaklik<25){tR=51;  tG=0;   tB=255;}
if(sicaklik>=25 && sicaklik<26){tR=0;   tG=0;   tB=255;} // mavi
if(sicaklik>=26 && sicaklik<27){tR=0;   tG=51;  tB=255;}
if(sicaklik>=27 && sicaklik<28){tR=0;   tG=102; tB=255;}
if(sicaklik>=28 && sicaklik<29){tR=0;   tG=153; tB=255;}
if(sicaklik>=29 && sicaklik<30){tR=0;   tG=204; tB=255;}
if(sicaklik>=30 && sicaklik<31){tR=0;   tG=255; tB=255;} // turkuaz
if(sicaklik>=31 && sicaklik<32){tR=0;   tG=255; tB=204;}
if(sicaklik>=32 && sicaklik<33){tR=0;   tG=255; tB=153;}
if(sicaklik>=33 && sicaklik<34){tR=0;   tG=255; tB=102;}
if(sicaklik>=34 && sicaklik<35){tR=0;   tG=255; tB=51;}
if(sicaklik>=35 && sicaklik<36){tR=0;   tG=255; tB=0;} // yesil
if(sicaklik>=36 && sicaklik<37){tR=51;  tG=255; tB=0;}
if(sicaklik>=37 && sicaklik<38){tR=102; tG=255; tB=0;}
if(sicaklik>=38 && sicaklik<39){tR=153; tG=255; tB=0;}
if(sicaklik>=39 && sicaklik<40){tR=204; tG=255; tB=0;}
if(sicaklik>=40 && sicaklik<41){tR=255; tG=255; tB=0;} // sari
if(sicaklik>=41 && sicaklik<42){tR=255; tG=204; tB=0;}
if(sicaklik>=42 && sicaklik<43){tR=255; tG=153; tB=0;}
if(sicaklik>=43 && sicaklik<44){tR=255; tG=102; tB=0;}
if(sicaklik>=44 && sicaklik<45){tR=255; tG=51;  tB=0;}
if(sicaklik>=45 && sicaklik<46){tR=255; tG=0;   tB=0;} // kirmizi
          if(sicaklik>=46){tR=255; tG=0;   tB=0;}
}


Pir-O

Software PWM'i bu şekilde üretemezsin TIMER0'ı kurup onun içinde PWM işaretini üretmen gerekiyor. TIMER0'ı da 100 us'de bir güncellersen yeterlidir. İnternette software PWM diye aratırsan bir sürü örnek çıkar karşına.

MrSecret


tacettin

sorunu nasıl çözdüğünüzü açıklarsanız daha sonra aynı sorunla karşı karşıya kalacaklara da yardımcı olursunuz...

MrSecret

Alıntı yapılan: tacettin - 12 Aralık 2011, 17:40:32
sorunu nasıl çözdüğünüzü açıklarsanız daha sonra aynı sorunla karşı karşıya kalacaklara da yardımcı olursunuz...

Haklısınız :) void rgb () nin içindeki sıcaklık değerlerini istediğimiz gibi değiştirebiliriz. İstediğim şeyi elde ettim fakat bu sefer de devrenin (pwmlerin hepsinin) sıcaklığa göre tepki verme süresi arttı yaklaşık 2-3 sn kadar şimdi bunu çözmeye çalışıyorum, eğer bilginiz varsa yardımcı olursanız sevinirim, bu sorunu da çözersem eğer tekrar buraya yazarım :)

#include <16f877.h>    

#device ADC=10  

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) 

#use fast_io(a) 
#use fast_io(c)
#use fast_io(e)

#define preload 65458
#define red pin_e0
#define green pin_e1
#define blue pin_e2
#define use_portb_lcd TRUE   

#include <lcd.c>   

unsigned long int bilgi;
float sicaklik;
unsigned int8 hiz;
int8 red_duty;
int8 green_duty;
int8 blue_duty;
int sayici;

void adc()
{
      bilgi=read_adc();  
      sicaklik=(0.0048828125*bilgi)*100;  
}

void pwm()
{
if (sicaklik<=80)
             {
             set_pwm2_duty(0);
             delay_ms(15);
             }
         else
         {
            if(sicaklik>124)
            {
            hiz=255;
            }         
         set_pwm2_duty(hiz);
         delay_ms(15);
         }
         if(sicaklik<=30)
            {
            hiz=0;
            set_pwm1_duty(hiz);
            delay_ms(15);
            }
         else
            {
            if(sicaklik>124)
            {hiz=255;}
            set_pwm1_duty(hiz);
            delay_ms(15);
            }
}

void lcd()
{
      lcd_gotoxy(10,1); 
      printf(lcd_putc,"%3.0f'C",sicaklik);
}


#INT_TIMER1
void timer()
{
    set_timer1(preload);
    
   if (sayici < 255)
    {
      if (sayici == red_duty)   output_low(red); 
      
      if (sayici == green_duty) output_low(green);

      if (sayici == blue_duty)  output_low(blue); 

    }
   
   else if(sayici == 255) 
    { 
      sayici = 0;
      if (red_duty==0) output_low(red); 
      else output_high(red);
      if (green_duty==0) output_low(green);
      else output_high(green);
      if (blue_duty==0) output_low(blue);
      else output_high(blue);
    }
   sayici++;
}

void rgb ()
{
   if(sicaklik<20){red_duty=255; green_duty=0;   blue_duty=255;}
   if(sicaklik>=20 && sicaklik<21){red_duty=255; green_duty=0;   blue_duty=255;} // pembe
   if(sicaklik>=21 && sicaklik<22){red_duty=204; green_duty=0;   blue_duty=255;}
   if(sicaklik>=22 && sicaklik<23){red_duty=153; green_duty=0;   blue_duty=255;}
   if(sicaklik>=23 && sicaklik<24){red_duty=102; green_duty=0;   blue_duty=255;}
   if(sicaklik>=24 && sicaklik<25){red_duty=51;  green_duty=0;   blue_duty=255;}
   if(sicaklik>=25 && sicaklik<26){red_duty=0;   green_duty=0;   blue_duty=255;} // mavi
   if(sicaklik>=26 && sicaklik<27){red_duty=0;   green_duty=51;  blue_duty=255;}
   if(sicaklik>=27 && sicaklik<28){red_duty=0;   green_duty=102; blue_duty=255;}
   if(sicaklik>=28 && sicaklik<29){red_duty=0;   green_duty=153; blue_duty=255;}
   if(sicaklik>=29 && sicaklik<30){red_duty=0;   green_duty=204; blue_duty=255;}
   if(sicaklik>=30 && sicaklik<31){red_duty=0;   green_duty=255; blue_duty=255;} // turkuaz
   if(sicaklik>=31 && sicaklik<32){red_duty=0;   green_duty=255; blue_duty=204;}
   if(sicaklik>=32 && sicaklik<33){red_duty=0;   green_duty=255; blue_duty=153;}
   if(sicaklik>=33 && sicaklik<34){red_duty=0;   green_duty=255; blue_duty=102;}
   if(sicaklik>=34 && sicaklik<35){red_duty=0;   green_duty=255; blue_duty=51;}
   if(sicaklik>=35 && sicaklik<36){red_duty=0;   green_duty=255; blue_duty=0;} // yesil
   if(sicaklik>=36 && sicaklik<37){red_duty=51;  green_duty=255; blue_duty=0;}
   if(sicaklik>=37 && sicaklik<38){red_duty=102; green_duty=255; blue_duty=0;}
   if(sicaklik>=38 && sicaklik<39){red_duty=153; green_duty=255; blue_duty=0;}
   if(sicaklik>=39 && sicaklik<40){red_duty=204; green_duty=255; blue_duty=0;}
   if(sicaklik>=40 && sicaklik<41){red_duty=255; green_duty=255; blue_duty=0;} // sari
   if(sicaklik>=41 && sicaklik<42){red_duty=255; green_duty=204; blue_duty=0;}
   if(sicaklik>=42 && sicaklik<43){red_duty=255; green_duty=153; blue_duty=0;}
   if(sicaklik>=43 && sicaklik<44){red_duty=255; green_duty=102; blue_duty=0;}
   if(sicaklik>=44 && sicaklik<45){red_duty=255; green_duty=51;  blue_duty=0;}
   if(sicaklik>=45 && sicaklik<46){red_duty=255; green_duty=0;   blue_duty=0;} // kirmizi
   if(sicaklik>=46){red_duty=255; green_duty=0;  blue_duty=0;}
   sayici = 0;
}

void main()
{
   setup_psp(PSP_DISABLED);      
   
   setup_CCP1(CCP_PWM);
   setup_CCP2(CCP_PWM);
   setup_timer_2(T2_DIV_BY_4,255,1);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   
   set_tris_a(0x01);
   set_tris_c(0x00);
   set_tris_e(0b000);
      
   setup_adc(adc_clock_internal);
   setup_adc_ports(AN0);
   
   lcd_init();   

   set_adc_channel(0);  
   delay_us(20);        

   printf(lcd_putc,"\fSICAKLIK"); 
     
   
   for(;;)  
   {
      hiz=bilgi;
      adc();          
      lcd();
      pwm();
      rgb();
   }
}



justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

MrSecret

Alıntı yapılan: justice_for_all - 12 Aralık 2011, 19:46:20
pwm fonksiyonundaki delaylari kaldirin...

Detaylardan kasdettiğiniz nedir tam olarak anlamadım?

justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

MrSecret

delay'ı detay olarak okumuşum, delayları kaldırdım ama bir işe yaramıyor  :o

tacettin

ccs c nin helpinden     #priority  komutunu inceleyip timer2 ye öncelik verip daha sonra timer1 e verip deneyebilir misin?

MrSecret

#10
Alıntı yapılan: tacettin - 12 Aralık 2011, 21:21:59
ccs c nin helpinden     #priority  komutunu inceleyip timer2 ye öncelik verip daha sonra timer1 e verip deneyebilir misin?

Denedim fakat malesef o da işe yaramadı.

MrSecret

Bu arada ben bu kodları 16f877 için yazmıştım fakat 877 bulamadım ve elimde 877A var, bunun için ek bir şey yapmam gerekiyor mu yoksa bu kod 877A da sorunsuz çalışır mı?

justice_for_all

Alıntı yapılan: MrSecret - 13 Aralık 2011, 21:49:42
Bu arada ben bu kodları 16f877 için yazmıştım fakat 877 bulamadım ve elimde 877A var, bunun için ek bir şey yapmam gerekiyor mu yoksa bu kod 877A da sorunsuz çalışır mı?

#include <16f877.h>   

bu kismi
#include <16f877a.h>   


yapip derleyin calisir..
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay