ADC ve Yazılımsal PWM ile RGB Led Kontrolü

Başlatan Cemre., 19 Haziran 2012, 13:57:42

Cemre.

Üç adet pot ile renkleri karıştırmak için bir devre hazırladım arkadaşlar denemedim ancak simulasyonda osilator guzel degerler veriyordu. Birde hocalarımız baksın istedim acaba bir hatam var mıdır? :)

16F88 entegresini kullandım sebebi ise ADC'ye sahip olmasıdır :)

Proteus ISIS ve CCS C kodları Hex kodları içindedir:
http://uploaded.to/file/9t2uyift


#include <16F88.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC                    //Internal RC Osc
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#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
#FUSES NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOIESO                   //Internal External Switch Over mode disabled

#use delay(clock=4000000)

//--------adc--------
int i=0;
unsigned long int red_ADC;
unsigned long int green_ADC;
unsigned long int blue_ADC;
//--------TIMER0--------
#INT_TIMER0
void timer0_kesme()
{
   set_timer0(0);
   i++;
   if(i<=red_ADC)output_high(PIN_B0);
   if(i>red_ADC)output_low(PIN_B0);

   if(i<=green_ADC)output_high(PIN_B1);
   if(i>green_ADC)output_low(PIN_B1);
   
   if(i<=blue_ADC)output_high(PIN_B2);
   if(i>blue_ADC)output_low(PIN_B2); 
   if(i>=255){i=0;};
   delay_us(10);
}
//--------TIMER0--------

void main()
{  
   setup_adc_ports(sAN0|sAN1|sAN2|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   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);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);   
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   while(1)
   {
      set_adc_channel(0);
      delay_us(100);
      red_ADC = read_adc();
      
            
      set_adc_channel(1);
      delay_us(100);
      green_ADC = read_adc();
     
      
      set_adc_channel(2);
      delay_us(100);
      blue_ADC = read_adc();
   }
}

serhat1990

Doğru gözüküyor  , timer süresini biraz daha küçültmek daha net bir pwm sinyali sağlar. İyi çalışmalar.

justice_for_all

tmer degerin cok yuksek fiziksel ortamda denediğinde büyük ihtimal ledlerde kıpraşma göreceksin ama timer değeriyle oynayarak bunu halledebilirsin.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Erol YILMAZ

Dahili OSC max 8 Mhz olabiliyor.
bence bir de OSC yi 8 Mhz'e al...

Sonrasında da Led PWM frekansını ölç bakalım ne çıkıyor,
70 Hz in altı kesinlikle kabul değil :)

Cemre.

Derleyici olarak CCS C kullanıyorum ve şu anda bir hata veriyor.

I/O error 103.

justice_for_all

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

pea

Dosyalarla alakalı bir hata olması lazım.
Include'daki dosyalar açık olabilir , sadece okunur olabilir.Ya da CCS saçmalamıştır tamamen.

Cemre.

Kaldırdım yeniden kurdum hala aynı hatayı veriyor :S

Cemre.

Alıntı yapılan: justice_for_all - 19 Haziran 2012, 16:35:12
tmer degerin cok yuksek fiziksel ortamda denediğinde büyük ihtimal ledlerde kıpraşma göreceksin ama timer değeriyle oynayarak bunu halledebilirsin.

Timer değerinden kastınız nedir tam olarak anlayamadım nasıl değiştireceğim? :)

Cemre.

Yeni bir proje oluşturup derlediğimde hata vermedi, şaka gibi :))

ziyaretci

Alıntı yapılan: huseyin67 - 19 Haziran 2012, 22:52:06
Yeni bir proje oluşturup derlediğimde hata vermedi, şaka gibi :))


:) CCS C derleyicisinin öyle cinslikleri var.
 
   Eğer programı derleyip ve program üzerinde hiç bir oynama yapmadan tekrar derlersen hata alıyorsun.
Ve programdan çıkmak zorundasın ve kapatıp açtığında (yeni bir proje oluşturduğunda) bu sefer derlediğinde hata almayacaksın ama derleyicinin aklı başka yerlerde oluğu için senin yazılımını derlemeyecek(2 tane bir önceki programına ait dosya çıkaracak).Ve 3. defa kapatıp açtığında programını derleyebilirsin. :)  Belki  başka cinslikleride vardır. :D

justice_for_all

Alıntı yapılan: huseyin67 - 19 Haziran 2012, 22:46:30
Timer değerinden kastınız nedir tam olarak anlayamadım nasıl değiştireceğim? :)

set_timer0(0);


gorulen yerde 0 yerine daha buyuk degerler vermelisin.devreyi fiziksel ortamda deneyince anlayacaksın ne demek istediğimi.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

serhat1990

#12
Timer0 8 bitlik sayıcıdır. Yani 0-255 arasında sayar. Sen set_timer0(0) ; yazınca timer 0'dan itibaren saymaya başlar...

Sayı 255 ' e yaklaştıkça timer süren kısalır...

Bunları tam olarak öğrenmeden timer karmaşık gelebilir. Timer'a ne kadar sürede giriyorsun. Hesabı nasıl yapılır. Bunları öğrenirsen işin kolaylaşacaktır. Ayrıca Osilatör sinyalini yüksek tutmakta fayda var. Bu sayede daha kısa zamanlı timerlar oluşturabilirsin.

Cemre.

Sanırım şimdi daha iyi anlıyorum ilginiz için tekrar teşekkürler :)

serhat1990

#14
Kolay gelsin , Timer kullanımı cidden çok önemli butür konuların üstüne gitmek gerek . Kaçmak bir çözüm değil. Timer'dan kaç , spı iletişiminden kaç , kesmelerden kaç , vs vs. Bu tür konulardan kaçtıkça lcd'ye veri yazmaktan pek öteye gidilemez :) O yüzden sürekli çalışmak lazım. Bir işlemci belirlersin kendine herşeyini öğrenirsin. Piclerde registerlar çok yakın olduğu için diğerlerine geçiş sorun olmaz. Örneğin 16f877 kullanıyorsun aç datasheeti sırayla ne özellikleri var. Hepsiyle birer uygulama yapmaya çalış. Bu şekilde işler zevk vermeye başlar...  :)