RGB-PWM CONTROL

Başlatan XX_CİHAN_XX, 11 Kasım 2006, 15:32:18

XX_CİHAN_XX

Aşağıdaki programı assembly de yazdım.RB0,RB1 ve RB2 den R-G-B pwm çıkışı oluşturuluyor ve bu pwm çıkışları RB4,RB5 ve RB6 ya bağlı butonlar ile kontrol ediliyor.
Devreyi boarda veya plakete kuracak arkadaşlar için not:
Buton girişleri direnç ile pull-up yapılmalı.Butona basıldıgında pıce lojik 0 gelecek şekilde bağlayın.
;***********************************************
;RGB-PWM PROGRAMI
;RB0--->KIRMIZI LED CIKISI
;RB1--->YESIL LED CIKISI
;RB2--->MAVI LED CIKISI
;RB4--->KIRMIZI LED BUTONU
;RB5--->YESIL LED BUTONU
;RB7--->MAVI LED BUTONU
;BUTONLARA BASILI TUTULDUGU SURECE ILGILI LED CIKISINDA 0-255 ARASI PWM 
;DARBESI OLUSTURULARAK RGB KARISIMLARI ILE CESITLI RENKLER ELDE EDILMEKTEDIR.(20MHZ XT YE GORE)
;***********************************************
		LIST		P=16F628A
		INCLUDE		"P16F628A.INC"
;***********************************************
	__config(_CP_OFF & _PWRTE_OFF & _HS_OSC & _WDT_OFF & _BODEN_OFF & _LVP_OFF)
		ERRORLEVEL -302
		ERRORLEVEL -306		
;*******************************************************
		CBLOCK		0x20
PWM_FLAG
PWM_RED
PWM_GREEN
PWM_BLUE
RISE_RED
RISE_GREEN
RISE_BLUE
FALL_RED
FALL_GREEN
FALL_BLUE
		ENDC
;*******************************************************
#DEFINE		PWMOUTR		PORTB,0
#DEFINE		PWMOUTG		PORTB,1
#DEFINE		PWMOUTB		PORTB,2
;*******************************************************
#DEFINE		BT_RED		PORTB,4
#DEFINE		BT_GREEN	PORTB,5
#DEFINE		BT_BLUE		PORTB,6
;*******************************************************
#DEFINE		END_BLUE	PWM_FLAG,0
#DEFINE		END_GREEN	PWM_FLAG,1
#DEFINE		END_RED		PWM_FLAG,2		
#DEFINE		END_BLUE2	PWM_FLAG,3
#DEFINE		END_GREEN2	PWM_FLAG,4
#DEFINE		END_RED2	PWM_FLAG,5		
;*******************************************************
		ORG			0x00
		GOTO		SETUP
		ORG			0x04
		RETFIE
;*******************************************************
SETUP
		MOVLW		0x07
		MOVWF		CMCON
		CLRF		PORTB
		BSF			STATUS,5
		MOVLW		0x70
		MOVWF		TRISB
		BCF			STATUS,5
		CLRF		PWM_RED
		CLRF		PWM_GREEN
		CLRF		PWM_BLUE
;*******************************************************
MAIN
		CALL		BUTON_OKU
		CALL		RGB_PWM
		GOTO		MAIN
;*******************************************************
BUTON_OKU
		BTFSS		BT_BLUE
		INCF		PWM_BLUE,F
		BTFSS		BT_GREEN
		INCF		PWM_GREEN,F
		BTFSS		BT_RED
		INCF		PWM_RED,F
		RETURN
;*******************************************************
RGB_PWM
		CLRF		PWM_FLAG
		CALL		RELOAD_BLUE
		CALL		RELOAD_GREEN
		CALL		RELOAD_RED
		CLRF		PWM_FLAG
;*******************************************************
BLUE_PWM
		MOVF		PWM_FLAG,W
		SUBLW		0x3F
		BTFSC		STATUS,Z
		RETURN
;*******************************************************
		DECF		RISE_BLUE,F
		COMF		RISE_BLUE,W
		BTFSC		STATUS,Z
		GOTO		DOWN_BLUE
		BSF			PWMOUTB
		GOTO		GREEN_PWM
;*******************************************************
DOWN_BLUE
		CLRF		RISE_BLUE
		DECF		FALL_BLUE,F
		COMF		FALL_BLUE,W
		BTFSS		STATUS,Z
		BCF			PWMOUTB
		BTFSC		STATUS,Z
		CALL		RELOAD_BLUE		
;*******************************************************
GREEN_PWM
		DECF		RISE_GREEN,F
		COMF		RISE_GREEN,W
		BTFSC		STATUS,Z
		GOTO		DOWN_GREEN
		BSF			PWMOUTG
		GOTO		RED_PWM
;*******************************************************
DOWN_GREEN
		CLRF		RISE_GREEN
		DECF		FALL_GREEN,F
		COMF		FALL_GREEN,W
		BTFSS		STATUS,Z
		BCF			PWMOUTG
		BTFSC		STATUS,Z
		CALL		RELOAD_GREEN		
;*******************************************************
RED_PWM		
		DECF		RISE_RED,F
		COMF		RISE_RED,W
		BTFSC		STATUS,Z
		GOTO		DOWN_RED
		BSF			PWMOUTR
		GOTO		BLUE_PWM
;*******************************************************
DOWN_RED
		CLRF		RISE_RED
		DECF		FALL_RED,F
		COMF		FALL_RED,W
		BTFSS		STATUS,Z
		BCF			PWMOUTR
		BTFSC		STATUS,Z
		CALL		RELOAD_RED
		GOTO		BLUE_PWM
;*******************************************************
RELOAD_BLUE
		CLRF		FALL_BLUE
		COMF		PWM_FLAG,W
		ANDLW		0x07
		BTFSC		STATUS,Z
		BSF			END_BLUE2
		BTFSC		STATUS,Z
		BCF			PWMOUTB
		BTFSC		STATUS,Z
		RETURN
;*******************************************************
		MOVF		PWM_BLUE,W
		MOVWF		RISE_BLUE
		SUBLW		.255
		MOVWF		FALL_BLUE
		BSF			END_BLUE
		RETURN
;*******************************************************
RELOAD_GREEN
		CLRF		FALL_GREEN
		COMF		PWM_FLAG,W
		ANDLW		0x07
		BTFSC		STATUS,Z
		BSF			END_GREEN2
		BTFSC		STATUS,Z
		BCF			PWMOUTG
		BTFSC		STATUS,Z
		RETURN
;*******************************************************
		MOVF		PWM_GREEN,W
		MOVWF		RISE_GREEN
		SUBLW		.255
		MOVWF		FALL_GREEN
		BSF			END_GREEN
		RETURN
;*******************************************************
RELOAD_RED
		CLRF		FALL_RED
		COMF		PWM_FLAG,W
		ANDLW		0x07
		BTFSC		STATUS,Z
		BSF			END_RED2
		BTFSC		STATUS,Z
		BCF			PWMOUTR
		BTFSC		STATUS,Z
		RETURN
;*******************************************************
		MOVF		PWM_RED,W
		MOVWF		RISE_RED
		SUBLW		.255
		MOVWF		FALL_RED
		BSF			END_RED
		RETURN
;*******************************************************
		END
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

XX_CİHAN_XX

Buyur buda şeması

http://img93.imageshack.us/my.php?image=rgbwk0.jpg

ledlerin yuksek akım yada voltajda çalışıyorsa transıstor ıle kuvvetlendırerek surmelısın
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

webmehmet

ya arkadslar ben asmden hıc anlamıyorum bu pıc ısıne yenı gırdımm ben ara renklerı olusturamadım nasıll yapacam pbpda yardımcıı olacak varmı acaba

XX_CİHAN_XX

Alıntı yapılan: "webmehmet"ya arkadslar ben asmden hıc anlamıyorum bu pıc ısıne yenı gırdımm ben ara renklerı olusturamadım nasıll yapacam pbpda yardımcıı olacak varmı acaba
Merhaba arkadaşım.
Öncelikle bir önceki mesajında büyüklerimizin sana yaptığı telkinleri dikkate almanı tavsiye ederim.Umarım bundan sonraki mesajlarında bu konuda bizler kadar hassas olursun.
Soruna gelince; açıkçası ben pbp bilmem.Sadece asm kullanırım.Yukarıdaki asm programını rgb ledlerle denedim gayet iyi çalışıyor.Ancak sana daha kolay anlaman ve geliştirebilmen açısından pbp örnekleri lazımsa daha öncede dediğim gibi sitede arama yapmanı öneririm.Örnek teşkil etmesi açısından hızlıca bir arama yaptım ve faydalanabileceğin birkaç link veriyorum.Daha  fazlasıda var elbet ama onları senin incelemen daha iyi olur.

ETE hocamızın Picbasic dersleri.
http://www.4shared.com/file/17435059/b7b33870/BASIC-DERS.html
(şifre: www.picproje.org)

Burada örnek teşkil etmesi açısından basit bir kod var.
https://www.picproje.org/index.php/topic,17117&highlight=pwm

Burada anahtar kelime "pwm"
Arama motoruna bunu yazıp aratırsan ve özellikle picbasic forumunda incelemede yaptırabilirsin.Yukarıda verdiğim bilgiler gibi birçok bilgiye ulaşırsın.
Renklerin tonlaması pwm denilen olay ile yapılır.pwm ile ledi ara değerlerde yakarak farklı tonlar elde edersin.RGB için 3 ayrı pwm çıkışı oluşturacaksın.Forumu biraz daha incele.Basic bilen arkadaşlar kod bakımından daha detaylı yardımcı olabilirler.Ancak ilk öğrenmen gereken şey PWM dir.
Kolay gelsin.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

webmehmet

evet arkadasım buyuklerımız yanlıs kelımler kullandıgım ıcın dogru olan uyarıyı yaptılar haklılarda yanıı kızmadım onlara......

yardımın ıcın tskk ederım

swat

selam cihan.
güzel bir yazılım hazırlamışın tşk.
bende sana birkaç tüyo vereyim :)
16f628 in kendi donanımındaki pwm i kullanarak daha hızlı RGB sürebilin. Bu pwm tek kanal olduğu için 3 LEDe ayrı ayrı taşıman gerekecek. bunun için transistör yada başka bişey kullanabilin.
pwm sinyali PCLyi meşgul etmeden sürekli çıkacaktır.
konrol için 3 pin ayıracaksın. bu pinler pwm çıkışını LEDler ile bağlantı kuracak. Her LED için değişik pwm frekansı ayarlayacaksın.
örnek şemadaki devreyi incelersen belki nedemek istediğimi daha iyi anlarsın.

http://img353.imageshack.us/img353/7599/pwmrgbuy1.jpg
şemadaki mavi renkli bağlantı pwm çıkışı.


iyi çalışmalar.

XX_CİHAN_XX

Merhaba swat.
Bahsettiğin mantık güzel.Tavsiye ettiğine göre denediğini varsayıyorum.Aslında meşguliyet açısından aynı kapıya çıkıyor.Sonuçta picin kendi pwm ini kullansanızda bunu 3 hatta birden paylaştırmanız yanı bir tarama yapmanız gerekiyor.Bu taramayı timer0 aracılığıyla periyodik olarak otomatik yaptırmak mümkün tabi işte ozaman güze sonuç alınabilir.3 kanal pwm pici (tam olarak) meşgul etmeden oluşturulabilir.Tabi burada şöyle bir sorun çıkabilir.Onuda denediyseniz sormak isterim.Oda şu ki birinci pwm oluşturulduktan sonra bir diğerine geçmeden önce bir müddet beklemeniz gerekir.Bu bekleme yeteri kadar olmazsa.Oluşturduğunuz pwm ya gerçek değeri vermez yada 2. ve 3. pwm ler sırasında kaldığı boşluk anı o hattın konumunda gözle görülür bozulmalara yol açabilir.Özellikle ordan çekilen akımda bunu daha belirgin kılabilir.Bunları bertaraf edebilmek için fazlaca pwm bekletmek bu sefer taramayı yavaşlatarak gözle görülür kıpraşımlara yol açabilir.Bu olayları biraz daha düzeltmek için şemanıza ek olarak pwm hattı 100nf ile şaseye çekilirse dahada sağlıklı olacaktır ama yinede yukarıda yazdığım sorunların çıkma ihtimali yüksek gibi geliyor.Bu konuda sizin denemeleriniz olduysa bilgi almak isterim.
Ek olarak yukarıda verdiğim pwm programı çok önceden yazdığım bir program ve manuel bir program haliyle pici tam olarak meşgul ediyor.Ancak bu programı tmr0 kesmesini kullanrak otomatikleştirip aynı mantıkla 3 kanal halinde pwm çıkarabilecek şekle getirmek mümkün.Bu durumda daha hızlı ve yine donanımsal pwm de oldugu gibi pici( tam olarak) meşgul etmeden bana göre daha sağlıklı pwm oluşturabiliriz.
Sizin önerdiğiniz taramalı pwm mantığında taramadan dolayı tam performans alınamaz ve yukarıda izah ettiğim sorunlar meydana gelebilir diye düşünüyorum ancak denediyseniz daha net bilgiler verebilirsiniz tabiiki.
Saygılar, sevgiler...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

firatim38

selam arkadaşlar. ben pot ile 2 tane motor kontrolu yapmak istiyorum. pic16f88 kullanıyorum, pice pot bağlıcam 2 tane ve bu potları ayarlayarak motorların kontrolunu yapcam. ancak 16f88 de bi tane ccp çıkışı olduğu için sadece tek motorun kontrolunu yapabiliyorum. yani yazılımsal olarak yapmam gerek. yardımcı olabilcek olan var mı??

LukeSkywalker

Bu işin en güzel mantığını Yavuz Erol Biltek'teki yazısında anlatmış. İncelemenizi tavsiye ederim.

firatim38

peki bi soru daha sorayım eğer cevaplarsanız?
yazdığı kod aşağıda. ben yazılımsal olarak yaptığım pwm de yani timer0 kesmesinde frekansı 20000 hz ayarlamak istiyorum nasıl yapabilirim.?

#INCLUDE<16F88.h>
#DEVICE ADC=10
#FUSES XT,NOWDT,NOPROTECT,NOLVP,NOPUT,NOWRT
#USE DELAY(CLOCK=4000000)

#USE fast_io(a)
#USE fast_io(b)

int16 pot_gelen=0;
int16 pot2=0;
int1 k = 0;
#INT_TIMER0
void TIMER0_isr()
{   
  if(k==0)
  {
      set_timer0(255-pot2);
      output_bit(pin_b2,1);
      k=1;
     
  }
  else
  { 
     set_timer0(pot2);
     output_bit(pin_b2,0);
     k=0;
  }
     
}

void main()
{   
   setup_timer_1(T1_DISABLED);
   
   setup_timer_2(T2_DIV_BY_1,49,1);
   setup_CCP1(CCP_PWM);
   set_tris_a(0x03);
   set_tris_b(0x00);
   output_b(0x00);
   
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);
   
   setup_adc(adc_clock_internal);
   setup_adc_ports(ALL_ANALOG);
   while(1)
   {
      set_adc_channel(0);
      delay_us(20);
      pot_gelen=read_adc();
      set_pwm1_duty(pot_gelen/5);
       
      set_adc_channel(1);
      delay_us(20);
      pot2=read_adc();
       
    }
 

}