18f4520 konfig hatası

Başlatan transistor, 02 Şubat 2023, 03:38:50

transistor

18f4520 de ortalama 10 sene önce hatasız derlediğim aynı kodları tekrar mcs yükleyip derlediğimde konfig hataları alıyorum. Sebebi nedir veya nerede hata yapıyorum? 18f452 de hata almıyorum...

.inc klasöründeki konfig satırlarını ; ile kapattım.
kaynak kod dosya yolunu ve klasör isimlerini kısa tuttum.
compile and program options içerisinde use Mpasm kutucuğunu işaretledim. Dosya yolu tamam.

SÜRÜM:


AYARLAR:


.INC klasörü:






ete

Her zaman söylerim işlemciniz için doğru config değerlerini MPASM içindeki P18F4520.INC dosyasından alabilirsiniz diye. Yanlızca config satırlarını derlemeye hazır hale getirmek yetmiyor komutlarıda doğru vermek gerekiyor.
Görünüşe bakılırsa hata mesajları şunlar;
_OSCS_OFF_1H komutunun önceden tanımlanmamış olduğunu söylüyor.
_XT_OSC_1H komutuda önceden tanımlanmamış
_BOR_OFF_2L komutuda aynı durumda
_BORV_20_2L  aynı
_CCP2MX_OFF_3H
_STVR_OFF_4L

görüldüğü gibi hataların tamamı config satırları ile ilgili.
Şimdi öncelikle MCS içinde p18F4520.INC dosyasını MPASM klasörü içinde bulup yükleyelim.
Aşağılara doğru inelim ve sigorta ayarları kısmına gelelim.
Burada OSC komutlarının bir listesini göreceksiniz.
;----- CONFIG1H Options --------------------------------------------------
_OSC_LP_1H           EQU  H'F0'; LP oscillator
_OSC_XT_1H           EQU  H'F1'; XT oscillator
_OSC_HS_1H           EQU  H'F2'; HS oscillator
_OSC_RC_1H           EQU  H'F3'; External RC oscillator, CLKO function on RA6
_OSC_EC_1H           EQU  H'F4'; EC oscillator, CLKO function on RA6
_OSC_ECIO6_1H        EQU  H'F5'; EC oscillator, port function on RA6
_OSC_HSPLL_1H        EQU  H'F6'; HS oscillator, PLL enabled (Clock Frequency = 4 x FOSC1)
_OSC_RCIO6_1H        EQU  H'F7'; External RC oscillator, port function on RA6
_OSC_INTIO67_1H      EQU  H'F8'; Internal oscillator block, port function on RA6 and RA7
_OSC_INTIO7_1H       EQU  H'F9'; Internal oscillator block, CLKO function on RA6, port function on RA7

_FCMEN_OFF_1H        EQU  H'BF'; Fail-Safe Clock Monitor disabled
_FCMEN_ON_1H         EQU  H'FF'; Fail-Safe Clock Monitor enabled

_IESO_OFF_1H         EQU  H'7F'; Oscillator Switchover mode disabled
_IESO_ON_1H          EQU  H'FF'; Oscillator Switchover mode enabled

Bak bakalım bu listede OSCS_OFF diye bir şey varmıdır ? yok elbette. Derlerken MPASM kullanıldığı için verdiğin sigorta ayarları MPASM içindekilerle karşılaştırılıyor ve uymayan varsa sende olduğu gibi hata mesajı veriliyor. Sorun burada.
Yapılacak iş OSC olarak ne kullanacak isen ona uygun komutu bu listeden seçip eskilerinin yerine ilk satıra yerleştirmek.

Benzer şekilde ikinci hataya bakıyorum XT_OSC_1H diye bir şey yok ancak OSC_XT_1H diye bri şey
var. O halde doğru komut bu olacak ve eskisinin yerine bu yazılacak.

Üçüncü hataya bakalım _BOR_OFF_2L hatası için 2L başlığı altındakilere bakıyoruz.
Bu komut _BOREN_OFF_2L ile değiştirilecek çünki listede bu var.

Dördüncü hataya bakalım; _BORV_20_2L hatası, listeye tekrar bakalım . EN uygun komut _BORV_2_2L  olacak bununla değiştirilecek demektir.

Beşinci hata _CCP2MX_OFF_3H  olup listede 3H altındaki listeye bakarsak;
_CCP2MX_PORTBE_3H    EQU  H'FE'; CCP2 input/output is multiplexed with RB3
_CCP2MX_PORTC_3H     EQU  H'FF'; CCP2 input/output is multiplexed with RC1
şeklinde iki satır göreceğiz . Yanlarında açıklaması mevcut birisi RB3 ü çıkış olarak seçiyor diğeri RC1'i çıkış olarak seçiyor. Bunlardan birisini seçeceksin ne yapmak istediğine bağlı olarak. CCP1 yani PWM2 yi kullanmayacak isen rastgele birini seçsende olur.

Son hata _STVR_OFF_4L ile ilgili ve yine listedeki 4L başlığı altındakilere bakıyoruz.Orada doğru komutun _STVREN_OFF_4L  olduğunu göüyoruz ve bununla değiştiriyoruz.
Hepsi bu kadar.
Ben yinede 18F4520 için kullandığım config satırlarını vereyim bu formatı kullanarak seçimlerini yaparsın.
    __CONFIG _CONFIG1H, _OSC_INTIO67_1H  & _FCMEN_OFF_1H &  _IESO_OFF_1H
    __CONFIG _CONFIG2L, _PWRT_ON_2L & _BOREN_OFF_2L 
    __CONFIG _CONFIG2H, _WDT_OFF_2H 
    __CONFIG _CONFIG3H, _CCP2MX_PORTC_3H & _PBADEN_OFF_3H & _LPT1OSC_ON_3H & _MCLRE_OFF_3H 
    __CONFIG _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L   ;XINST_OFF olmalı yoksa işlemci çalışmıyor. 
    __CONFIG _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L
    __CONFIG _CONFIG5H, _CPB_ON_5H & _CPD_ON_5H     
    __CONFIG _CONFIG6L, _WRT0_ON_6L  & _WRT1_ON_6L & _WRT2_ON_6L & _WRT3_ON_6L
    __CONFIG _CONFIG6H, _WRTC_ON_6H  & _WRTB_ON_6H & _WRTD_OFF_6H 
    __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
    __CONFIG _CONFIG7H, _EBTRB_OFF_7H
Bu arada hatırlatayım bu işlemcinin dahili osc si bulunmaktadır ve benim kodlarımda o tercih edilmiştir. Böylece kristal kullanmak zorunda kalmazsın.

Ete



transistor

Değerli bilgileriniz için teşekkürler. Ancak Ete bey hali hazırda kullandığınız konfig bitlerini kullandığımda da aynı hatayı alıyorum. Yani sizin verdiğiniz konfig satırlarınızda kullanım hatası olmasa da hata alıyorum.

ete

Sende olayın espirisini anlamayanlardansın. Bu sorunun açıklamasını daha aönce önemli bilgiler başlığında sigorta ayarları başlığı altında bir mesajla vermiştim. Aramayasın diye aşağıya mesajı koyaladım.

"Sistemi çok iyi anlamadın sanırım.
Derleme esnasında derleyici aşağıdakileri teker teker kontrol ediyor.
1. Program içindeki sigorta ayarlarını
2. PBP klasörü içindeki INC dosyasındaki sigorta ayarlarını
3. MPASM içindeki INC dosyasındaki sigorta ayarlarını. Bu sonuncudakini yanlızca karşılaştırma yapmak için kullanıyor. Yani programda vermiş isen bu üçüncü dosyadakilerle eşleşen varmı diye bakıyor.
Sonuç olarak 1 ve 2 den birinde sigorta ayarı verilmeli ama yalnızca birinde verilmelidir.
3. cü dekilerle karşılaştırıp hangilerinin aktif edileceğine karar veriyor derleyici.

İlk iki noktada aynı sigorta ayarını ikinci defa verirsen owerwriting hatasını veriyor Yani öncekinin üzerine yazıyorum diyor.

MPASM deki INC dosyasına kesinlikle dokunmaman gerekiyor. Kapalı olanları adamlar kapatmış zaten. Sen oynarsan işin temeli bozulmuş olacaktır. Bu başka hataları dolaylı yoldan ortadan kaldırmak gibi bir şey oluyor. Bence yanlış iş yapıyorsun.
Ancak MPASM içindeki P18f4520.INC dosyasına bakıyorum "Configuration Bits" başlığı altındaki satırlar zaten kapalı orada. Sen bir şekilde önce açmışsın sonra kapamışsın sanırım. O satırlar bitlerin adres bilgisini kullanıcılara vermek için koyulmuş ve derlemede kullanılmayan satırlar dolaysıyla zaten kapalı. Her neyse yaptığın iş doğru diyebliriz şu anda. Başka bir şeye dokunma ve yaptığın işe de dikkat et lütfen."

Şimdi bu mesaja ekleyeceğim senin sorununla ilgili olarak bir işlemci için yukarıda bahsi geçen 3 farklı yerde yani ;
1- Program içinde
2. C..../PBP klasörü içindeki (islemci.INC mesela 16F628A.INC gibi) içinde  ,
3. MPASM klasörü içinde yer alan Pxxxx(islemci).INC  dosyası içindeki sigorta ayarlarına bakıyor.
- Senin sisteminde sigorta ayarları program içinde düzgün formatta o işlemciye özel şekilde verilmeli.
- Sigorta ayarların PBP klasöründeki INC klasöründe kapatılmış olması gerekir. Burada kapatılacak olanlar MPASM ye uygun yada ait olanlar bir kaç satır halinde veriliyor genellikle.
- Böylece derleyici program içindekilerle MPASM klasörü içindekileri karşılaştırıp uyumlu olup olmadıklarına formatı uymayan olmadığına emin olup derlemesini yapıyor.
Bu karşılaştırmada en ufak bir uyumsuzluk hata mesajına sebep oluyor.
Bu mantık çerçevesinde şimdi programındaki config satırlarını ile MPASM içindeki pxxx.islemci.INC dosyasındaki config satırlarını karşılaştır yazılış şekillerine bak ve hata varsa programını düzelt diğer dosyalara dokunma.
PBP klasöründeki INC dosyasına iyice bak ve yanlızca CONFIG satırlarının kapatılmış olduğundan emin ol.

Yeniden derleleme yap ve sonuç olumsuz ise ve yine hata alıyor isen hata mesajlarının ekran görüntüsünü al ve buraya koy bakalım.

Ete

transistor

#5
Teşekkür ederim, cevap yazmada biraz geç kalıyorum üzgünüm ancak, konfigürasyon olayını sayenizde çözdüm.

Merak ettiğim bir konu var, TMR0

;------------------------------------------------------------------------
ASM
  __CONFIG    _CONFIG1H, _OSC_XT_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
  __CONFIG    _CONFIG2L, _BOREN_OFF_2L & _BOREN_SBORDIS_2L
  __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_64_2H & _PWRT_OFF_2L
  __CONFIG    _CONFIG3H, _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_ON_3H & _CCP2MX_PORTC_3H
  __CONFIG    _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
  __CONFIG    _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
  __CONFIG    _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
  __CONFIG    _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
  __CONFIG    _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
  __CONFIG    _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
  __CONFIG    _CONFIG7H, _EBTRB_OFF_7H
ENDASM
;------------------------------------------------------------------------
DEFINE OSC 4
TRISA=0 : PORTA=0 
TRISB=0 : PORTB=0
TRISC=%11110000 
TRISD=%00101111 
ADCON1=7                  'PORT A-E DIGITAL CIKIS
T0CON=$D5                 '1/64 BÖLME ORANI T0CON=%11000101
TMR0L=0                   'TMR0 8BIT KULLANILACAK
INTCON=$A0                'TMRO VE TÜM KESMELER AKTİF INTCON=%10100000
ON INTERRUPT GOTO KESME   'KESME OLUŞTUĞUNDA BU ADRESE GİT

DISABLE  
KESME:    
TICKS=TICKS+1
IF TICKS < 61 THEN DEVAM
TICKS=0
SANIYE = SANIYE + 1         'SANIYELER 60 OLURSA DAKIKAYI ARTIR
IF SANIYE >= 60 THEN
SANIYE = 0
DAKIKA = DAKIKA + 1
IF DAKIKA >= 60 THEN        'DAKIKALAR 60 OLURSA SAATI ARTIR
DAKIKA = 0
ENDIF
ENDIF
DEVAM:
INTCON.2 = 0                'KESME BAYRAGINI TEMIZLE
RESUME

END



Ayarların doğru olduğunu düşünüyorum ama 1 saniye gerçekte 3 saniye gibi geçiyor. Ticks değerini 4'er şeklinde artırırsam 1 saniye gibi oluyor. Lcd ekranın yenileme hızını düşürürsem saniye değeri hızlanıyor. tmr0 arka planda çalışmıyor mu? Düşünüyorum ama neden olabileceğini kestiremedim. bit6 değerini 16bit olarak seçmediğim için mi veya prescale değerinden mi acaba, yada INTCON registerini mi bilmediğimden?

Düzeltme:
INTCON registerine baktım ayarlama doğru gibi geldi bana 5bit -> tmr0 aktif. 7bit ise ->kesmeler aktif. Datasheet'den option registerini aradım ama PIC18'de galiba farklı. Birde konfigürasyonda adı geçen WDT ile WDTPS ile de ilgili olabileceğinide düşündüm aslında. 

ete

TMR0 ayarların doğru. 1/64 bölme oranı seçilmiş. TMR0 8 bit çalışıyor ve sıfırdan itibaren saymaya başlıyor. Kesme içinde de TMR0'a yeni ön yükleme değeri verilmiyor bu yeniden saymaya sıfırdan başlayacağı anlamına geliyor.
Her bir sayma aralığı 256 (0-255) ve 64 bölme oranı olunca 64*256=16384 kadar sayacak demektir. Buna 7us civarında komut gecikmesi eklenince sayılacak rakam 16391 oluyor. Kesme içinde bundan 61 tane saydırıyorsun böylece yaklaşık olarak her bir saniye artışı için sayac 16391 x 61=999.851 us lik bir süre geçirecek demektir.

Buraya kadar her şey doğru gözüküyor. Dikkatimi çekenbir eksiklik kesmeden çıkarken kesmeleri yeniden enable etmemişsin.
DEVAM:
	INTCON.2 = 0                'KESME BAYRAGINI TEMIZLE
	RESUME
	ENABLE  'bunu unutmuşsun 
	END
Muhtemel sorunun budur diye düşünüyorum. KESME etiketinden önce DISABLE ettiğin bir kesmeyi kesme sonunda ENABLE etmen gerekir.

Birde denemeyi simulasyonda yapıyorsan pek çok kişinin yanıldığı gibi sende gerçek zamanla simulasyon zamanının mukayese ediyorsunki buda yanlış bir şey. Simulasyon gerçek zamandan yavaş çalışıyor. Simulasyonun gerçek zamanını aşağıda kısman sol tarafta çalışan zaman saatinden görebilirsin.
Denemeyi gerçek devrende yapıyor isen o zaman devredeki kristal'e , kristal kullanım şekline ve kısacası devrene bakmak gerekir. Onları göremediğimiz için bir şemada koymadığın için bu konuda fikir yürütemiyorum maalesef.

Ete

transistor

Merhaba, dediğiniz gibi problem ENABLE'dan kaynaklanıyormuş. Herhangi bir problem kalmadı. Yardımlarınız için  teşekkür ederim. Birde öğrenmek istediğim iki soru daha var. İlk olarak aşağıda ki kodu daha kısa yazma şekli var mıdır?

if buton1=1 and buton2=1 and buton3=1 and buton4=1 then
...
endif

yerine

if portb,0,1,2,3=1 then
...
endif

gibi. Diğer konu ise, mesela portb'nin 7,6,5,4 bitleri çıkış iken diğer bitler 3,2,1,0 biltlerini giriş olarak tanımlarsak, giriş olan 4 biti okuma şeklim nasıl olmalı?

if portb=00001111 then
...
endif

böylemi olmalı, sonuçta son dört bit değişken çıkış olduğu için $0f bu şekilde vereceğim bir okuma şeklinde son dört bit dikkate alınacak mı, yoksa $f yazmak kafi mi olacaktır.


ete

Birden fazla buton şayet sıralı olarak porta bağlı ise ve sende bir komutla hepsini kontrol etmek istersen PORT kontrolü yapman gerekiyor.
Butonlar PUllup lı olarak bağlı ise butona basılmadığı sürece hepsi "1" konumunda olacaktır.
IF PORTB & (%00001111)=%00001111 THEN 'butona basılmamış ki bunu zaten kontrol etmek gerekmiyor.
IF PORTB & (%00001111)=%00001110 THEN 'bu durumda PORTB.0 daki buton basılmış
IF PORTB & (%00001111)=%00001101 THEN 'bu durumda PORTB.1 deki buton basılmış
IF PORTB & (%00001111)=%00001100 THEN 'bu durumda B0 ve B1 birlikte basılmış
şeklinde butonları kontrol edebilirsin.

Ete

transistor

Anladım teşekkür ederim.

transistor

Ben bu uygulamayı kullanıyorum. Kullanışlı birşey sıkıntı yaşamazsınız.


Powered by EzPortal