16f84a pwm sorunu

Başlatan sametozt, 09 Aralık 2011, 01:12:13

sametozt

Merhaba arkadaşlar benim bir sorunum var 16f84a pic ini kullanarak pwm led driver yapmaya uğraşıyorum ama bir türlü kodları çalıştıramadım basic dilinde daha yeniyim ama şu kodlarla çalışması gerek sanırım yardımcı olursanız sevinirim ( Devreyi daha yapamadım isiste simülasyon olarak deniyorum bir türlü çalışmıyor )  :(

TRISB=0
DUTY VAR BYTE
BASLA:
PORTB=0
FOR DUTY=0 to 255
PWM PORTB.1,duty,1000
PAUSE 10
NEXT
GOTO BASLA

sametozt

Arkadaşlar yok mu yardımcı olacak kimse güncell

fatihinanc

Selam,
Foruma hoşgeldiniz öncelikle..

Bir devre şeması ekleyebilirseniz tahminim yardım edebilecek arkadaşlar çıkacaktır.
Koda ben mantık olarak pek bir sorun göremedim ama belki şemada hata olabilir.

Kolay Gelsin.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

justice_for_all

16f84a da pwm yok siz kendinizmi pwm yapmaya calıstınız acaba?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

OG

Konuyla ilgili yüzlerce örnek var forumda.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

sametozt

Devreyi eklemeye hiç gerek yok sadece portb.1 de tc4427 sonrasında ırfz44n var çok basit bir devre ayrıca yüzlerce ornek var ama bir türlü simülasyonda çalışmıyor devreyi yaptıktan sonra da bir aksilik çıkmasın diye öğrenmek istiyorum kodlarda problem yoktur umarım

justice_for_all

#int_TIMER0
void  TIMER0_isr(void) 
{
   set_timer0(230);
   
   if(periyot==0)
   {
      periyot=255;
      output_a(0x1F);
      output_high(pin_b5);
      
     

      /*if(++sayac2>=255)
      {
	      sayac2=0;
       if(!eeprom_okundu)
       {
		 r1=rand();
      	 g1=rand();
      	 b1=rand();
       } 
       else 
       	 return;
      }*/ 	 	
	}
       
   if((periyot-r1)==0)
   {
      output_low(pin_a4);
      output_low(pin_a1);
   }
   if((periyot-g1)==0)
   {
      output_low(pin_a2);
      output_low(pin_a0);
   }
   if((periyot-b1)==0)
   {
      output_low(pin_a3);
      output_low(pin_b5);
   }
   
   periyot--;
}///


c dilinde yapmistim bi devre sadece o bolumu paylasiyorum timer ile yapilmis bir pwm ornegi..
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

sametozt

Paylaşımınız için çok teşekkür ederim ama c dilinden pek anlamıyorum  :(

OG

pause 10 u kaldır

tc4427 yi de bağlama direk mosfeti sür.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

sametozt

Mosfet sürücüyle daha sağlıklı olmaz mı ? ırfz44n logic level mosfet değil mosfeti tam anlamıyla sürmek için kullanıyorum tc yi

justice_for_all

hocam led suruyosaniz cok buyuk bi akim kullanmicaksiniz demektir o zamanda mosfet driver kullanmaniza gerek yok.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

sametozt

Asıl amacım şu yazılımı simülasyonda çalıştırabilseydim şerit led bağlayacaktım ilk bu çalışsın şerit lede geçeceğim

Mustafa48

Öncelikle 16F84 de Hardware PWM yoktur.Bunun yerine 16F628 kullanırsanız 1 kanal PWM vardır.
veya 16f877 kullanırsanız 2 kanal PWM vardır. Ben 16F737 kullanıyorum 3 kanal PWM vardır
Pin özelliklerinde CCP1 şeklinde yazar. Çok yaptığım uygulamalardan 1 tanesini burada paylaşayım.
Fakat Isis de çalışmaz çünkü 16F737 nin model dosyası yok. Bord üzerinde çalışıyor. Özelikle RGB led
uygulamalarında.

trisa=0
trisb=%10000111 'RB.0-RB.1-RB.2  RGB SWİÇ  RB.7=AUTO MAN
trisc=%01111000 '4 ADET GİRİŞ ZAMANLAYICI OLUR


@ DEVICE PIC16F737
@ DEVICE PIC16F737,WDT_OFF
@ DEVICE PIC16F737,PWRT_OFF
@ DEVICE PIC16F737,PROTECT_OFF
@ DEVICE PIC16F737,HS_OSC

DEFINE OSC 20
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT2
DEFINE CCP2_REG PORTC
DEFINE CCP2_BIT1
DEFINE CCP3_REG PORTB
DEFINE CCP3_BIT5
DEFINE HPWM1_TIMER 2
DEFINE HPWM2_TIMER 2
DEFINE HPWM3_TIMER 2
CMCON=7
ADCON1=7

SYMBOL BR=PORTB.0 'DİPSW KIRMIZI YI SABİT YAKMAK İÇİN
SYMBOL BG=PORTB.1 'DİPSW YEŞİL İ SABİT YAKMAK İÇİN
SYMBOL BB=PORTB.2 'DİPSW MAVİ Yİ ABİT YAKMAK İÇİN
SYMBOL MA=PORTB.7 'DİPSW MANUEL AUTO YAPMAK İÇİN



ZAMAN VAR WORD
RED VAR BYTE    'DUTY  HPWM1 İÇİN
GREEN VAR BYTE  'DUTY  HPWM2 İÇİN
BLUE VAR BYTE   'DUTY  HPWM3 İÇİN

CLEAR
PAUSE 200


BASLA:
    IF MA=0 THEN
    HPWM 1,0,15000:HPWM 2,0,15000:HPWM 3,0,15000
    GREEN=0:BLUE=0:RED=0
    GOTO DEVAM
    HPWM 1,0,15000:HPWM 2,0,15000:HPWM 3,0,15000
    ELSE
    IF BR=1 THEN
    HPWM 1,255,15000
    ELSE
    HPWM 1,0,15000
    ENDIF
    IF BG=1 THEN
    HPWM 2,255,15000
    ELSE
    HPWM 2,0,2000
    ENDIF
    IF BB=1 THEN
    HPWM 3,255,15000
    ELSE
    HPWM 3,0,15000
    ENDIF
    ENDIF
    PAUSEUS 5
   
    GOTO BASLA
   

DEVAM:
    ZAMAN=PORTC & $78
    ZAMAN=ZAMAN*8
    IF ZAMAN=0 THEN ZAMAN=50
    FOR GREEN =0 to 255
    IF MA=1 THEN GOTO BASLA
    RED=RED-1
    HPWM 2,GREEN,19000
    HPWM 1,RED,19000 
    PAUSE ZAMAN
    NEXT GREEN
   
    FOR BLUE=0 TO 255
    IF MA=1 THEN GOTO BASLA
    GREEN=GREEN-1
    HPWM 2,GREEN,19000
    HPWM 3,BLUE,19000
    PAUSE ZAMAN
    NEXT BLUE
   
    FOR RED=0 TO 255
    IF MA=1 THEN GOTO BASLA
    BLUE=BLUE-1
    HPWM 3,blue,19000
    HPWM 1,RED,19000
    PAUSE ZAMAN
    NEXT RED
   
GOTO DEVAM

END

Mustafa48

Birde 16F877 ile yapılan 2 kanal PWM örneği vereyim
Yine led uygulamaları için çalışmalardan birisi. Bu isite çalışır

PORTA=0:TRISA=0 'KULLANILMIYOR
TRISB=$FF        'PORTB4 VE 7 ARASI DEĞİŞİKLİK KESMESİ SABİT LED İÇİN
PORTC=0:TRISC=0
PORTD=0:TRISD=$FF
PORTE=0:TRISE=0
OPTION_REG.7=1 '877 YE özgü portB pullup dirençleri PASİF
                               
@ DEVICE PIC16F877
@ DEVICE PIC16F877,WDT_OFF
@ DEVICE PIC16F877,PWRT_OFF
@ DEVICE PIC16F877,PROTECT_OFF
@ DEVICE PIC16F877,HS_OSC

DEFINE OSC 20
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT2
DEFINE CCP2_REG PORTC
DEFINE CCP2_BIT1
DEFINE HPWM2_TIMER 1
DEFINE HPWM1_TIMER 1
ON INTERRUPT GOTO KESME
INTCON=%10001000 'KESMELER AKTİF RB4-7 KESMESİ AKTİF
SYMBOL RBIF=INTCON.0' RB4-7 KESMESİ AKTİF OLUNCA INTCON.0 BİTİ 1 OLUR
                    ' BU BAYRAĞI SIFIRLAMAK GEREKLİDİR.

DURUM VAR BYTE 'RGB SABİTİ İÇİN PORTB.4... 7 ARASI
ZAMAN VAR BYTE 'PORTD Yİ OKU VE ZAMANLAMAYI BUNA GÖRE YAP
RED VAR BYTE
GREEN VAR BYTE
SYMBOL BR=PORTB.4
SYMBOL BG=PORTB.5
SYMBOL BB=PORTB.6

CLEAR
PAUSE 200
RED=255
BASLA:
ZAMAN=PORTD

    FOR GREEN =10 to 255
    RED=RED-1
    HPWM 1,RED,1000
    HPWM 2,GREEN,1000 
    PAUSE ZAMAN
    NEXT

    FOR RED=10 TO 255
    GREEN=GREEN-1
    HPWM 2,GREEN,1000
    HPWM 1,RED,1000
    PAUSE ZAMAN
    NEXT
   
GOTO BASLA

DISABLE
KESME:
IF (BR+BG)=0 THEN
GOTO Y
ELSE
PORTC.2=BR
PORTC.1=BG
ENDIF
GOTO KESME
Y:
RBIF=0
RESUME
ENABLE


END

sametozt

Yardımlarınız için teşekkür ediyorum çok sağolun :)