Error[113]c:\pbp\pbppi14e.lib 2089 :symbol not previously defined(CCPTMRS0)

Başlatan zeus48, 25 Şubat 2023, 21:13:45

zeus48

Arkadaşlar mrb. İşlemci  16F1829  Derlerken hata veriyor hata şu
Error[113]c:\pbp\pbppi14e.lib 2089 :symbol not previously defined(CCPTMRS0)
Fakat HPWM ile ilgili satırı kaldırınca hata vermiyor derliyor ve HPWM haricindeki işlerini yapıyor.
Çözemedim. İyi çalışmalar  HPWM  1,3,4 kullanıyorum



'**********************  Tanımlama Blokları ******************
DEFINE PIC16F1829
asm
 __config _CONFIG1, _FOSC_INTOSC & _WDTE_ON & _PWRTE_ON & _MCLRE_OFF & _CP_ON &_CPD_ON& _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF 
 __config _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF
endasm
DEFINE OSC 16
OSCCON = %01111000  ;16 mhz ayarlandı
OSCTUNE=0
TRISA =%00011000
TRISB =%11110000
TRISC =%00000000
PORTA =0
PORTB =0
PORTC =0
ANSELA=%00000000       
ANSELB=%00000000       
ADCON1=%11010000
OPTION_REG=7        ;pull-up  hepsi açık
WPUA=%00000000      ;porta pull-up lar kapalı
        APFCON0=%10111110



onurinci

tam olarak emin olmamakla birlikte, sanki PWM Portun ne ise atıyorum RB3 olsun sigortalardan tanımlamak gerekebiliyor.bu gıcıklığı sadece HPWM durumunda yapıyor..

ete

Birinci kusur olarak en baştaki define satırını kapat. İşlemci tanımlaması bu şekilde yapma.
Kapatılacak satır, Define 16F1829

İkinci olarak hata mesajına bakınca CCPTMRS0 registerinin daha önce tanımlanmadığını söylüyor. Verdiğin kod parçasında bu register yer almıyor. Bu gibi durumlarda hata veren kodu olduğu gibi buraya koymak gerekir. Çünki ya bu kısmı çıkardın yada farklı işlemci üzerinden derleme yapıyorsun. Zira derleyici derleme yaparken bu registere rastlıyor bir yerlerde ve bu işlemcide bu registerin olmadığını söyleyip hata veriyor.

Bu işlemcide Birden fazla PWM çıkışı bulunuyor. Bu nedenle farkli timerlar bunları sürebiliyor
Hangi PWM çıkışını hangi Timer sürecek bunu CCPTMRS registeri belirliyor.Anlayacağın bu işlemcide CCPTMRS komutu var (ama CCPTMRS0 yok) hata kodunda ise CCPTMR0 diye bir ifade var ve sanki TMR0 ın CCP seçeneği gibi gözüküyorki böyle bir Register yok işlemcide.
Yapılacak iş aşağıdaki register ayarının programa dahil edilmesi olmalı.
CCPTMRS=%00000000
Bu komut bütün PWM çıkışları için Timer-2 yi kullandıracaktır.
Bu şekilde bir dene bakalım.

Hata mesajının neden HPWM komutu kullanılınca çıktığını ise normal şartlarda programda PWM komutu yer almıyor bu nedenle buna ait register ayarlarına gerek olmuyor. Ama komutu koyunca çıkışların hangi timerdan besleneceğinide belirtmek gerektiğinden bu komutu arıyordur.

Unutma bir derleme hatasından bahsederken programı hata veren şekli ile buraya koyman gerekir.
Koyduğun kod ilk satır hariç hatasız derlenebiliyor çünki.

Ete

not : internette biraz araştırma yapınca bunun bir derleme hatası olduğunu anladım. Aslında hatanın kaynağı pbppi14e.lib dosyasında yer alıyor. Dediklerine bakılırsa bu hata PBP versiyon 3 den sonra düzeltilmiş.
Sen muhtemelen versiyon 2.60 kullanıyorsun. Çözüm önerisi olarak HPWM komutu yerine registerleri kullanarak  sinyal elde edin diyorlar. Bunun nasıl olacağını yazayım:
Oncelikle PWM frekansına karşılık gelen PR2 değerini bulmanız gerekiyor. Bunu Pic Multicalc.exe isimli ufak programla yapıyoruz. Sende yok ise buraya çalışma frekansını ve hangi çıkışları kullanacağını tekrar yaz ben sana register ayarlarını vereyim.
Yinede 1Khz lik bir sinyal çıkışı için ayarları buraya yazayım.(16Mhz OSC frekansı içindir)
PR2=249
T2CON=%00000110 (Bölme oranı 1/16 oluyor ve en sağdaki iki bit bunu ayarlıyor)
CCPTMRS=%00000000
Bu satırlar programın baş taraflarına yazılacak.
Sinyallari açma yani etkinleştirmek için sırası ile (kanal olarak 1-3-4 kullandığın için )
CCP1CON=%00001100
CCP3CON=%00001100
CCP4CON=%00001100
bun satırlarıda diğerlerinin altına yazabilirsin.

Şimdi istenilen Duty değerine bağlı olarak gereken sinyali çıkartalım. Bu sinyaller 10 bitlik Duty çözünürlüğüne sahip olacaktır. Maksimum duty değerin 1000 oluyor. Bu %100 Duty değerine karşılık gelir. Örneğin %50 duty değerini vermek için
DUTY_VER:(x olan yere kanal numarası gelecekir 1-3-4 gibi.) 3 kanal için 3 adet alt program olması en doğrusudur.Her bir kanal için ayrı yani. X ve DUTY değişkenleri 16 bitlik olmalıdır.
        IF CCPxCON=0 THEN CCPxCON=%00001100
        X=DUTY
        CCPxCON.4=X.0
        CCPxCON.5=X.1
        CCPRxL=(X>>2)
        RETURN

%100 duty değeri 1000 ise basit bir orantı ile %20 için (20x1000)/100= 200 olacağını kolaylıkla hesap edebilirsiniz DUTY=200 verip GOSUB PWM_VER_1 (1 nolu kanal için) yaparsanız sinyaliniz çıkışta belirecektir.

Küçük harf x kanal numarasını Büyük X harfi ise değişken ismini belirliyor hata yapılmasın.
1 nolu kanal için CCP1CON , 3 nolu kanal için CCP3CON ve 4 nolu kanal için CCP4CON registerleri kullanılacaktır.

zeus48

Ete hocam cevabınız için tşk. Aşağıda koyduğum kod 16f1827 de  sorunsuz denetleniyor.  1827 de sorun yaşamıştım
siz yardım etmiştiniz. 16f1827 pin sayısı yetersiz kaldı 16F1829 şeçmemin sebebi 20 pinli olması.

Sizin söylediklerinizi yaptım  ;;;DEFINE PIC16F1827 etkisiz  CCPTMRS=%00000000 ilave ettim sorun aynı
Error[113]c:\pbp\pbppi14e.lib 2089 :symbol not previously defined(CCPTMRS0)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;DEFINE PIC16F1827     ETE hoca sildirdi
asm
 __config _CONFIG1, _FOSC_INTOSC & _WDTE_ON & _PWRTE_ON & _MCLRE_OFF & _CP_ON & _CPD_ON& _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF 
 __config _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF
endasm
 
DEFINE OSC 16
OSCCON = %01111000  ;16 mhz ayarlandı
OSCTUNE=0
TRISA =%00011000
TRISB =%11110000
TRISC =%00000000
PORTA =0
PORTB =0
PORTC =0
ANSELA=%00000000       
ANSELB=%00000000       
ADCON1=%11010000
OPTION_REG=7        ;pull-up  hepsi açık
WPUA=%00000000      ;porta pull-up lar kapalı
    APFCON0=%10111110   ;Pwm hangi portlarda aktif
    CCPTMRS=%00000000   ; ETE  hoca koydurdu
;;;;;;;;;;;;;;;;;;;;;LCD TANIMLAMALARI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DEFINE LCD_DREG    PORTC
DEFINE LCD_DBIT    0     
DEFINE LCD_EREG    PORTA 
DEFINE LCD_EBIT    1     
DEFINE LCD_RSREG   PORTA
DEFINE LCD_RSBIT   0 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SEMBOLLER;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SYMBOL  TAM   =PORTC.4    'TAMBUR ÇIKIŞI
SYMBOL  VLFA  =PORTC.7   'AVALF ÇIKIŞI
SYMBOL  VLFB  =PORTA.5   'BVALF ÇIKIŞI
SYMBOL  IRGA  =PORTA.3   'A IR LED GİRİŞİ
SYMBOL  IRGB  =PORTA.4   'A IR LED GİRİŞİ
SYMBOL  MENU =PORTB.4  ;MENÜ BUTON GİRİŞİ
SYMBOL  GERI =PORTB.6  ;GERİ BUTON GİRİŞİ
SYMBOL  OK   =PORTB.7  ;OK BUTON GİRİŞİ
SYMBOL  ILER =PORTB.5  ;İLERİ BUTON GİRİŞ
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DEĞİŞKENLER;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LAMA VAR BYTE     ;Portc5 PWM1  1.lamba değişkeni
LAMB VAR BYTE     ;Portc6 PWM4  2.lamba değişkeni
H VAR BYTE        ;Porta2 PWM3 hava değişken
H=0
 PAUSE 100
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 GOSUB OKU
 PAUSE 5
 GOSUB BAK
 PAUSE 5
 VLFA=1:VLFB=1 ;VALFLER KAPALI
 
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 BASLA:
 LCDOUT $FE,1
 LCDOUT $FE,$80,"HAVA=",DEC3 H
 LCDOUT $FE,$C0,"A=",DEC3 LAMA," B=",DEC3 LAMB
 GOSUB OKU
 GOSUB BAK
 PAUSE 3000
 TAM=1
;;;;;;;;;;;;;;;;;;;;;;;;;;
BDEV:
IF MENU=0 THEN TAM=0:LCDOUT $FE,1:LCDOUT $FE,$80,"BASILI":LCDOUT $FE,$C0,"BEKLE":PAUSE 3000:GOTO MENUS
IF IRGA=0 THEN VLFA=0
IF IRGA=1 THEN VLFA=1
IF IRGB=0 THEN VLFB=0
IF IRGB=1 THEN VLFB=1
GOTO BDEV
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 MENUS:
 IF MENU=1 THEN LCDOUT $FE,1:GOTO BASLA
 LCDOUT $FE,1
 
 MDEV:
 IF MENU=0 THEN LCDOUT $FE,$80,"HASSASiYET  A >>":GOTO MDEV
 
LA:
LCDOUT $FE,$80,"HASSASiYET  A >>"
LCDOUT $FE,$C0,"OK BAS AYARLA"
IF ILER=0 THEN goto LA
LAD:
PAUSE 200
IF OK=0 THEN LCDOUT $FE,1:GOTO LAMBA
IF ILER=0 THEN LCDOUT $FE,1:LCDOUT $FE,$80,"HASSASiYET  B >>":PAUSE 1000:GOTO LB
GOTO LAD
LB:
LCDOUT $FE,$80,"HASSASiYET  B >>"
LCDOUT $FE,$C0,"OK BAS AYARLA"
IF ILER=0 THEN goto LB
LBD:
PAUSE 200
IF OK=0 THEN LCDOUT $FE,1:GOTO LAMBB
IF ILER=0 THEN LCDOUT $FE,1:LCDOUT $FE,$80,"HAVA AYAR >>>":PAUSE 1000:GOTO HAYAR
GOTO LBD
HAYAR:
LCDOUT $FE,$80,"HAVA AYAR >>>"
LCDOUT $FE,$C0,"OK BAS AYARLA"
IF ILER=0 THEN goto HAYAR
HAD:
IF ILER=0 THEN goto HAYAR
PAUSE 200
IF OK=0 THEN LCDOUT $FE,1:GOTO HAVA
IF ILER=0 THEN GOTO LA
GOTO HAD
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 LAMBA:
 READ 1,LAMa
 LCDOUT $FE,$80,"<<HASSASiYET A >"
 LCDOUT $FE,$C0,DEC3 LAMA,"     "
 IF OK=0 THEN GOTO LAMBA
 
 LAMDA:
 IF ILER=0 THEN LAMA=LAMA+1  ;ARTIR
 IF GERI=0 THEN LAMA=LAMA-1   ;AZALT
 
 IF LAMA=255 THEN LAMA=0
 IF LAMA >200 THEN LAMA=200
 
 LCDOUT $FE,$80,"<<HASSASiYET A >"
 LCDOUT $FE,$C0,DEC3 LAMA,"     "
 PAUSE 200                                                                             
 
 IF OK=0 THEN WRITE 1,LAMA:PAUSE 50:LCDOUT $FE,1:GOTO KAYIT ;KAYIT
 
 GOSUB BAK  ;PWM AYARLAMAYA GİTTİ
 GOTO LAMDA
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 LAMBB:
 READ 2,LAMB
 LCDOUT $FE,$80,"<<HASSASiYET B >>"
 LCDOUT $FE,$C0,DEC3 LAMB,"     "
 IF OK=0 THEN GOTO LAMBB
 LAMDB:
 IF ILER=0 THEN LAMB=LAMB+1  ;ARTIR
 IF GERI=0 THEN LAMB=LAMB-1   ;AZALT
 
 IF LAMB=255 THEN LAMB=0
 IF LAMB >170 THEN LAMB=170
 
 LCDOUT $FE,$80,"<<HASSASiYET B >>"
 LCDOUT $FE,$C0,DEC3 LAMB,"     "
 PAUSE 200                                                                             
 
 IF OK=0 THEN WRITE 2,LAMB:PAUSE 50:LCDOUT $FE,1:GOTO KAYIT ;KAYIT
 
 GOSUB BAK  ;PWM AYARLAMAYA GİTTİ
 GOTO LAMDB
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 HAVA:
 READ 3,H
 LCDOUT $FE,$80,"<<HAVA>>"
 LCDOUT $FE,$C0,DEC3 H,"     "
 IF OK=0 THEN GOTO HAVA
 HAVD:
 IF ILER=0 THEN H=H+5  ;ARTIR
 IF GERI=0 THEN H=H-5   ;AZALT
 
 IF H <5 THEN H=5
 IF H >250 THEN H=250
 
 LCDOUT $FE,$80,"<<HAVA>>"
 LCDOUT $FE,$C0,DEC3 H,"     "
 PAUSE 200
 
 GOSUB BAK  ;PWM AYARLAMAYA GİTTİ
 
 IF OK=0 THEN WRITE 3,H:PAUSE 50:LCDOUT $FE,1:GOTO KAYIT ;KAYIT
 
 GOTO HAVD
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 KAYIT:
 LCDOUT $FE,$80,"KAYDEDiLDi"
 PAUSE 2000
 LCDOUT $FE,1
 GOTO BASLA
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 OKU:
 READ 1,LAMA:PAUSE 5
 READ 2,LAMB:PAUSE 5
 READ 3,H:PAUSE 5
 RETURN
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 BAK:
 CCP3CON = %00001100      ; HAVA ÇALIŞTI
 hpwm 3,H,255
 PAUSE 50
 CCP1CON = %00001100      ; LAMBA-A ÇALIŞTI
 HPWM 1,LAMA,255
 PAUSE 50
 
 CCP4CON = %00001100      ; LAMBA-B ÇALIŞTI
 HPWM 4,LAMB,255
 PAUSE 50
 RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END
 
 

zeus48

Ete hocam mrb.  Sorunu cözdüm işlemci derleniyor ve çalışıyor. Fakat yaptığım yol doğrumudur sonradan  ne getirir
bilmiyorum.Nasıl yaptığımı yazıyorum.

Öncelikle bu yanlış: APFCON0=%00111110   ;Pwm2 hangi portlarda aktif
                     APFCON1=%00111110   ;Pwm2 hangi portlarda aktif  pwm2 kullanmadığım için kaldırdım varsayılanda kaldı
Bunu değiştirmem sorunumu çözmedi uyarı mesajındaki  pbp nin içindeki c:\pbp\pbppi14e.lib 2089
pbppi14e dosyasını açtım 2089. satıra gelip  CCPTMRS0 nun 0 rını sildim tabiki alt satırlardakini de sıfırlarını
 sildim derledi ve çalıştı. Doğrumu yaptım bilmiyorum.  (C) dilinde yazılan şeylerdi
 

ete

Yaptıklarında doğru sayılır. O dosyada genelleme yapılıp bütün o seridek işlemcilerde CCPTIMRS0 var diye ona aid kod yazmışlar. Halbuki bazılarında sıfırsız register bulunuyor.

Ete

Powered by EzPortal