4 kademeli dimmer

aşağıdaki tam olarak da sizin yukarıdaki tarifinize göre çalışmaktadır.

( sensor / buton ları b7,b6,b5,b4 e bağlamanız gerekecek)


not: ISIS de denenmiştir. (buton arklarına karşı önlem almanız tavsiye edilir)



#include <16F628A.h>


#FUSES NOWDT
#FUSES INTRC_IO
#FUSES NOBROWNOUT
#FUSES NOLVP


#use delay(int=4000000)
#use fast_io(a)
#use fast_io(b)


#define yuzde_25_artis 50
#define max_pwm_degeri 197
#define min_pwm_degeri 10000


int16 pwm_duty_degeri;
int8 sensor_degeri;
int8 old_sensor_degeri;


#int_RB
void RB_isr(void) {


sensor_degeri=input_b();
sensor_degeri>>=4;
if(sensor_degeri==12){sensor_degeri=8;}
if(sensor_degeri==6){sensor_degeri=4;}
if(sensor_degeri==3){sensor_degeri=2;}
if(sensor_degeri > 0)
{
if((pwm_duty_degeri==0) && (sensor_degeri==1)){pwm_duty_degeri += yuzde_25_artis;}
else if(sensor_degeri > old_sensor_degeri){pwm_duty_degeri += yuzde_25_artis;}
else if(sensor_degeri < old_sensor_degeri){pwm_duty_degeri -= yuzde_25_artis;}
else if(sensor_degeri == old_sensor_degeri){pwm_duty_degeri -= yuzde_25_artis;}
if(pwm_duty_degeri > min_pwm_degeri){pwm_duty_degeri = 0;}
if(pwm_duty_degeri > max_pwm_degeri){pwm_duty_degeri = max_pwm_degeri;}


set_pwm1_duty((int16)pwm_duty_degeri);
old_sensor_degeri = sensor_degeri;
}
}


void main() {
setup_timer_2(T2_DIV_BY_1,49,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty((int16)0);
setup_comparator(NC_NC_NC_NC);
setup_oscillator(OSC_4MHZ);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
set_tris_a (0b11111111);
set_tris_b (0b11110111);
sensor_degeri=0;
old_sensor_degeri=0;
pwm_duty_degeri=0;

while(TRUE){}
}
 
// PROĞRAM AMACI (2 SENSÖRE TEK PARMAKLA DOKUNULUCAK YAKINLIK)
// 4 ADET SENSÖRLE PARMAKLARI ÜZERİNDE KAYDIRARAK PWM DE(IŞIKTA)
// ARTIRMA VE AZALTMA YAPMAK.
//
// PWM 20 KHZ OLARAK AYARLANMIŞTIR. GÜRÜLTÜ (SES) OLUŞTURACAK BİR DEVRE OLURSA
// İNSAN DUYMA FREKANSINDAN YÜKSEK OLDUĞU İÇİN DUYULMAYACAKTIR.




//HER HANGİ BİR SENSÖRDEN/BUTONDAN BASLANARAK YUKARI YADA AŞAĞI KAYDIRMA YAPILARAK
//PWM DEĞERİ DEĞİŞTİRİLİR.
//SENSÖRLER / BUTONLAR RB7,RB6,RB5,RB4 PİNLERİNE SIRAYLA BAĞLANMALIDIR
//SONSUZ DÖNGÜ İÇERİSİNDE İSTENİRSE. BUTONA HAREKET ETMEDEN X SANİYE BASILI TUTULUNCA EN SON
//YAPTIĞIN İŞLEMİ HIZLANDIR YADA EN UÇ SEVİYEYE GETİR GİBİSİNDEN BİR FONKSİYON AYARLARSANIZ.
//DAHA ESTEDİK VE KULLANIŞLI OLUR.
//MESELA; IŞIĞIN ŞİDDETİNİ BİRAZ KISIYORUZ AMA ELİMİZİ 2 SANİYE ÇEKMİYORUZ/HAREKET ETTİRMİYORUZ
//IŞIK TAMAMEN SÖNSÜN. GİBİ.






#include <16F628A.h>
#device adc=16


#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O


#use delay(clock=4000000)


#use fast_io(a)
#use fast_io(b)


#define artirma_azaltma 20 // HER PARMAK KAYDIRMASINDA ARTACAK YADA AZALACAK DEĞER
#define max_pwm_degeri 197 // PWM_DUTY İN ALABİLECEĞİ EN FAZLA DEGER
#define min_pwm_degeri 10000 // PWM_DUTY 0 DAN DÜSÜSTE TEKRAR 0 A ÇEKİLMESİ İÇİN DEGER


int16 pwm_duty_degeri;
int8 sensor_degeri;
int8 eski_sensor_degeri;




// PORT B PİN 4-7 DEĞİŞİMİNDE OLUŞACAK OLAN KESME


#int_RB
void RB_isr(void) {


sensor_degeri=(input_b()& 0b11110111);
sensor_degeri>>=4;

//sensorlere basma lar göz önünde bulundurulursa pin7 den pin 4 de doğru
//parmağımızı kaydırırsak sensör değeri sırayla şu degeri alır
// 01000(8),
// 01100(12),
// 00100(4),
// 00110(6),
// 00010(2),
// 00011(3),
// 00001(1),

//aşağıdaki kaydırma işleminden sonra değerler böyle olur;
// 10000(16),
// 01100(12),
// 01000(8),
// 00110(6),
// 00100(4),
// 00011(3),
// 00010(2);
// görüldüğü gibi sayılar büyükten küçüğe sıralanmış oldu.


if(sensor_degeri==8){sensor_degeri<<=1;} //8 ise 16 yap
if(sensor_degeri==4){sensor_degeri<<=1;} //4 ise 8 yap
if(sensor_degeri==2){sensor_degeri<<=1;} //2 ise 4 yap
if(sensor_degeri==1){sensor_degeri<<=1;} //1 ise 2 yap


if(sensor_degeri > 0)
{
if(eski_sensor_degeri > 0) //sensörlerden el çekilmediyse. yani ilk dakunuş değilse.
{
//sensör değeri eskisine nazaran artıyorsa pwm i artırıyoruz azalıyorsa azaltıyoruz
if(sensor_degeri > eski_sensor_degeri){pwm_duty_degeri += artirma_azaltma;}
if(sensor_degeri < eski_sensor_degeri){pwm_duty_degeri -= artirma_azaltma;}

// pwm değeri 0 ın altına düştüyse yani çok yüksek bir rakam olduysa 0 a sabitliyoruz.
// pwm değeri maX değeri aştıysa max değere sabitliyoruz.
if(pwm_duty_degeri > min_pwm_degeri){pwm_duty_degeri = 0;}
if(pwm_duty_degeri > max_pwm_degeri){pwm_duty_degeri = max_pwm_degeri;}


//elde ettiğimiz pwm duty değerini pwm e uyguluyoruz
set_pwm1_duty((int16)pwm_duty_degeri);

}
}


// tekrar karşılaştırma yapabilmek için sensör değerini eski sönser değişkenine aktarıyoruz
eski_sensor_degeri = sensor_degeri;
}


void main() {




setup_timer_2(T2_DIV_BY_1,49,1); //50.0 us kesme (20 khz pwm için)
setup_timer_1(T1_DISABLED); // timer 1 dahili saat ve bölme 1
setup_ccp1(CCP_PWM);
set_pwm1_duty((int16)0); //maksimum pwm=197 olabilir
setup_comparator(NC_NC_NC_NC);

enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);


set_tris_a (0b11111111);
set_tris_b (0b11110111);


while(TRUE){


//eğer sensorlere dokunulmuyorsa eski sensor değerini sıfırla
// pwm çıkışını okuyUp okumadığı aklımda değil ben her ihtimale karşı
// pin 3 ü perdeliyorum.

if((input_b()& 0b11110111)== 0)
{
eski_sensor_degeri = 0;
}
}
}
 
merhaba kolay gelsin. devreye şu şekilde ekleme yapabilrimiyiz. devre şuan güzel çalışıyor. her butona bir led baglayacaz. 1. butona bastıgımız zaman led yanacak ve %25 parlaklık olacagını bilecez. aynı şekilde diğer butonlarad bu şekilde gerçekleşecek.ikinci butona bastıgımız zaman 2 led yanacak. 3. butona bastıgımız zaman 3. led yanacak 4. butona bastıgımız zaman 4. led yanacak.tekrara geiye de aynı şeklde sönecek.
 
kolay gelsin.

tabiki istediğiniz şekilde buton / led kontrolü yapabilirsiniz.

a: bastığınız butona karşılık gelen led in yanması mı?(örneğin; 1. butona bastım, 1. led yanacak. 2. butona bastım 2. led yanacak.....)

b: led in parlaklığına (yani pwm e) karşılık gelen led in yanması mı? (örneğin; %0 duty için hiç birled yanmayacak. %25 duty için 1. led yanacak. %50 duty için 2. led yanacak......)

c: led in parlaklığına (yani pwm e) karşılık gelen ledlerin hepsinin yanması mı? (örneğin; %0 duty için hiç led yanmayacak. %25 duty için 1. led yanacak. %50 duty için 1. ve 2. led yanacak. %75 duty için 1. ve 2. ve 3. led ler yansın......)


benim tavsiyem (c:) şıkkıdır. (ve ona göre duty in degerine göre basit if - else if kontrolü yapıp çıkışları yonlendireceğiz.)

if-else komutları içerisindeki pin yönlendirmelerinde istediğin gibi değişiklik yapıp kullanabilirsiniz. değişik portlardan pin kullannabilirsiniz örneğin; pin_c1, pin_a3, pin_b2, pin_c5, kullanabilirsiniz.

#define led1 pin_xx
#define led2 pin_xx
#define led3 pin_xx
#define led4 pin_xx


if( pwm_duty_degeri > 75 )
{
output_high(led1);
output_high(led2);
output_high(led3);
output_high(led4);
}

else if ( pwm_duty_degeri > 50 )
{
output_high(led1);
output_high(led2);
output_high(led3);
output_low(led4);
}

else if( pwm_duty_degeri > 25 )
{
output_high(led1);
output_high(led2);
output_low(led3);
output_low(led4);
}

else if( pwm_duty_degeri > 0 )
{
output_high(led1);
output_low(led2);
output_low(led3);
output_low(led4);
}

else
{
output_low(led1);
output_low(led2);
output_low(led3);
output_low(led4);
}




yada led kontrolü için tek port kullanılacaksa bir dizi oluşturulup ; port kontrolüde yapabiliriz.




cons int8 ledler [4]={0x00,0x01,0x03,0x07,0x0F}; // degerler (0x00) = 0000 , (0x01) = 0001 , (0x03) = 0011 , (0x07) = 0111 , (0x0f) = 1111 // bir dizi oluşturup ledleri yakacak olan çıkış degerlerini yazıyoruz

pwm_duty_yuzde_yirmibes_degeri xx // maximum pwm in yüzde yirmibeşine denk gelen rakamı yazıyoruz. %25 den 1,2 deger aşağı olmasını tavsiye ederim. %25 i geçmesin.

bolu_deger = pwm_duty_degeri / pwm_duty_yuzde_yirmibes_degeri ;// 5 rakam yani 0,1,2,3,4 rakamlarını elde etmek için duty degerinin max dutyin %25 ine bölümü

output_A (ledler[bolu_deger]);// elde edilen bolu derine denk gelen yani pwm şiddetine denk gelen çıkışların aktif edilmesi
 
merhaba
verdiğini programı while(1){} komutundan sonra yazsam olur mu. yoksa while döngüsü içerisine mi yazmam gerekiyor.
 
kodu denedim.. sıkıntısız çalışıyor. pwm değerine göre çıkışlar aktif oluyor.

while (TRUE)
{
.....kodlar.......
}

..... kodlar...... yazan yere kodları yerleştirin. tanımlamaları kendi proğramınıza göre değiştirin.

while(TRUE){...} den sonra ne yazarsanız yazın çalışmayacaktır çünkü while (TRUE) şartını bozacak hiç bir durum yoktur. sadece kesmeye gider kesme işlemini yapar ve while (TRUE){...} şartını kontrol eder durur. işlemci tanımlamalarında "TRUE" (doğru) 1 olarak tanımlanmıştır. #define TRUE 1 ... yani while kontrolü sonsuz döngü olmuş oluyor. işlemci o kontrolü aşıp sıradaki işlemleri işlemez.

ister kodu while(TRUE){ kodlar buraya } olarak yaz.

istersen.

rb7 kesmesinde son süslü parantezden önce yaz.


void rb7_kesmesi (void)
{
...
pwm kontrol kodları
...
...
...

"ekleyeceğin kodlar buraya"
}


bu işlemlerden birini yapınca sıkıntısız çalışacaktır.
 
hocam merhaba,
ben tek buton ile spot led kontrolü yapmak istiyorum.
yardımcı olabilir miisiniz ? yapan arkadaşlar varsa devre şeması ve kod paylaşabilir mi ?
 

Forum istatistikleri

Konular
128,118
Mesajlar
915,146
Kullanıcılar
449,822
Son üye
hamidettin

Yeni konular

Çevrimiçi üyeler

Geri
Üst