hpwm komutu için yardım

Başlatan huseyin0579, 05 Temmuz 2016, 22:10:29

huseyin0579

Hocam hayırlı bayramlar, hpwm ile yapılmış uygulamadan faydalanıp kendi programım için eklenti yapmak istedim. İstediğim tek şey programda intcon tanımlamaları ve diğerleri için hatalı bir durum varmı. Ayrıca hocam orjinal kod yani benim uğraştığım kod için portb0 pinine bağlı olan kesme ile kapanma özelliği var diğer programdan aldığım kod eklentisi ile kendi programımı derledim. Simülasyonda hpwm için yaptığım eklenti kesme alt programına girdiğinde kilitlenme oluyor. Hocam tanımlamalarda anladığım kadarı ile portb.0 kesmesi ile sonradan yaptığım ilave kod tanımlamarı hatalı çözemedim yardımcı olabilir'misiniz.
Benim hazırladığım kod;

'****************************************************************
'*  Name    : PROG1.PBP                                         *
'*  Author  : [  E.T.E  ]                                       *
'*  Notice  : Copyright (c) 2016 [Şubat - 2016]                 *
'*          : All Rights Reserved                               *
'*  Date    : 1.02.2016                                         *
'*  Version : 04                                                *
'****************************************************************
@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_OFF
@ DEVICE pic16f877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, HS_OSC
@ DEVICE pic16F877A, BOD_ON
@ DEVICE pic16F877A, CPD_ON
@ DEVICE pic16F877A, PROTECT_ON
@ DEVICE pic16F877A, LVP_OFF
DEFINE OSC 20
DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 2     ' ADC clock source  (Fosc/32)
DEFINE ADC_SAMPLEUS 20 ' ADC sampling time (uSec)

'------------------------------------------------------------------------------
DEFINE LCD_DREG PORTB      'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4          'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG PORTB      'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 3          'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG PORTB     'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 2         'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_BITS 4          'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2         'LCD Kaç sıra yazabiliyor
DEFINE LCD_COMMANDUS 2000  'Command delay time in us
DEFINE LCD_DATAUS 50       'Data delay time in us
DEFINE CCP1_REG PORTC
DEFINE CCP1_BIT 2
'------------------------------------------------------------------------------

CMCON=7
ADCON1 = %10000100  'AN0-AN1 analog AN3 Analog diğerleri digital
OPTION_REG=%11000010  'B0 pini yükselen kenarda kesme oluşturacak

TRISA=%00001011
TRISB=%00000001
TRISC=%00010000
TRISD=%10000001
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

FREKANS VAR WORD
HAM_DUTY VAR WORD
DUTY  VAR BYTE
HAM   VAR WORD
AKU   VAR WORD
W     VAR WORD
Y     VAR WORD

DOLU  VAR BYTE 
BOS   VAR BYTE 
YAZ   VAR BYTE
BAR   VAR BYTE

SAYAC VAR BYTE
K     VAR BYTE
Z     VAR BIT
FLASH VAR BIT



KAPAT=1
PORTA.5=1
LCDOUT $FE,1

pause 300
SH=1:KES=0

INTCON=%10110001
ON INTERRUPT GoTo KESME

TMR0=0
TMR2=0
T2CON=%00000110
PR2=124
kapat=1:INTCON.1=0
PORTA.5=1

gosub FREKANS_HESAP
GOSUB DUTY_YAZ
GOSUB PWM_ON
'------------------------BASLANGIÇ----------------------------------------------
BASLA:
     
      T1CON=%00110001:KES=0
BASLA_BIR:
         
          TMR1H=$0B:TMR1L=$DC:PIR1.0=0   '
         
          WHILE PIR1.0=0                 
                   
             GOSUB FREKANS_HESAP
             GOSUB DUTY_KONTROL
             GOSUB FREKANS_KONTROL
                                                                                                                                                                                     
          WEND
                                                             
          GOTO BASLA   
                 
DELAY:
      FOR W=0 TO 1500
        PAUSEUS 5     
        PAUSEUS 5
      NEXT
      RETURN       
'FREKANS_KONTROL:

DUTY_KONTROL:
       IF BUT1.6=1 THEN
       SAYAC=0
       DUTY=DUTY+1
       IF DUTY=101 THEN DUTY=100
       GOSUB DUTY_YAZ
       WHILE BUT1.6=1
       K=1
       IF SAYAC=>50 THEN
       K=0:SAYAC=50
       DUTY=DUTY+1:GOSUB DELAY1
       IF DUTY=101 THEN DUTY=100
       ENDIF     
       GOSUB DUTY_YAZ
       WEND   
       K=0:SAYAC=0
       ELSE
       K=0:SAYAC=0
       ENDIF 
       IF BUT1.7=1 THEN
       SAYAC=0
       DUTY=DUTY-1
       IF DUTY=255 THEN DUTY=0
       GOSUB DUTY_YAZ
       WHILE BUT1.7=1
       K=1
       IF SAYAC=>30 THEN
       K=0:SAYAC=30
       DUTY=DUTY-1:GOSUB DELAY1
       IF DUTY=255 THEN DUTY=0
       ENDIF
       GOSUB DUTY_YAZ
       WEND
       K=0
       ELSE
       K=0:SAYAC=0
       ENDIF
       RETURN


FREKANS_HESAP:
FREKANS=62500/(PR2+1)
RETURN

DUTY_YAZ:
HAM_DUTY=(PR2+1)*DUTY/25
CCP1CON.4=ham_DUTY.0
CCP1CON.5=HAM_DUTY.1
CCPR1L=HAM_DUTY>>2
return
       
PWM_ON:
CCP1CON.2=1
CCP1CON.3=1
RETURN


DELAY1:
   FOR Y=0 TO 255:NEXT
   RETURN


DISABLE   
KESME:
       kapat=0
       PORTA.5=0
       INTCON.1=0  'RB0/INT Bayrağı (flag) silindi.     
       INTCON.2=0
       IF K=1 THEN
       SAYAC=SAYAC+1
       IF SAYAC=101 THEN SAYAC=0
       ENDIF       
       Resume      'Aslında KAPAT pini LOW olunca sistem enerjisi kesilecek ve kapanacak
   Enable      'kesmeler yeniden aktif.
End


Hpwm için alıntı yaptığım kod;

'****************************************************************
'*  Name    : HPWM.BAS                                      *
'*  Author  : [Ferhat YOL]                                      *
'*  Notice  : Copyright (c) 2011 [Mucit23]                      *
'*          : All Rights Reserved                               *
'*  Date    : 03.04.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE OSC 4
@ DEVICE pic16F876
@ DEVICE pic16F876, WDT_OFF
@ DEVICE pic16F876, PWRT_On
@ DEVICE pic16F876, PROTECT_OFF

TRISA=%11111111
TRISB=%00000000
TRISC=%00000000
PORTA=0
PORTB=0
PORTC=0

DEFINE LCD_DREG   PORTB
DEFINE LCD_DBIT   4
DEFINE LCD_RSREG  PORTB
DEFINE LCD_RSBIT  2
DEFINE LCD_EREG   PORTB
DEFINE LCD_EBIT   3
DEFINE LCD_BITS   4
DEFINE LCD_LINES  2

DEFINE CCP1_REG   PORTC
DEFINE CCP1_BIT   2

ON INTERRUPT GoTo KESME
ADCON1 = 7
OPTION_REG=%10000010   
INTCON=%10100001 
TMR0=0
T2CON = %00000110
PR2=124

SYMBOL YUKARI=PORTA.0
SYMBOL  ASAGI=PORTA.1
SYMBOL ARTTIR=PORTA.2
SYMBOL  AZALT=PORTA.3
SYMBOL    JOG=PORTA.4
SYMBOL    DUR=PORTA.5

ROLE  VAR PORTC.3
LED1  VAR PORTC.1
LED2  VAR PORTC.0

MODS     VAR BIT
YON      VAR BIT
U        VAR BYTE
W        VAR BYTE
ADR      VAR BYTE
SAYIH    VAR BYTE
SAYIL    VAR BYTE
SON      VAR BYTE
SYC      VAR BYTE
SNY      VAR BYTE
SAYAC    VAR BYTE
DUTY     VAR BYTE
I        VAR WORD
PERYOT   VAR WORD
HAM_DUTY VAR WORD
FREKANS  VAR WORD

PAUSE 200
LCDOUT $FE,1
GIRIS:
LCDOUT $FE,$83,"PWM MOTOR"
LCDOUT $FE,$C4,"KONTROL"
PAUSE 1500
LCDOUT $FE,1

DUTY=0:LED1=0:LED2=1

GOSUB FREKANS_HESAP
GOSUB EKRAN
GOSUB DUTY_YAZ
GOSUB PWM_ON

BASLA:
IF DUTY>0 THEN
IF JOG=0 AND YON=0 THEN
  YON=1
  SON=DUTY
  GOTO SAG
ENDIF

IF JOG=0 AND YON=1 THEN
YON=0
SON=DUTY
GOTO SOL
ENDIF
ENDIF

IF DUR=0 and duty>0 THEN
GOTO DURDUR
ENDIF

GOSUB FREKANS_HESAP
GOSUB DUTY_KONTROL
GOSUB FREKANS_KONTROL

GOTO BASLA

FREKANS_KONTROL:

IF ARTTIR=0 THEN
WHILE ARTTIR=0:WEND
PR2=PR2-1
gosub DUTY_YAZ
IF PR2<5 THEN PR2=5
ENDIF

IF AZALT=0 THEN
WHILE AZALT=0:WEND
PR2=PR2+1
gosub DUTY_YAZ
IF PR2>124 THEN PR2=124
ENDIF
GOSUB EKRAN
RETURN

DUTY_KONTROL:
IF YUKARI=0 THEN
sayac=0
DUTY=DUTY+1
IF DUTY=101 THEN DUTY=100
gosub DUTY_YAZ:GOSUB EKRAN
WHILE YUKARI=0
W=1
IF SAYAC=>50 THEN
   W=0:SAYAC=50
   DUTY=DUTY+1:GOSUB DELAY
   IF DUTY=101 THEN DUTY=100
ENDIF
GOSUB DUTY_YAZ
GOSUB EKRAN
WEND
W=0:SAYAC=0
ELSE
W=0:SAYAC=0
ENDIF

IF ASAGI=0 THEN
sayac=0
DUTY=DUTY-1
IF DUTY=255 THEN DUTY=0
GOSUB DUTY_YAZ
GOSUB EKRAN
WHILE ASAGI=0
W=1
IF SAYAC=>30 THEN
   W=0:SAYAC=30
   DUTY=DUTY-1:GOSUB DELAY
   IF DUTY=255 THEN DUTY=0
ENDIF
GOSUB DUTY_YAZ
GOSUB EKRAN
WEND
W=0
ELSE
W=0:SAYAC=0
ENDIF
 
RETURN

SAG:
DUTY=DUTY-1:GOSUB DELAY
IF DUTY>100 THEN
ROLE=1:LED1=1:LED2=0
GOTO DUTY_ARTTIR
ENDIF
GOSUB DUTY_YAZ:GOSUB EKRAN
GOTO SAG

DUTY_ARTTIR:
DUTY=DUTY+1:GOSUB DELAY
GOSUB DUTY_YAZ:GOSUB EKRAN
IF DUTY=SON THEN
GOTO BASLA
ENDIF
GOTO DUTY_ARTTIR

DURDUR:
DUTY=DUTY-1:GOSUB DELAY
GOSUB DUTY_YAZ:GOSUB EKRAN
IF DUTY=0 THEN
GOTO BASLA
ENDIF
GOTO DURDUR

SOL:
DUTY=DUTY-1:GOSUB DELAY
IF DUTY>100 THEN
ROLE=0:LED1=0:LED2=1
GOTO DUTY_ARTTIR
ENDIF
GOSUB DUTY_YAZ:GOSUB EKRAN
GOTO SOL


DELAY: 'gecıkme
  FOR I=0 TO 255:NEXT
RETURN
DELAY1:
  FOR I=0 TO 150:NEXT
RETURN

FREKANS_HESAP:
FREKANS=62500/(PR2+1)
RETURN

DUTY_YAZ:
HAM_DUTY=(PR2+1)*DUTY/25
CCP1CON.4=ham_DUTY.0
CCP1CON.5=HAM_DUTY.1
CCPR1L=HAM_DUTY>>2
return

PWM_ON:
CCP1CON.2=1
CCP1CON.3=1
RETURN

PWM_OFF:
CCP1CON.2=0
CCP1CON.3=0
RETURN

EKRAN:
LCDOUT $FE,$80,"Duty %",#DUTY
IF DUTY<100 THEN
GOSUB HANE_AL1
LCDOUT $FE,ADR,$20
ENDIF
lcdout $fe,$C0,"FREKANS=",#FREKANS
GOSUB HANE_AL2
RETURN

HANE_AL1:
IF DUTY<100 OR DUTY>9 THEN ADR=$88
IF DUTY<10 THEN ADR=$87
RETURN
HANE_AL2:
IF FREKANS>10000 THEN LCDOUT $FE,$CD,"Hz"
IF FREKANS<10000 AND FREKANS>999 THEN LCDOUT $FE,$CC,"Hz "
IF FREKANS<1000 THEN LCDOUT $FE,$CB,"Hz "
RETURN

DISABLE
KESME:
IF W=1 THEN
      SAYAC=SAYAC+1
      IF SAYAC=101 THEN SAYAC=0    
ENDIF
INTCON.2=0   
RESUME
ENABLE

END
           

huseyin0579

Hocam ikinci mesaj ile eklediğim orjinal hpwm kodlarını sadece frekans ve duty ayar butonları ile çalışacak şekilde sadeleştirme yapıp kendi program kodlarıma eklemek istedim.

ete

Kusura bakmayın. Öyle birinden al diğerine ekle doğrumu aldın yanlışmı aldın bilemeden bunu yap sonrada bir bakın hata varmı diyerek başkalarına bu işi yaptırılmasından hiç hoşlanmıyorum. Bir işi adam gibi öğrenecekseniz oturup ders notlarına çalışın. Öğrenen nasıl öğreniyor bir bakın. Sistemli yapılırsa öğreni,rsiniz ama bu şekilde hiç bir yere varamazsınız. Kullanmadığım komutları önüme koyup şöyle olurmu demek bana eziyet oluyor. Doğru dürüst kod yazın bakayım.
Yazdıklarına bir bak. Hem TMR0 kesmesi var hem PORTB.0 kesmesi var. B0 kesmesini anladım Tmr0 kesmesi ne işe yarıyor belli değil çünki akıntıya kapılıp diğer kodlarla birlikte gelmiş oraya yerleşmiş gibi duruyor. Yapılacak iş çok belli, değil.
Yine aynı macera biz soracağız sen cevaplayacaksın, sora sora ne istediğin ancak 5-10 mesaj sonra ortaya çıkacak. Bun buna yokum.
Ne istiyorsan o konuya eğilip çalışacak öğrenecek ve ona bakarak kendi kodlarını yazacaksın. Kopyala yapıştırla bir yere varamazsın. Yanlış yazabilirsin düzeltiriz ama bu şekilde bi,r yaklaşım kabul etmiyorum maalesef.
Bak hala ne yapmaya çalıştığını bilmiyorum. Çünki ne yapmak istediğini anlatacağına kodlara bir bak yanlışım varmı diyorsun. Ne yapmak istediğini bilmeden yanlışını nasıl tespit ederimki zaten.
Bu şekildeki kodalarada ben bakmıyorum artık bakan varsa baksın.

Ete

huseyin0579

Hocam mantıklı olması için enson yaptığımız proje koduna bu özellik ilave edilebilirmi? Yani frekansı ve duty oranı  ayarlanabilir hpwm çıkış özelliği eklenebilir mi? İkinci mesaj daki program kodunu için sadeleştirme işlemini yaptım ve 4 buton ile frekans ve duty ayarını yapabiliyorum. Kendi program koduma bu özelliği ekledim. İsis ile kodu denedigim de hpwm ayarlarını yapacağım butonlara basınca program kilitleniyor ve simülasyon duruyor. Hocam programda kısıtlama yaparak ekledim ve bunu sitedeki birçok arkadaş yapıyor sizden istediğim sadece küçük bir hata varsa bunları öğrenmek çok sıkıntılı olacaksa gerek yok hocam sağolun....

huseyin0579

#4
Hocam yanlış anlamayın bu projeyi beraber yaptık ve geliştirmek istiyorum ve aynı zamanda acemi bir yazılımcı durumuna düşmek istemiyorum. Sizinde içinden çıkamadığınız durumlar mutlaka olur benim istediğim ve yaptığım hatayı da anlamanız zor olmasa gerek konuya hakimsiniz başka birisine de bu konuyu sormam doğruda olmaz yardım etseniz de etmesenizde canınız sağolsun teşekkür ederim. TMR0 kesmesi hpwm için eklediğim orjinal program kodların da vardı. Belki bilinçsiz olarak ekledim kabul ediyorum. Hocam sadece enson yaptığımız programa bu özellik eklenebilirmi olur veya olmaz desenizde yeterli.

huseyin0579

Hocam enson projede intcon kesmesi için %10010000 tanımlaması yapılmış, tüm kesmeler aktif oluyor ve rb0 kesmesi için izin verilmiş, hpwm orjinal kodunda bu ayarlar %10100001 bu şekilde ayarlanmış durumda, benim hazırladığım kod ile yapılması gereken ayar %10110001 bu şekilde doğru oluyormu? Hocam bilgi eksikliğimiz ve acemiliğimiz var ve bu konuda yardımınızı esirgemiyor'sunuz çok teşekkür ediyorum. Ama bende kendimce modifiye etmek istiyorum buradaki amaç program ile ugraştıkça güzel tecrübeler kazanıyorum. Elimde olmayan malzemeler için yeniden düzenleme yapıyorum bu duruma örnek son proje kodunda 74hc595 shift register ile kontrol edilen cd4067 leri temin edemedigim için bu kontrol işlemini cd4051 ile yapabilen programı yazmak istiyorum. Hocam bu işi  yapamaz isem bırakırım ama biryere kadar getirdim.

huseyin0579

tmr0 kesmesi hpwm orjinal kodların da bulunan intcon register içindeki tmr0 sayıcı taşma kesmesine izin veriyor. Hocam aslında bu arkadaş bu tanımlama da hata yapmış intcon register ilk bit aktif durumda rb4 ile rb7 arasındaki değişikliğin yaptığı programlama hiçbir alakası yok sonuç olarak çalışıyormu derseniz evet çalışıyor. Hocam tmr0=0 bu komutun program için kullanılması gerekmiyormu?

huseyin0579

Hocam bu şekilde açmış olduğumuz konular ile umarım diğer arkadaşlara fayda sağlamış oluruz. Bilgi paylaştıkça çoğalır saygılarım'la.....

huseyin0579

#8
Evet hocam buton kontrol pinlerini ayarlayınca bu özellik çalıştı. Şuan frekans değeri için ayar yapmam gerekiyor. Orjinal hpwm uygulamasında 500hz alt sınır değer bunu 100hz yapacam ve üst limit için 300hz olacak aradaki sayım artış değerleri için denemeler yapmalıyım çalıştırdığım kod eklentisi;

'****************************************************************
'*  Name    : POT_DIG_04.PBP                                    *
'*  Author  : [  E.T.E  ]                                       *
'*  Notice  : Copyright (c) 2016 [Şubat - 2016]                 *
'*          : All Rights Reserved                               *
'*  Date    : 1.02.2016                                         *
'*  Version : 04                                                *
'****************************************************************
@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_OFF
@ DEVICE pic16f877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, HS_OSC
@ DEVICE pic16F877A, BOD_ON
@ DEVICE pic16F877A, CPD_ON
@ DEVICE pic16F877A, PROTECT_ON
@ DEVICE pic16F877A, LVP_OFF
DEFINE OSC 20
DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 2     ' ADC clock source  (Fosc/32)
DEFINE ADC_SAMPLEUS 20 ' ADC sampling time (uSec)

'------------------------------------------------------------------------------
DEFINE LCD_DREG PORTB      'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT 4          'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG PORTB      'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 3          'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG PORTB     'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 2         'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_BITS 4          'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2         'LCD Kaç sıra yazabiliyor
DEFINE LCD_COMMANDUS 2000  'Command delay time in us
DEFINE LCD_DATAUS 50       'Data delay time in us
'------------------------------------------------------------------------------
DEFINE CCP1_REG   PORTC    'Hpwm 1 pin port
DEFINE CCP1_BIT     2      'Hpwm 1 pin bit
'DEFINE CCP2_REG   PORTC    'Hpwm 2 pin port
'DEFINE CCP2_BIT     1      'Hpwm 2 pin bit

CMCON=7
ADCON1 = %10000100  'AN0-AN1 analog AN3 Analog diğerleri digital
OPTION_REG=%11000010  'B0 pini yükselen kenarda kesme oluşturacak

TRISA=%00001011
TRISB=%00000001
TRISC=%00010000
TRISD=%11000011
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

FREKANS VAR WORD
HAM_DUTY VAR WORD
DUTY  VAR BYTE
HAM   VAR WORD
AKU   VAR WORD
W     VAR WORD
Y     VAR WORD
KAYD  VAR BYTE
BAR1  VAR BYTE
BAR2  VAR BYTE
YER   VAR BYTE
I     VAR BYTE


DOLU  VAR BYTE 
BOS   VAR BYTE 
YAZ   VAR BYTE
BAR   VAR BYTE
KAY   VAR BYTE
KES   var byte
ADRESS VAR BYTE
SAYAC VAR BYTE
K     VAR BYTE
Z     VAR BIT
FLASH VAR BIT

SYMBOL BUTONC=PORTD.6 
SYMBOL BUTOND=PORTD.1
SYMBOL BUTONA=PORTD.0
SYMBOL BUTONB=PORTD.7
SYMBOL KAPAT=PORTA.2

KAPAT=1
PORTA.5=1
LCDOUT $FE,1

LCDOUT $FE, $40, $10, $10, $10, $10, $10, $10, $10, $10 '  |
LCDOUT $FE, $48, $18, $18, $18, $18, $18, $18, $18, $18 '  ||
LCDOUT $FE, $50, $1C, $1C, $1C, $1C, $1C, $1C, $1C, $1C '  |||
LCDOUT $FE, $58, $1E, $1E, $1E, $1E, $1E, $1E, $1E, $1E '  ||||
LCDOUT $FE, $60, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F '  |||||

pause 300
SH=1:KES=0:duty=0

READ 0,KAY
READ 2,KAYD

INTCON=%10110001
ON INTERRUPT GoTo KESME

TMR0=0
T2CON=%00000110
PR2=124
kapat=1:INTCON.1=0
PORTA.5=1


GOSUB FREKANS_HESAP
GOSUB DUTY_YAZ
GOSUB PWM_ON
'------------------------BASLANGIÇ----------------------------------------------
BASLA:
     
      T1CON=%00110001:KES=0
BASLA_BIR:
         
          TMR1H=$0B:TMR1L=$DC:PIR1.0=0   '
         
          WHILE PIR1.0=0                 
             
             ADCIN 0,HAM
             AKU=(HAM*/401)/10
             IF AKU<105 THEN
               FLASH=1
             ELSE
               FLASH=0
             
             ENDIF
             IF FLASH=0 THEN gosub SATIR1
             
             ADCIN 1,HAM
             BAR1=(HAM*/251)/100
       
             ADCIN 3,HAM
             BAR2=(HAM*/251)/100
             GOSUB SATIR2
             GOSUB SATIR3
       
             GOSUB TUSAL
             GOSUB TUSBAK
           
                                                                                     

             
                                                             
          WEND
         
         
         
          KES=KES+1:IF KES<3 THEN BASLA_BIR  'flash süresini artırmak için 3 yerine 4 veya 5 yaz         
          IF FLASH=1 THEN       
             TOGGLE Z
             IF Z=0 THEN
             LCDOUT $FE,$80," AKU-LOW  "           
             ELSE
             LCDOUT $FE,$80,REP 32\10
             ENDIF
          ENDIF       
             GOSUB FREKANS_HESAP
             GOSUB DUTY_KONTROL
             GOSUB FREKANS_KONTROL
         
         
         
          GOTO BASLA   
         
       

'---------------------------ALT PROGRAMLAR--------------------------------------                     
       
SATIR1:
       
        LCDOUT $FE,$81,"AKU=",dec2 AKU/10,",",dec1 AKU//10,"V"
        RETURN                                             

SATIR2:
       YER=9-bar2
       LCDOUT $FE,$C0,REP " "\YER ,REP "<"\BAR2,"||",REP ">"\BAR1,REP 32\(9-BAR1)
       RETURN
       
SATIR3:
'       LCDOUT $FE,$97,"- ",DEC2 (BAR2*10),REP 32\2,"||  + ",DEC2 (bar1*10),"  "
       LCDOUT $FE,$94,"   - ",DEC2 (BAR2*10),REP 32\2,"||  + ",DEC2 (bar1*10),"  "     
       RETURN

SATIR4:
       LCDOUT $FE,$D4,REP 4\DOLU,BOS,REP 32\(20-DOLU)
       GOSUB DELAY
       RETURN
     
TUSAL:  'Bu alt program ile 74HC165 lere bağlı buton kombinasyonu alınıyor
       SH=0:PAUSEUS 10:SH=1
       SHIFTIN DTA,CLK,0,[BUT1]
       RETURN

DELAY:
      FOR W=0 TO 1500  'potların saydırma gecikmesidir. Süre hızlı ise 5000 rakamı büyütülmelidir.
        PAUSEUS 5      'süre yavaş ise 5000 rakamı azaltılmalıdır. Azaltı artırma 500'er lik dilimler halinde yapılabilir
        PAUSEUS 5
      NEXT
      RETURN         
       
TUSBAK:   'burada da alınmış buton kombinasyonu değerlendiriliyor   
               
       IF BUT1.0=1 THEN
          TOGGLE LED1
          IF LED1=1 THEN
          LCDOUT $FE,$8A,"  LCD ON "
          ELSE
          LCDOUT $FE,$8A,"  LCD OFF "
          ENDIF                       
          WHILE BUT1.0=1
          GOSUB TUSAL
          WEND
          GOSUB BEKLE
          LCDOUT $FE,1
       ENDIF
                   
       
       IF BUT1.2=1 THEN
          LED3=1         
          LCDOUT $FE,$8C," RESET "
          WHILE BUT1.2=1
          GOSUB TUSAL
          WEND         
          LED3=0
          GOSUB BEKLE
          LCDOUT $FE,1
       ENDIF
       
       RETURN

FREKANS_KONTROL:
       IF BUTONA=0 THEN
       WHILE BUTONA=0:WEND
       PR2=PR2+1
       GOSUB DUTY_YAZ
       IF PR2>124 THEN PR2=124
       pause 300
       ENDIF
       IF BUTONB=0 THEN
       WHILE BUTONB=0:WEND
       PR2=PR2-1
       GOSUB DUTY_YAZ
       IF PR2<5 THEN PR2=5   
       pause 300
       ENDIF
       RETURN
     
DUTY_KONTROL:       

       IF BUTONC=0 THEN
       SAYAC=0
       DUTY=DUTY+1
       IF DUTY=101 THEN DUTY=100
       GOSUB DUTY_YAZ
       WHILE BUTONC=0
       K=1
       IF SAYAC=>50 THEN
       K=0:SAYAC=50
       DUTY=DUTY+1:GOSUB DELAY1
       IF DUTY=101 THEN DUTY=100
       ENDIF     
       GOSUB DUTY_YAZ
       WEND
       pause 300       
       K=0:SAYAC=0
       ELSE
       K=0:SAYAC=0
       ENDIF
     
       
       IF BUTOND=0 THEN
       SAYAC=0
       DUTY=DUTY-1
       IF DUTY=255 THEN DUTY=0
       GOSUB DUTY_YAZ
       WHILE BUTOND=0
       K=1
       IF SAYAC=>30 THEN
       K=0:SAYAC=30
       DUTY=DUTY-1:GOSUB DELAY1
       IF DUTY=255 THEN DUTY=0
       ENDIF
       GOSUB DUTY_YAZ
       WEND
       K=0
       ELSE
       K=0:SAYAC=0
       ENDIF
       RETURN


FREKANS_HESAP:
FREKANS=62500/(PR2+1)
RETURN

DUTY_YAZ:
HAM_DUTY=(PR2+1)*DUTY/25
CCP1CON.4=ham_DUTY.0
CCP1CON.5=HAM_DUTY.1
CCPR1L=HAM_DUTY>>2
return

PWM_ON:
       
CCP1CON.2=1
CCP1CON.3=1
RETURN



DELAY1:
   FOR Y=0 TO 255:NEXT
   RETURN

BEKLE:
      FOR W=0 TO 2500 'Tuş titremesini önleyecek olan gecikme miktarıdır böyle kalsın yeterli
         PAUSEUS 5
         PAUSEUS 5
      NEXT
      RETURN

DISABLE   
KESME:
       kapat=0
       PORTA.5=0
       INTCON.1=0  'RB0/INT Bayrağı (flag) silindi.
       IF K=1 THEN
       SAYAC=SAYAC+1
       IF SAYAC=101 THEN SAYAC=0
       ENDIF
       INTCON.2=0                   
       Resume      'Aslında KAPAT pini LOW olunca sistem enerjisi kesilecek ve kapanacak
   Enable      'kesmeler yeniden aktif.
End                                            

huseyin0579

Arkadaşlar iki kanal hpwm uygulamasında çalışan kodları ve simülsyon dosyasını ekliyorum. Hatalarım olabilir program kodunun geliştirilmesi için projeye göstereceğiniz ilgi için teşekkür ederim. Program çalışıyor ve burada yapmak istediğim pulse frekansını 100hz alt sınır değer burası tamam ve üst sınır değerini maksimum 350hz değerinde sınırlandırmak istiyorum, bu konuda yazılım konusunda tecrübeli arkadaşlardan yardım ve önerilerini bekliyorum. Programın hpwm orjinal kodu ikinci mesaj içerisinde mevcut olup bazı alt programları istediğim programa uygun olmadığı için daha doğrusu yeniden düzenlemem gerektiği için almak istemedim.

huseyin0579

#10
Orjinal kod yani hpwm kodu içerisindeki frekans hesap işlemine göre 500hz alt sınır değer ve butona bastıkça oluşan kademe aralığı 4 veya 5 hz aralıklar ile artıp azalıyor. Bu durumda normal diyelim fakat üst sınır olmadığı için sürekli artan yönde sayım oluşuyor ve bu sayım üst sınırını örneğin 1000hz olacak şekilde nasıl ayarlayabiliriz?Bu ayar alt sınır 100hz ve üst sınır 300hz olursa daha güzel olur. Duty ayarı %50 den sonraki artışlarda yön değiştiriyor ve bu durum için orjinal yazılımda yön butonları var. Ben %50 puls duty değeri geçmeyecek şekilde düzenleme yapabilir'sem eklerim. Alıntı yapılan orjinal kodlar ve simülasyon dosyası ekte'dir.

huseyin0579

Arkadaşlar isis ile deneme yaparken kod doğru olmasına rağmen çalışmıyor. Bunun sebebi önceden hazırlanmış açık şema malzemeleri ve pin düzenlemesi program kodununun çalışmamasına sebep olabiliyor. Açık şemada kullanmadığınız malzemeleri silin buna boşta kalan pinlerde dahil, bu tecrübeyi dün yaşadım simülasyon ile ilgili bu teknik durumu bilenler ve teknik olarak açıklayacak olan daha bilgili arkadaşlar olabilir ve bu tür açıklayıcı bilgiler ekleyebilir'ler.

Powered by EzPortal