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

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

Cemre.

Şu an başta istediğim şeyi sanırım tam olarak elde edebildim :) 74Hz bir frekans elde ettim ve tam olarak potlarla kontrol edebiliyorum. Devreyi kurmak isteyenler transistörle güçlendirdikten sonra hocalarımızın da onayıyla, gönül rahatlığıyla kullanabilirler diye düşünüyorum :))

http://uploaded.to/file/m4h2sst1

#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=8000000)
int i=0;
int r=0;
int g=0;
int b=0;
#INT_TIMER0
void timer0_kesmesi(){
   set_timer0(191);
   i++;
   if(i<=r)output_high(PIN_B0);
   if(i>r)output_low(PIN_B0);
   if(i<=g)output_high(PIN_B1);
   if(i>g)output_low(PIN_B1);
   if(i<=b)output_high(PIN_B2);
   if(i>b)output_low(PIN_B2);
   if(i>=255){i=0;};

}
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_oscillator(OSC_8MHZ|OSC_INTRC);
   setup_CCP1(CCP_OFF);
   setup_vref(FALSE);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   set_tris_b(0x00);
   output_b(0x00);
   
   while(1){
    set_adc_channel(0);
    delay_us(30);
    r = read_adc();
    set_adc_channel(1);
    delay_us(30);
    g = read_adc();
    set_adc_channel(2);
    delay_us(30);
    b = read_adc();
   }
}



serhat1990

Tebrikler :)

Yakalamışken timer'ın üzerine git. :)

justice_for_all

#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=8000000)
int i=0;
int r=0;
int g=0;
int b=0;
#INT_TIMER0
void timer0_kesmesi(){

   set_timer0(220);
   i++;
   if(i>r)output_low(PIN_B0);

   if(i>g)output_low(PIN_B1);

   if(i>b)output_low(PIN_B2);
   if(i>=255)
   {
      i=0;
      output_high(PIN_B0);
      output_high(PIN_B1);
      output_high(PIN_B2);
      };

}
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_oscillator(OSC_8MHZ|OSC_INTRC);
   setup_CCP1(CCP_OFF);
   setup_vref(FALSE);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   set_tris_b(0x00);
   output_b(0x00);
   
   while(1){
    set_adc_channel(0);
    delay_us(30);
    r = read_adc();
    set_adc_channel(1);
    delay_us(30);
    g = read_adc();
    set_adc_channel(2);
    delay_us(30);
    b = read_adc();
    
    

   }
}


bide boyle denersen frekansın 95 herze cıktıgını gorursun :)
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Cemre.

#33
Teşekkürler haklısınız o pinleri ben yapmazsam kim high yapacaktı değil mi :)) bende 191 yapınca oluyorda 192 yapınca neden olmuyor diye kara kara düşünüyorum :))
Çok teşekkürler ilgileriniz ve bilgileriniz için tekrardan :)


justice_for_all

burda amac mumkun oldugunca timer kesmesinin icindeki kod blogunu azaltmak senin onceki kodunda bikactane if li kod parcacigi vardi bunlar asm ye cevrilince cok fazla kod yapar.hatta kesme kismini asm ile yapman mumkunse goreceksin daha net  ve daha guzel bir pwm elde edeceksin.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Cemre.

Teşekkürler, ben başlarken biraz apar topar olmuştu zaten yazın sonlarına dogru, e okul malum hic bişeye değmiyo insanın eli, özelliklede dışarıda okuyosan, asm zordur gibisinden yazılar okudum hep daha onceden web programlamayla ilgileniyodum vb.net ile ilgilendim derken C daha cazip geldi, yani anlıycagınız asm'den bi haberim :)