avatar_Mucit23

16F88 PWM ile birlikte PortB Çalışmıyor.

Başlatan Mucit23, 29 Mayıs 2012, 14:26:34

Mucit23

Merhabalar Ete hocam

Bir sorunla karşı karşıyayım. Göremediğim bir sorun var.

Yine bir motor kontrol devresi üzerinde çalışıyordum. Yazılımını yazdım simülasyonda çalıştırdım sonra devreyi kurdum. ADC den okuduğum potun değerine göre PWM sinyalinin duty değerini değiştiriyorum kısaca. Ayrıca Duty Değerini 0 ile 100 arasında 3 dijit displayde gösteriyorum. Simülasyonda hiç sıkıntı yok herşey olması gerektiği gibi. Ama gerçekte Sadece PWM ve ADC çalışıyor. Ekranda Duty değerini göremiyorum ekrana hiç görüntü gelmiyor. Yani pot değeriyle oynadığımda motor çalışıyor devri değişiyor. Displayler neden çalışmıyor anlamadım. Tüm segmentleri kontrol ettim dijitleri süren transistörleri teker teker kontrol ettim. Sıkıntı yok. Sorun işlemcide olsa gerek..

Yazdığım program budur hocam.
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [Ferhat YOL]                                      *
'*  Notice  : Copyright (c) 2012 [Mucit23]                      *
'*          : All Rights Reserved                               *
'*  Date    : 26.05.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F88                      'işlemci 16F88                             
@ DEVICE pic16F88, WDT_OFF             'Watch Dog timer Kapatıldı.
@ DEVICE pic16F88, PWRT_ON             'Power on timer açık
@ DEVICE pic16F88, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F88, LVP_OFF             'Low Voltage Programming kapalı
@ DEVICE pic16F88, BOD_ON              'Brow Out Detect açık
@ DEVICE pic16F88, MCLR_off            'MCLR kullanılmıyor
@ DEVICE pic16F88, FCMEN_OFF           'Fail Safe Clok Monitör kapalı
@ DEVICE pic16F88, IESO_OFF            'Internal/External Swıtch Over kapatıldı
@ DEVICE pic16F88, CCPMX_OFF           'CCPMX kapalı  (default)
@ DEVICE pic16F88, DEBUG_OFF           'Debug kapalı
@ DEVICE pic16F88, WRT_OFF             'Flash Write Protect kapalı
@ DEVICE pic16F88, CPD_OFF             'Data code Protection kapalı
@ DEVICE pic16F88, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak

TRISA=%00000001
TRISB=%00000000
PORTA=0:PORTB=0


DEFINE ADC_BITS 10
;DEFINE ADC_CLOCK 1
DEFINE ADC_SAMPLEUS 30
DEFINE OSC 4
;Setup...
OSCCON= %01101100
OSCTUNE=%00000000
T2CON = %00000110
INTCON= %10100000       
OPTION_REG=%00000011   
ANSEL =%00000001
ADCON0=%01000001
ADCON1=%10000000
CCP1CON=%00001100
CCPR1L=0
TMR0=131
CMCON=7
PR2=249

ON INTERRUPT GOTO INT

SYMBOL DIG0=PORTA.6
SYMBOL DIG1=PORTA.2
SYMBOL DIG2=PORTA.3

HAM   VAR WORD
DUTY  VAR WORD
X     VAR WORD
SAYI  VAR WORD
DLY   VAR WORD
SYC   VAR BYTE
DATA1 VAR BYTE
DATA2 VAR BYTE
DATA3 VAR BYTE
INDEX VAR BYTE
CHAR  VAR BYTE
ZMN   VAR BYTE
POINT VAR BIT
HATA  VAR BIT
GOSUB DELAY

OLCUMAL:
  ADCIN 0,HAM
  IF HAM>0 THEN
    HATA=1:GOTO ERROR
  ENDIF
GIRIS:
  HATA=0:X=1:ZMN=0:POINT=0
  DATA1=128:DATA2=128:DATA3=128
  GOSUB DELAY
BASLA:
  ADCIN 0,HAM
  DUTY= (ham+1)*/250
  IF X=DUTY THEN BASLA
  X=DUTY
  SAYI=DUTY/10
  CCP1CON.4=DUTY.0
  CCP1CON.5=DUTY.1
  CCPR1L=DUTY>>2
GOSUB WRITE_DISPLAY
GOTO BASLA

WRITE_DISPLAY:
  INDEX=SAYI DIG 0:GOSUB AL:DATA1=CHAR
  INDEX=SAYI DIG 1:GOSUB AL:DATA2=CHAR
  INDEX=SAYI DIG 2:GOSUB AL:DATA3=CHAR
RETURN

AL:
  LOOKUP INDEX,[126,12,182,158,204,218,250,14,254,222],CHAR
RETURN'Karekter al

DELAY:
   FOR DLY=0 TO 500:PAUSE 1:NEXT
RETURN

ERROR:
  IF POINT=1 THEN
    DATA3=242:DATA2=160:DATA1=160
  ELSE
    DATA3=0:DATA2=0:DATA1=0
  ENDIF
 
ADCIN 0,HAM
IF HAM>0 THEN GOTO ERROR
GOTO GIRIS
 

DISABLE
INT:
IF HATA=1 THEN
  ZMN=ZMN+1
    IF ZMN=>100 THEN
      ZMN=0
      POINT=1-POINT
    ENDIF
ENDIF
SELECT CASE SYC
CASE 0
  DIG2=0
    PORTB=DATA1
  DIG0=1
  SYC=1
CASE 1
  DIG0=0
    PORTB=DATA2
  DIG1=1
  SYC=2
CASE 2
  DIG1=0
    PORTB=DATA3
  DIG2=1
  SYC=0
END SELECT
INTCON.2=0
TMR0=131
RESUME
ENABLE
END


Biraz sıkıntıdayım açıkçası hemen bu sorunu çözmem gerekiyor.

Birde şöyle bir durum var aklıma takıldı.
Normalde 16F628 ve türevi işlemcilerde PWM çıkışı RB3 olur. Bu işlemcide iki adet var RB0 ile RB3, Ben PWM donanımını set edip PWM i açtığımda PWM sinyali RB0 dan çıktı bende devremi böyle kurdum. Gerçektede PWM sinyali çalışıyor. RB0 dan çıkıyor. Portb nin diğer bitleri ilede Displayin seğmentlerini sürüyorum.

Ne Sorunu var anlamadım gerçekten.

Yaptığım çalışmayla ilgili dosyaları ekledim hocam bi ilgilenirseniz çok sevinirim gerçekten
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

PWM sinyalinin neden RB0 dan çıktığını anladım CCPMX ile alakalıymış. Zaten oradan çıkması için ayarlamışım. Bunu bilmiyordum
Bunun dışında birçok test yaptım ama sonuç yok.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

s.atak

Mucit23 hocam,

ben pwm konusunu öğrenmeye çalışıyorum,
bir şey sormak istiyorum. daha öncede başka bir projenizi inceledim fakat bir yerde takıldım.
yardımcı olursanız sevinirim.
progman başlangıcında ON INTERRUPT GoTo ınt diyerek kesme oluştuğu ınt adlı etikete git şeklinde vermişsiniz.

sonra programın sonunda kesme alanını yazmışsınız, fakat program içinde kesme etiketine yönlendirecek herhangi bir komut yazmamışsınız, acaba benmi yanlış değerlendiriyorum.
programda kesme etiketine hangi komutla yönlendiriyorsunuz ??
cevabınız için şimdiden teşekkür ederim.
saygılar,

Mucit23

Sorunu çözdüm arkadaşlar teşekkür ederim

Sorunun sebebi ilk enerji verildiğinde registerlerin rastgele değer almasıydı. Bu yüzden kesme alt programında select case bölümü çlışmıyordu
orada ufak bir değişiklik yaptım. Bunun dışındada display taramasında ufakbir hata varmış. Düzeltince çalıştı.

@s.atak

On Interrupt goto ınt etiketi kesme oluşursa kesmeyle ilgili alt programa gidilmesini sağlar. Bunun dışında bizim yapmamız gereken birşey olmuyor. Yani ana programda kesme alt programına biz yönlendirmiyoruz. Kesme oluşursa işlemci otomatikmen kesme isimli alt programa gider.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Mucit,
Mesjını gördüm ancak üzerinde çalışacak durumum yoktu. Şöyle bir baktım pek hata gözükmüyordu.
Sabah uğraşırım demiştim ama baktımki sorunu çözmüşsün.
Çözümüde buraya koyarsan sevinirim. Bizde aynı şekilde eşelenmeyelim.
Aslında açılış gecikmesini koymuşsun.  Belkide registerleri CLEAR komutu ile genel olarak sıfırlamak gerekebiliyor. Belkide bu eksik idi.
Şimdi paktım projeyede anlamsız bir şekilde bütün displaylerde A segmenti yanık olarak kalıp bekliyor. Neden acaba?
Her neyse çözümü bulduğuna sevindim.

Ete


Mucit23

Hocam nedense 16F88 lerde bu sorun var.
Elimde 3 adet 16F88 var hepsindede denedim sorun değişmiyor.
Nedense 16F88 ilk enerji verildiğinde rastgele değerler alıyor. Hatırlarsınız belki Daha önce Multitermostat devresindede 16F88 kullanmıştım. İşlemci ilk çalıştığında tüm registerler rastgele değerler alıyor. Halbuki sigortalardan brown out detect ve power on reset de açık. Yani ideal besleme voltajı gelinceye kadar işlemci resette durması lazım. İlginç bir durum.

Mesela adc olmadan yukarıdaki kodu 16F628 ile deniyorum bir sıkıntı çıkmıyor onda. Şuanda çalışıyor ama ilk enerji verildiğinde ekranda rastgele değerler gösteriyor. Yaklaşık 500ms. Ondan sonra normal görüntü ekrana geliyor.

Hocam programda sorunu bulmak için orayı burayı çok karıştırdım. Sanırım verdiğim kodda yaptığım değişiklikleri düzeltmemişim.
Clear komutunuda ekledim biraz düzeldi ama yine fazla değişen birşey olmadı.

Sorunun asıl sebebi ise şuydu. Kesme alt programında SYC değişkeni rastgele değerler aldığı için hiç case komutları çalışmıyordu.
Ben bu şekilde yapmıştım.

DISABLE
INT:
IF HATA=1 THEN
  ZMN=ZMN+1
    IF ZMN=>100 THEN
      ZMN=0
      POINT=1-POINT
    ENDIF
ENDIF
SELECT CASE SYC
CASE 0
  DIG2=0
    PORTB=DATA1
  DIG0=1
  SYC=1
CASE 1
  DIG0=0
    PORTB=DATA2
  DIG1=1
  SYC=2
CASE 2
  DIG1=0
    PORTB=DATA3
  DIG2=1
  SYC=0
END SELECT
INTCON.2=0
TMR0=131
RESUME
ENABLE


Bunu yaparken dedim bir daha syc değişkenini arttırmakla uğraşmıyayım. Eğer ilk açılışta SYC değişkeni sıfırlamak gerekiyormuş.

Hocam şimdi bu kod çalışması gerekir.
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [Ferhat YOL]                                      *
'*  Notice  : Copyright (c) 2012 [Mucit23]                      *
'*          : All Rights Reserved                               *
'*  Date    : 26.05.2012                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ DEVICE pic16F88                      'işlemci 16F88                             
@ DEVICE pic16F88, WDT_OFF             'Watch Dog timer Kapatıldı.
@ DEVICE pic16F88, PWRT_ON             'Power on timer açık
@ DEVICE pic16F88, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F88, LVP_OFF             'Low Voltage Programming kapalı
@ DEVICE pic16F88, BOD_ON              'Brow Out Detect açık
@ DEVICE pic16F88, MCLR_off            'MCLR kullanılmıyor
@ DEVICE pic16F88, FCMEN_OFF           'Fail Safe Clok Monitör kapalı
@ DEVICE pic16F88, IESO_OFF            'Internal/External Swıtch Over kapatıldı
@ DEVICE pic16F88, CCPMX_OFF           'CCPMX kapalı  (default)
@ DEVICE pic16F88, DEBUG_OFF           'Debug kapalı
@ DEVICE pic16F88, WRT_OFF             'Flash Write Protect kapalı
@ DEVICE pic16F88, CPD_OFF             'Data code Protection kapalı
@ DEVICE pic16F88, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak

TRISA=%00000001
TRISB=%00000000
PORTA=0:PORTB=0


DEFINE ADC_BITS 10
;DEFINE ADC_CLOCK 1
DEFINE ADC_SAMPLEUS 30
DEFINE OSC 4
;Setup...
OSCCON= %01101100
OSCTUNE=%00000000
T2CON = %00000110
INTCON= %10100000       
OPTION_REG=%00000011   
ANSEL =%00000001
ADCON0=%01000001
ADCON1=%10000000
CCP1CON=%00001100
CCPR1L=0
TMR0=131
CMCON=7
PR2=249

ON INTERRUPT GOTO INT

SYMBOL DIG0=PORTA.6
SYMBOL DIG1=PORTA.2
SYMBOL DIG2=PORTA.3

HAM   VAR WORD
DUTY  VAR WORD
X     VAR WORD
SAYI  VAR WORD
DLY   VAR WORD
SYC   VAR BYTE
DATA1 VAR BYTE
DATA2 VAR BYTE
DATA3 VAR BYTE
INDEX VAR BYTE
CHAR  VAR BYTE
ZMN   VAR BYTE
POINT VAR BIT
HATA  VAR BIT
CLEAR
GOSUB DELAY

OLCUMAL:
  ADCIN 0,HAM
  IF HAM>0 THEN
    HATA=1:GOTO ERROR
  ENDIF
GIRIS:
  HATA=0:X=1:ZMN=0:POINT=0
  DATA1=128:DATA2=128:DATA3=128
  GOSUB DELAY
BASLA:
  ADCIN 0,HAM
  DUTY= (ham+1)*/250
  IF Duty>995 then duty=1000
  IF X=DUTY THEN BASLA
  X=DUTY
  SAYI=DUTY/10
  CCP1CON.4=DUTY.0
  CCP1CON.5=DUTY.1
  CCPR1L=DUTY>>2
GOSUB WRITE_DISPLAY
GOTO BASLA

WRITE_DISPLAY:
  INDEX=SAYI DIG 0:GOSUB AL:DATA3=CHAR
  INDEX=SAYI DIG 1:GOSUB AL:DATA2=CHAR
  INDEX=SAYI DIG 2:GOSUB AL:DATA1=CHAR
RETURN

AL:
  LOOKUP INDEX,[126,12,182,158,204,218,250,14,254,222],CHAR
RETURN'Karekter al

DELAY:
   FOR DLY=0 TO 500:PAUSE 1:NEXT
RETURN

ERROR:
  IF POINT=1 THEN
    DATA3=160:DATA2=160:DATA1=242
  ELSE
    DATA3=0:DATA2=0:DATA1=0
  ENDIF
 
ADCIN 0,HAM
IF HAM>0 THEN GOTO ERROR
GOTO GIRIS

DISABLE
INT:
IF HATA=1 THEN
  ZMN=ZMN+1
    IF ZMN=>100 THEN
      ZMN=0
      POINT=1-POINT
    ENDIF
ENDIF
SYC=SYC+1:IF SYC=>3 THEN SYC=0
SELECT CASE SYC
CASE 0
  DIG2=0
    PORTB=DATA1
  DIG0=1
CASE 1
  DIG0=0
    PORTB=DATA2
  DIG1=1
CASE 2
  DIG1=0
    PORTB=DATA3
  DIG2=1
END SELECT
INTCON.2=0
TMR0=131
RESUME
ENABLE
END


Hocam programda ilk enerji verildiğinde ADC de okunan değer 0 olmazsa Ekranda Err hatası verir.
İlk önce  potun değeri sıfırlanmalı sonra sistem normal çalışmaya girer. Güvenlik önlemi gibi birşey yani.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#6
Şimdi baktımda aslında bütün sorunu yaratan tek bir komut var oda ; PORTB=2 şeklinde yazdığın komut.
Asıl kaynak bu. Clear olmaması bir eksiklik yalnızca. Olursa program daha stabil çalışır ama PORTB=2 yazmakla her 1 yada 2 ms de değişmesi gereken ekrana müdahale etmiş ve 2 ms den daha kısa sürede ekranın sürekli A segmentinin aktif olarak görünmesini sağlıyor.
Kesme her 2 ms de bir çalışmasına rağmen PortB=2 komutu belkide her 50 us de bir çalışıyor. O nedenle ekran üstten çizgi göstermekten başka bir iş yapamıyor idi. Düzeltilmiş bölümde onu kaldırınca her şey normale dönmüş zaten.

Kesme kısmında ilk kullandığın mantık da yanlış değil idi. Oda doğrudur SYC nin değerini her hesmede Select case ile değiştirmek ten bahsediyorum.

Ete


Mucit23

Yok hocam şimdi bir problem kalmadı. Yinede yazdığınız için Teşekkürler...
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#8
Kalmamış olması gerekir çünki PORTB=2 satırını silmişsin doğru çalışan programda. Ama denemek istersen burada sorunlu projenin RAR dosyası var. Yeniden geri yükle ve o programdan yalnızca Basla satırından hemen sonra yer alan,
PORTB=2 satırını sil her şeyin yine doğru çalıştığını göreceksin.

Ete

Mucit23

Hocam bence çalışmamasının sebebi o değildi. Onu yapmamın amacı bir çeşit test di. Yani portb Değerini 2 yaparak A segmentini aktif ettim. Sonra Tüm transistörleri ben elimle iletime sokarak sorunmu var diye transistörleri oradan test etmiştim. Dediğim gibi hocam orayı burayı karıştırırken silmeyi unutmuşum onu.

Asıl sebeb dediğim gibi  işlemci ilk çalıştığında değişkenlerin rastgele değerler almasıydı. Kesmede Case İçerisinde SYC değişkenine bir sonraki değeri yüklüyordum. İşlemci ilk çalıştığında SYC değişkenide Rastgele bir değer alıyor olsa gerekki hiçbir Case komutu çalıştırılmıyordu. Bu yüzden ekranda hiçbirşey göremiyordum.  Bunu hala önleyemedim devre ilk çalıştığında ekranda rastgele değerler görüyorum. Gerçi Clear komutunu ekleyince biraz azaldı.

İlk verdiğim programda düzgüb çalışması için Hem portb=2 komutunu kaldırmamız gerekiyor hemde Programın başına clear komutu eklemek gerekiyor. Yada Direk SYC değişkenini sıfırlamak gerekiyor. Bunlar yapılırsa yine düzelir. İlk başta göremiyorum bu hataları..
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#10
Pic16F88 nispeten yeni sınıf işlemcilerden birisi.
Sigorta ayarları FCMEN ve IESO komutlarına PBP derlemesinde ulaşılamıyor. Nerden anlıyorsun dersen, derlediğin programo Pickit2 ile işlemciye yazmaya kalkınca Hex dosyasını yükler yüklemez sigorta ayarlarının hepsini alamadım gibilerden bir şey söylüyor. Alamadığı ayarlar ise CONFIG2 registerinde yer alanlar. Ama derlemeyi MPLAB ile yaparsam hiç sorun olmuyor. her şey yerli yerine oturuyor.
Sanada tavsiyem,
Programın başına önce DEFINE OSC 4 satırını ilave et. Bu işlemcide dahili 8 Mhz de OSC olduğu için bu komutun olması gerekiyor.
Sonra derlemeyi MPLAB ile yap bakalım sonuç nasıl olacak.

MPLAB uyumlu sigorta aayrları için aşağıdaki satırları kullanabilirsin.
'@ __CONFIG _CONFIG1, _CP_ALL & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_ALL & _CPD_ON & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO       
'@ __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF

Bu arada normal sigorta ayarları kullanacak isen her şeyin büyük harfle yazılmış olduğuna da dikkat etmelisin.

Ete

Mucit23

Hocam dediğiniz gibi pk2 öyle bir uyarı veriyordu. Bende merak ediyordum. Öğrenmiş oldum. Şimdi dediğiniz gibi mplab ile kodu derledim. Burada Sıkıntı yok. Artık PK2 de aynı uyarıyı vermiyor.
En son kodu bu şekilde yaptım hocam.  Program ilk açılışta 500ms bekliyor. Ben kesmeyi bu gecikmeden sonra açtım.
Şimdi çok daha iyi oldu. Ekranda açılışta hiç saçma sapan karakterler görmüyorum.

DEFINE OSC 4
@ __CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO       
@ __CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF

TRISA=%00000001
TRISB=%00000000
PORTA=0:PORTB=0


DEFINE ADC_BITS 10
;DEFINE ADC_CLOCK 1
DEFINE ADC_SAMPLEUS 30
;Setup...
OSCCON= %01101100
OSCTUNE=%00000000
T2CON = %00000110
INTCON= %10000000       
OPTION_REG=%00000011   
ANSEL =%00000001
ADCON0=%01000001
ADCON1=%10000000
CCP1CON=%00001100
CCPR1L=0
TMR0=131
CMCON=7
PR2=249

ON INTERRUPT GOTO INT

SYMBOL DIG0=PORTA.6
SYMBOL DIG1=PORTA.2
SYMBOL DIG2=PORTA.3
SYMBOL T0ON=INTCON.5

HAM   VAR WORD
DUTY  VAR WORD
X     VAR WORD
SAYI  VAR WORD
DLY   VAR WORD
SYC   VAR BYTE
DATA1 VAR BYTE
DATA2 VAR BYTE
DATA3 VAR BYTE
INDEX VAR BYTE
CHAR  VAR BYTE
ZMN   VAR BYTE
POINT VAR BIT
HATA  VAR BIT
CLEAR
GOSUB DELAY
T0ON=1 ;Kesme açıldı..
OLCUMAL:
  ADCIN 0,HAM
  IF HAM>0 THEN
    HATA=1:GOTO ERROR
  ENDIF
GIRIS:
  HATA=0:X=1:ZMN=0:POINT=0
  DATA1=128:DATA2=128:DATA3=128
  GOSUB DELAY
BASLA:
  ADCIN 0,HAM
  DUTY= (ham+1)*/250
  IF Duty>995 then duty=1000
  IF X=DUTY THEN BASLA
  X=DUTY
  SAYI=DUTY/10
  CCP1CON.4=DUTY.0
  CCP1CON.5=DUTY.1
  CCPR1L=DUTY>>2
GOSUB WRITE_DISPLAY
GOTO BASLA

WRITE_DISPLAY:
  INDEX=SAYI DIG 0:GOSUB AL:DATA3=CHAR
  INDEX=SAYI DIG 1:GOSUB AL:DATA2=CHAR
  INDEX=SAYI DIG 2:GOSUB AL:DATA1=CHAR
RETURN

AL:
  LOOKUP INDEX,[126,12,182,158,204,218,250,14,254,222],CHAR
RETURN'Karekter al

DELAY:
   FOR DLY=0 TO 500:PAUSE 1:NEXT
RETURN

ERROR:
  IF POINT=1 THEN
    DATA3=160:DATA2=160:DATA1=242
  ELSE
    DATA3=0:DATA2=0:DATA1=0
  ENDIF
 
ADCIN 0,HAM
IF HAM>0 THEN GOTO ERROR
GOTO GIRIS

DISABLE
INT:
IF HATA=1 THEN
  ZMN=ZMN+1
    IF ZMN=>100 THEN
      ZMN=0
      POINT=1-POINT
    ENDIF
ENDIF
SYC=SYC+1:IF SYC=>3 THEN SYC=0
SELECT CASE SYC
CASE 0
  DIG2=0
    PORTB=DATA1
  DIG0=1
CASE 1
  DIG0=0
    PORTB=DATA2
  DIG1=1
CASE 2
  DIG1=0
    PORTB=DATA3
  DIG2=1
END SELECT
INTCON.2=0
TMR0=131
RESUME
ENABLE
END


Hocam IRF540 için bir aralar direk pic ile sürebilirsiniz gibi bir tabir kullanmıştınız. Ben gerçekte bir iki deneme yaptım mosfet çalışıyor ama RDS direnci yüksek kalıyor.
Mosfet sürmek için Elimde mosfet sürücü enteğre yoktu. Bende birkaç transistör ile kendim bir sürücü yapmaya çalıştım. Gerçekte çok iyi çalışıyor. Sizce ideal bir sürücü olurmu?


image hosting adult
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

KAZIMUGUR

Pic le sürebilmek yani 5V ile sürebilmek için mos kataloğunda " logic level " mos yazması lazım.

Q4-5 gereksiz , R5 az daha sağda olsa iyi olur.

[IMG]http://img825.imageshack.us/img825/9643/mos1a.jpg[/img]

Uploaded with ImageShack.us

ete

Kazım'a katılıyorum. IRF540 bir çok kez kullandığım bir mosfet dir ve direk Pic çıkışı ile sürülebilmektedir.
Dolayısıyla push-pull çıkışa orada gerek yok bence. Opto izolatör kullanabilirsin ona bir şey demem ama diğerlerine gerek yok.

Ete

KAZIMUGUR

[IMG]http://img256.imageshack.us/img256/2079/gate1k.jpg[/img]

Uploaded with ImageShack.us

----------

Bunun yerine 40N06 gibi bir eleman daha uygundur.
Logic level gate.
İletim dirençleride genelde çok düşük olur.

Powered by EzPortal