pwm

Başlatan bk, 28 Eylül 2021, 14:30:15

bk

pwm
ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.

;OPTION_REG.7 = 0 ;pull-ups aktif
OPTION_REG=%00001000  'Pull up dirençleri İPTAL- Bölme oranı 1/1
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
ANSEL=0
CMCON=7    '12f675de komparatör pinleri iptal hepsi giriş çıkış
ADCON0=0
;WPU=0
'----------------------------------------------------------------------------
R var byte
RH VAR BYTE  
RL VAR BYTE
I VAR BYTE
W var bit
symboL BUTON=GPIO.0
symbol CIK=GPIO.2
    
'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
'PAUSE 200
TMR0=240
R=2
RH=r:RL=100-rH
'-----------------------------------------------------------------------------
OFK:
      GPIO.2=0
      PAUSE 500
      GPIO.2=0
      IF BUTON=0 THEN BASLa
      GPIO.0=0
      GOTO OFK    
      
DEVAM:
      IF BUTON=0 THEN ASI
      GOTO DEVAM 

BASLA:
      
      IF R=99 THEN DEVAM
      IF BUTON=1 THEN 
        R=R+1:IF R=100 THEN R=99          
        GOSUB DELAY        
      ENDIF
GOTO BASLA
ASI:
      PAUSE 3000      
AS:
      IF R=1 THEN OFK        
      IF BUTON=1 THEN
        R=R-1:IF R=0 THEN R=1
        GOSUB DELAY
      ENDIF            
GOTO AS

DELAY:
          FOR I=0 TO 255:NEXT 
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
                  
      RETURN

DISABLE
KESME: 

      IF CIK=255 THEN
        RH=RH-1
        IF RH=0 then 
          CIK=255-CIK
          RH=R
        endif
        ELSE
        RL=RL-1
        IF RL=0 THEN
          CIK=255-CIK  
          RL=100-Rh
        ENDIF
      ENDIF
          
      TMR0=240
      INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
      RESUME
      ENABLE
      
END


pwm çoğalıp azalmıyor. pic628 pbp ile yaptım ancak pic12f675 te olmadı acil yardım.

ete

Bir program yazılırken işlemcinin pinleri şemaya uygun olarak giriş veya çıkış olarak ayarlanması gerekir.
Programa bakıyorum Buton diye bir Sembol tanımlanmış. Bu muhtemelen bir giriş pini olmalı. Zira programda bazı noktaların aşılabilmesi için Butona basılması bekleniyor. Ama programda bu butonun adı var sanı yok maalesef. GPIO.0 pinine bağlı ama bu pin Giriş pini olarak ayarlanmamış. Yani buton çalışmayacaktır. TRISIO.0=1 komutu programa eklenmesi gerekir.
Sonrası çalışabilir. Mantığını anlayamadım maalesef. Kesme var programda ama büyük değerlikli PAUSE komutlarıda mevcut. Pauseler keseme içeren programlarda kullanılmamalıdır. Programı büyük ölçüde aksatırlar.

Ete

bk

#2
DEFINE OSCCAL_1K 1
define osc 4
GPIO=0
TRISIO=%00111011  '

'-----------------------------------------------------------------
;@ DEVICE pic12F675                      'işlemci 12F675                                
;@ DEVICE pic12F675, WDT_OFF              'Watch Dog timer kapalı
;@ DEVICE pic12F675, PWRT_ON            'Power on timer açık
;@ DEVICE pic12F675, PROTECT_OFF          'Kod Koruma kapalı
;@ DEVICE pic12F675, MCLR_off          'MCLR pini kullanılmıyor.
;@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------
'-------------------------------------------------------------------------
ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.

;OPTION_REG.7 = 0 ;pull-ups aktif
OPTION_REG=%00001000  'Pull up dirençleri İPTAL- Bölme oranı 1/1
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif
ANSEL=0
CMCON=7    '12f675de komparatör pinleri iptal hepsi giriş çıkış
ADCON0=0
;WPU=0
'----------------------------------------------------------------------------
R var byte
RH VAR BYTE  
RL VAR BYTE
I VAR BYTE
W var bit
symboL BUTON=GPIO.0
symbol CIK=GPIO.2
    
'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
'PAUSE 200
TMR0=240
R=2
RH=r:RL=100-rH
'-----------------------------------------------------------------------------
OFK:
      GPIO.2=0
      PAUSE 500
      GPIO.2=0
      IF BUTON=0 THEN BASLa
      GPIO.0=0
      GOTO OFK    
      
DEVAM:
      IF BUTON=0 THEN ASI
      GOTO DEVAM 

BASLA:
      
      IF R=99 THEN DEVAM
      IF BUTON=1 THEN 
        R=R+1:IF R=100 THEN R=99          
        GOSUB DELAY        
      ENDIF
GOTO BASLA
ASI:
      PAUSE 3000      
AS:
      IF R=1 THEN OFK        
      IF BUTON=1 THEN
        R=R-1:IF R=0 THEN R=1
        GOSUB DELAY
      ENDIF            
GOTO AS

DELAY:
          FOR I=0 TO 255:NEXT 
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
                  
      RETURN

DISABLE
KESME: 

      IF CIK=255 THEN
        RH=RH-1
        IF RH=0 then 
          CIK=255-CIK
          RH=R
        endif
        ELSE
        RL=RL-1
        IF RL=0 THEN
          CIK=255-CIK  
          RL=100-Rh
        ENDIF
      ENDIF
          
      TMR0=240
      INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
      RESUME
      ENABLE
      
END


Özür dilerim programı baştan kopyasını aktaramamışım.Şimdi tam kopyasını gönderdim. Bu yazılımda butona bastığımda çıkıştaki led pwm ile 2 değerinden 99 değerine yükselecek.birdaha butona bastiğimda 3 sn bekledikten sonra 99 değerinden 0 değerine pwm ile azalıp off durumuna geçecek.gpio.0 giriş gpio.2 çıkış timer0 kesmesi kullanıyoruz.

bk

on off olarak çalışıyor fakat pwm çalışmıyor.628 de bunu başardım. 675 te olmadı atladığım biryermi var.

ete

Onu sen bileceksin. Bak atladığın yer varmış ben söyledim. 628 in programı burada olmayınca atladığın yeri kendin bulacaksın artık.
Ete

bk

bulabilsem sizden yardım rica etmem

bk

pbp ye de pek hakim değilim. Kendimce uğraşıyorum

bk

inceliyorum fakat neden bulamıyorum. yardımınızı bekliyorum.

bk

#8
define osc 4
PORTA=0:portb=0
TRISB=%11111110  '
TRISA=%00001110  '
'-----------------------------------------------------------------
;@ DEVICE pic16F628                      'işlemci 16F628                                
;@ DEVICE pic16F628, WDT_OFF              'Watch Dog timer kapalı
;@ DEVICE pic16F628, PWRT_ON            'Power on timer açık
;@ DEVICE pic16F628, PROTECT_OFF          'Kod Koruma kapalı
;@ DEVICE pic16F628, MCLR_off          'MCLR pini kullanılmıyor.
;@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 
'-----------------------------------------------------------------
'-------------------------------------------------------------------------
ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%00001000  'Pull up dirençleri İPTAL- Bölme oranı 1/1
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif

CMCON=7    '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'----------------------------------------------------------------------------
R var byte
RH VAR BYTE  
RL VAR BYTE
I VAR BYTE
W var bit
symboL BUTON=PORTA.2
    
'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
'PAUSE 200
TMR0=243
R=2
RH=r:RL=100-rH
'PORTA=%00000111
'-----------------------------------------------------------------------------
OFK:
      PORTB.0=0
      PAUSE 500
      PORTB.0=0
      IF BUTON=0 THEN BASLa
      PORTB.0=0
      GOTO OFK    
      
DEVAM:
      IF BUTON=0 THEN ASI
      GOTO DEVAM 

BASLA:
      
      IF R=99 THEN DEVAM
      IF BUTON=1 THEN 
        R=R+1:IF R=100 THEN R=99          
        GOSUB DELAY        
      ENDIF
GOTO BASLA
ASI:
      PAUSE 3000      
AS:
      IF R=1 THEN OFK        
      IF BUTON=1 THEN
        R=R-1:IF R=0 THEN R=1
        GOSUB DELAY
      ENDIF            
GOTO AS

DELAY:
          FOR I=0 TO 255:NEXT 
          FOR I=0 TO 255:NEXT 
          FOR I=0 TO 255:NEXT 
          FOR I=0 TO 255:NEXT 
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
                  
      RETURN

DISABLE
KESME: 

      IF PORTB=255 THEN
        RH=RH-1
        IF RH=0 then 
          PORTB=255-PORTB
          RH=R
        endif
        ELSE
        RL=RL-1
        IF RL=0 THEN
          PORTB=255-PORTB  
          RL=100-Rh
        ENDIF
      ENDIF
          
      TMR0=243
      INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
      RESUME
      ENABLE
      
END

bk

programda alıntılar mevcut.

ete

Mesajlarda KOD verirken "code Tag"  kullanalım lütfen. NAsıl kullanılıyor dersen mesaj yazma ekranında üstte muhtelif butonlar mevcut. Kursüro bunların üzerinde gezdirirken "Code" yazısı belirirse ona tıkla. Ekranda iki adet Code yazısı köşeli parantez içinde belirecektir. İki parantezin ortasına kodu'nuzu yerleştirin hepsi bu.

Gelelim çalışmayan programa. Birinci sorun BUTON isminin değişken adı olarak kullanılması. Bu aslında tek T li olanı kullanılması gerek ama bu ismide özel basic komut isimlerinden kabul ediyor derleyici. Bu nedenle BUTON ismi yerine TUS adını kullandım.

İkinci sorun ise Bit ile Byte değişken değerlerini tam anlayamamış olman olarak gözüküyor.
Tek bir bit için BIT değişkeni kullanırız. Mesela PORT pini tek başına BIT dir. Çünki tek bir pindir. Alacağı değer "1" veya "0" dır.  Tek bir pine 255 değeri verilebilirmi ? verilemez. Çünki 255 değeride BYTE değeridir ve BIT'e atanamaz.
Programda KESME kısmında  IF CIK=255 THEN şeklinde bir komut satırı var. Burada,
CIK Bit değişkenidir ve bir PORT pinini göstermektedir. Peki bunun 255 olabilme ihtimali varmıdır. Kesinlikle yok elbette. O halde BIT değişkeninin alabileceği değerleri aklımıza getirirsek bu satır  IF CIK=1 THEN şeklinde değiştirilmeldir. Benzer şekilde CIK=255-CIK komut satırıda yanlış olmaktadır. Doğrusu CIK=1-CIK olmalıdır. Bu belirttiğim satırların altında da benzer bazı yanlışlıklar mevcut onlarıda düzeltmek gerekir. Programdaki gecikmeleride kaldırdım faydadan ziyade zararları var çünki.

Programın düzeltilmiş şekli aşağıdadır.
'@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF
DEFINE OSCCAL_1K 1
define OSC 4
GPIO=0
TRISIO=%00111011   '
ANSEL=0
WPU=%00000001
CMCON = 7
'-----------------------------------------------------------------
;@ DEVICE pic12F675                      'işlemci 12F675                               
;@ DEVICE pic12F675, WDT_OFF                 'Watch Dog timer kapalı
;@ DEVICE pic12F675, PWRT_ON                'Power on timer açık
;@ DEVICE pic12F675, PROTECT_OFF          'Kod Koruma kapalı
;@ DEVICE pic12F675, MCLR_off               'MCLR pini kullanılmıyor.
;@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
'-------------------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.

OPTION_REG=%00001000   'Pull up dirençleri İPTAL- Bölme oranı 1/1
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif

'----------------------------------------------------------------------------
 R var byte
 RH VAR BYTE   
 RL VAR BYTE
 I VAR BYTE
 W var bit
 symboL TUS=GPIO.0
 symbol CIK=GPIO.2
     
'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı

TMR0=243
R=2
RH=r:RL=100-rH
PAUSE 300  'bu gecikme mutlaka koyulmalıdır açılış gecikmesidir. Gerekli olan bir komutdur.
'-----------------------------------------------------------------------------
OFK:

       CIK=0
       IF TUS=0 THEN BASLA

       GOTO OFK   
       
DEVAM:
       IF TUS=0 THEN ASI
       GOTO DEVAM

BASLA:
     
      IF R=99 THEN DEVAM
      IF TUS=1 THEN
         R=R+1
         IF R=100 THEN R=99         
         GOSUB DELAY         
      ENDIF
      GOTO BASLA
ASI:
  
AS:
      IF R=1 THEN OFK         
      IF TUS=1 THEN
         R=R-1:IF R=0 THEN R=1
         GOSUB DELAY
      ENDIF           
GOTO AS

DELAY:    
           FOR I=0 TO 255:NEXT
           FOR I=0 TO 255:NEXT
           FOR I=0 TO 255:NEXT
           FOR I=0 TO 255:NEXT
           FOR I=0 TO 255:NEXT
           FOR I=0 TO 255:NEXT
           FOR I=0 TO 255:NEXT
           FOR I=0 TO 255:NEXT
           FOR I=0 TO 255:NEXT
           FOR I=0 TO 255:NEXT
           FOR I=0 TO 255:NEXT
                 
      RETURN

DISABLE
KESME:

      IF CIK=1 THEN
         RH=RH-1
         IF RH=0 then
           CIK=1-CIK
           RH=R
         ENDIF
         ELSE
         RL=RL-1
         IF RL=0 THEN
           CIK=1-CIK 
           RL=100-Rh
         ENDIF
       ENDIF
         
      TMR0=243
      INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
      RESUME
      ENABLE
     
END


 Ete


bk

bkpwm

Merhabalar,
yardımınız için teşekkürler,sayfanızda yeni olduğum için bazı hatalar olacak uyarılarınız için teşekkürler.
pbp ve yazılımda yeniyim.Sizlerin sayesinde kendimi geliştireceğim. Bende bildiğim konuları sizinle paylacağım.
tekrar teşekkürler.

bk

#12
PWM

'@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF
DEFINE OSCCAL_1K 1
define OSC 4
GPIO=0
TRISIO=%00111011  '
ANSEL=0
WPU=%00000001
CMCON = 7
'-----------------------------------------------------------------
;@ DEVICE pic12F675                      'işlemci 12F675                              
;@ DEVICE pic12F675, WDT_OFF                'Watch Dog timer kapalı
;@ DEVICE pic12F675, PWRT_ON                'Power on timer açık
;@ DEVICE pic12F675, PROTECT_OFF          'Kod Koruma kapalı
;@ DEVICE pic12F675, MCLR_off              'MCLR pini kullanılmıyor.
;@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
'-------------------------------------------------------------------------
ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.

OPTION_REG=%00001000  'Pull up dirençleri İPTAL- Bölme oranı 1/1
INTCON=%10100000  'Kesmeler aktif ve TMR0 kesmesi aktif

'----------------------------------------------------------------------------
R var byte
RH VAR BYTE  
RL VAR BYTE
I VAR BYTE
W var bit
symboL TUS=GPIO.0
symbol CIK=GPIO.2
    
'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı

TMR0=243
R=2
RH=r:RL=100-rH
PAUSE 300  'bu gecikme mutlaka koyulmalıdır açılış gecikmesidir. Gerekli olan bir komutdur.
'-----------------------------------------------------------------------------
OFK:

      low CIK
      PAUSE 500
      IF TUS=0 THEN BASLA
      LOW CIK
      GOTO OFK
OF:
    IF TUS=0 THEN OFK
      GOTO OF 
      
DEVAM:
      IF TUS=0 THEN AS
      GOTO DEVAM 

BASLA:
      IF TUS=1 THEN DEVAM 
      IF R=99 THEN BASLA
      IF TUS=0 THEN
      R=R+1
      IF R=100 THEN R=99        
      GOSUB DELAY        
      ENDIF
      GOTO BASLA
AS:
  
      IF TUS=1 THEN OF
      IF R=1 THEN AS        
      IF TUS=0 THEN
      R=R-1:IF R=0 THEN R=1
      GOSUB DELAY
      ENDIF          
GOTO AS

DELAY:    
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
          FOR I=0 TO 255:NEXT
                
      RETURN

DISABLE
KESME:

      IF CIK=1 THEN
        RH=RH-1
        IF RH=0 then
          CIK=1-CIK
          RH=R
        ENDIF
        ELSE
        RL=RL-1
        IF RL=0 THEN
          CIK=1-CIK 
          RL=100-Rh
        ENDIF
      ENDIF
        
      TMR0=243
      INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
      RESUME
      ENABLE
    
END

ETE bey bu program ile ilgili bir sorunum daha var.Program basında çıkışı sıfırlamama rağmen ofk durumunda çıkış belirli zamanlarda kendiliğinden aktif oluyor. Bununu nedeni nedir. Yardımcı olursanız memnun olurum.

ete

#13
Hala kod tag kullanmayı öğrenemedin. Ne demeiştim. Bütün kod'u iki Code yazısı arasına yada iki köşeli parantezin arasına alacaksın. Sen yanlızca PWM yazısını bu şekilde araya almışsın asıl kod dışarı çıkmış. Ben yeniden düzelttim umarım bir sonrakini doğru yaparsın.

Programda tuş'a basılmadıkça program bir yere gidemez. Kendi kandine oluşuyor ise besleme devrende parazit vardır. Butonun kaşırıyordur. Tavsiyem buton (Tuş) pinlerine 100nf bağla. Pic besleme bacaklarınada ("1" ve "8") 100nf Kondansatör bağla.
Ete

bk

Bilgilendirdiğiniz için teşekkürler. Dediklerinizi uyguladım. Board üzerinde tekrar denedim fakat yinede yinede çıkış kaçırıyor.Proteus da osilaskop ta yine öyle bir geçişler görülüyor.code arasına kod yazılacak derken program kodundan mı bahsediyorsunuz. Yoksa herhangi bir koddan mı Onu anlayamadım. Kusura bakmayın. Şimdiden teşekkürler.

Powered by EzPortal