ADC ile RGB Led Kontrolü- PIC16F877A

Başlatan m.ali, 01 Temmuz 2016, 07:04:55

m.ali

Arkadaşlar ADC ile RGB led kontrolü yapmaya çalışıyorum. Daha önce açılan ve 16f88 PIC'i ile yapılan şu uygulamayı inceledim https://www.picproje.org/index.php/topic,40015.0.html

RGB led de kırmızı ve yeşil için CCP modüllerini kullanacağımdan ADC ile sadece maviyi kontrol edeceğim. Konuda kullanılan kodları 16F877A ya göre düzenledim.

int i=0;

#INT_TIMER0
void timer0_kesmesi(int r){
   set_timer0(200);
   i++;
   if(i<=r)output_high(PIN_B0);
   if(i>r)output_low(PIN_B0);
  if(i>=128){i=0;};
}


(Kodun tamamı aşağıdadır)

Kesme içindeki set_timer0(200) kısmını değiştirdiğimde periyot genişliği değişiyor. if(i>=128) yazan kısımdaki sayıyı 128 ile 255 arasında değiştirdiğimde de duty_cycle değeri değişiyor.
Burada bir sorun var. Eğer if içindeki sayıyı değiştirerek bir kontrol sağlayacaksam sayı 0-255 arasında değişmesi gerekmiyor mu? Neden 128'den başlıyorum?
Ayrıca programın çalışma mantığını tam anlayamadım. Örneğin ADC ile sıcaklık kontrolü yaparken her voltaj artırımına oranla sıcaklık artıyordu. Burada analog girişte artış azalış var mı? Hangi durumlar değişimine göre kontrol sağlanıyor?







#include <16f877A.h>
#device ADC=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)

int i=0;

#INT_TIMER0
void timer0_kesmesi(int r){
   set_timer0(200);
   i++;
   if(i<=r)output_high(PIN_B0);
   if(i>r)output_low(PIN_B0);
  if(i>=128){i=0;};
}

void main()
{  
setup_adc(adc_clock_INTERNAL);
setup_adc_ports(AN0);
  setup_spi(SPI_SS_DISABLED);
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  enable_interrupts(int_timer0); 
  enable_interrupts(GLOBAL);
  
   set_tris_b(0x00);
   output_b(0x00);
 
   while(1)
  {
    set_adc_channel(0);
    delay_ms(30);
     timer0_kesmesi(read_adc()); 
  }
}



mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

m.ali

Analog girişte artış azalış var mı? ADC deki hangi durumların değişimine göre kontrol sağlanıyor? soruları aslında genel sorulardı. Yani 877A kullanmasam da programın mantığını kavramak için sorduğum sorulardı. Diğer yandan evet 877A kullanmak benim için daha iyi çünkü gerçek devresini oluşturup deneyebileceğim tek PIC bu.