RGB dimmer Hk

Başlatan yolcu27, 09 Temmuz 2016, 10:37:56

yolcu27

Arkadaşlar pic basic dilinde RGB led sürmek istiyorum. bunu 3 ana 3 ara renkten ziyade istediğim renk tonunu ayarlamak istiyorum .

bir BYTE değişkeni ile portları dimlemek istiyorum 0-255 arasındaki değerlere göre.

örnek bir kod parçacığı varmı acaba hiç dimmer yapmadım da yabancıyım.


şöyle bir kod yazdım ama portlar sırası ile pwm şeklinde yanıyor sönük olarak ama aynı anda yanmıyorlar.


@ DEVICE pic16F628A
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE Pic16F628A, BOD_OFF
@ DEVICE Pic16F628A, LVP_OFF
@ DEVICE pic16F628A, PROTECT_off
@ DEVICE pic16F628A, MCLR_OFF
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT
CMCON=7
DEFINE OSC 4

trisa=%00000000
trisb=%11100000

porta=0
portb=0

pause 50

basla:

pwm portb.7,30,100
pause 1000
pwm portb.6,30,100
pause 1000
pwm portb.5,30,100
pause 2000


pwm portb.7,255,100
 
pwm portb.6,255,100

pwm portb.5,255,100

pause 5000

goto basla

end



t2

Bu işi daha güzel yapan hazir kodlara bakmak gerek.
Soft pwm picbasic

diye arayalim

mg1980

PAUSE'leri kaldırıp dener misin ?

yolcu27

Alıntı yapılan: mg1980 - 09 Temmuz 2016, 15:16:21
PAUSE'leri kaldırıp dener misin ?

hocam şu kısımda pause yok yine aynı sekilde o port direk sönüp diğer porta geçiyor.

pwm portb.7,255,100
 
pwm portb.6,255,100

pwm portb.5,255,100



şimdi tek port üzerinden yollayacağım veri ile deneme yapacağım.  sanırım 16f628a ile birden fazla pwm yapmak için kesme kullanmak gerekiyormuş araştırmalarıma göre bende bluetooth ile usart kesmesi kullanıyorum diğer kesme ile bilrlikte nasıl kullanılır bilemiyorum. bir bakalım ayrı ayrı kodları çalıştırıp bir dosyada birleştirirm herhalde :)

uzaylivolkan

#4
16f628 kullanılarak 3 ayrı led rgb kontrol

'@ device XT_OSC,MCLR_OFF
'INTRC_OSC_NOCLKOUT,MCLR_OFF
  include "modedefs.bas"
'INTCON=%10010000

aa var byte[10]
x var byte
Y var byte
SO   var   PORTB.0
CMCON   = 7
VRCON   = 0
TRISA   =%00000000
TRISB   =%00000011
PORTB   =%00100000

portb.0 =0
DEFINE       OSC 10

TEMP VAR WORD 'BYTE
B0 VAR WORD 'BYTE
SAYI VAR WORD
SAYI1 VAR WORD
 
hiz var word
PARLAKLIK VAR WORD
program var byte
kirmizi var byte
yesil var byte
mavi var byte
a var byte
bekle var byte
PARLAKLIK=255
kirmizi=255
yesil=255
mavi=255
bekle =100
trisb.4=0
trisb.3=0
temp=0
pwmcounter VAR WORD


main:
kirmizi = PARLAKLIK : yesil = PARLAKLIK :mavi  =PARLAKLIK
pwmcounter=255

LOW PORTB.5 
LOW PORTB.6
LOW PORTB.7

CALL PWM_CYCLE

GOTO MAIN

PWM_CYCLE
 IF pwmcounter=kirmizi THEN 
 HIGH PORTB.5     
ENDIF

IF pwmcounter=yesil THEN 
HIGH PORTB.6
ENDIF

IF pwmcounter=mavi THEN 
HIGH PORTB.7
ENDIF

pwmcounter=pwmcounter-1
IF pwmcounter=0 THEN
RETURN
ELSE
GOTO PWM_CYCLE
ENDIF

mehmet

#5
Konu PicBasic başlığı altında açılmış olmasına rağmen,
birilerini işine yarar düşüncesiyle MPLABX ile de yeniden
düzenledim önceki Basic kodlarını.

10MHz. harici kristal ile yaklaşık 220Hz. pwm üretiliyor.
Başka işlemler girerse eğer araya bu hız düşecektir.

Ek:
120Hz. altına inmemek doğru olacaktır...

// PIC16F628A Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = ON       // Brown-out Detect Enable bit (BOD enabled)
#pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = ON         // Data EE Memory Code Protection bit (Data memory code-protected)
#pragma config CP = ON          // Flash Program Memory Code Protection bit (0000h to 07FFh code-protected)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>
#include <stdint.h>


#define _XTAL_FREQ  10000000

#define L_RED       PORTBbits.RB5
#define L_GREEN     PORTBbits.RB6
#define L_BLUE      PORTBbits.RB7

#define PWM_MAX     255

uint16_t pwmSayici = PWM_MAX;
uint8_t kirmizi = 0;
uint8_t yesil = 0;
uint8_t mavi = 0;

void mcuInit(void)
{
    PORTA = 0x00;
    CMCON = 0x07;
    VRCON = 0x00;
    TRISA = 0x00;
    
    PORTB = 0x00;
    TRISB = 0x00;
}

void pwmCycle(void)
{
    while(pwmSayici--)
    {
        if(pwmSayici < kirmizi) L_RED   = 0b1;
        if(pwmSayici < yesil  ) L_GREEN = 0b1;
        if(pwmSayici < mavi   ) L_BLUE  = 0b1;
    }
}

void main(void)
{
    mcuInit();
    
    while(1)
    {
        kirmizi = 20;
        yesil   = 50;
        mavi    = 150;
        
        pwmSayici = PWM_MAX;
        
        L_RED   = 0b0;
        L_GREEN = 0b0;
        L_BLUE  = 0b0;
        
        pwmCycle();        
    }
}
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

yolcu27

işimi for next döngüsü kullanıp gönderdğim verilerin for next içindeki değişkenden küçük yada büyük olmasını kontrol ederek high yada low yaparak hallettim.  çıkışlarada şimdilik bd139 sürdüm  elime geçince irfz44n koyacağım.  bluetooth ile yolladıgım veriyi okuyup karşılarştırıp ona göre kısıyor yada parlaklık arttırıyor şuan. 3 kanalda ayrı ayrı aynı anda çalışıyor.

ama sizin yazdıgınız programları bir ara denemek için arşivledim teşekkürler

mehmet

Alıntı yapılan: yolcu27 - 12 Temmuz 2016, 23:20:02
işimi for next döngüsü kullanıp gönderdğim verilerin for next içindeki değişkenden küçük yada büyük olmasını kontrol ederek high yada low yaparak hallettim.  çıkışlarada şimdilik bd139 sürdüm  elime geçince irfz44n koyacağım.  bluetooth ile yolladıgım veriyi okuyup karşılarştırıp ona göre kısıyor yada parlaklık arttırıyor şuan. 3 kanalda ayrı ayrı aynı anda çalışıyor.

ama sizin yazdıgınız programları bir ara denemek için arşivledim teşekkürler
Mcu ile mosfeti direkt sürmeyiniz. Ya da "lojik level"
türde mos seçiniz. (IRLZ44n)
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

yolcu27

base ile pin arasına 330 ohm direnç koydum hocam base emiter arasına koymaya ihtiyaç duymadım pin zaten normalde logic 0 olacağı için .  daha önce bir çok projede bu şekilde kullandım yanlış mıdır bu tarz kullanım? 

mehmet

#9
BE veya GS arasına emniyet açısından
1-10K arasında bir direnç konabilir.
Mcu çıkarıldığında çıkış kesimde kalması
için. Ancak sürücü kısmı ile iyi hesaplanması
gerekli.

Ek: Base direnci.
Transistör base akımı ve mcu akımı yetiyorsa
sıkıntı yok. Ben genelde 1K tercih ediyorum.
Ama hesaplama yapmak lazım transistöre göre.
Bununla ilgili @z Hoca' nın videoları var.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

yolcu27

valla hesap yapmadım şimdiye kadar ama körlemesine sorun çıkmıyor sanırım. dediğiniz videoya bakıyorum hemen teşekkürler