I

microcode hatası ve derleyici çalıştırmak

Başlatan illgnsyyz, 24 Nisan 2013, 12:49:42

illgnsyyz

merhaba,
çok uzun zamandır pic kullanmıyordum fakat yeniden ihtiyacım oldu. Ne var ki bir türlü derleyici ve ara yüzü düzgün çalıştıramadım.
işletim sistemim x64 win 7 MPASM kullanıyorum. 64 bit te çalışmanın ufak tefek püf noktaları olduğunu okudum, fuse ayarları gibi, fakat sorunu aşamadım. yardım bekliyorum.
kodum ve aldığım hatalar bu şekilde:

@ __config _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF

PORTA=0
PORTB=0
PORTC=0


'—————————————————————–
@ DEVICE pic16F886 'islemci  16F886
@ DEVICE pic16F886, WDT_on  'Watch Dog timer açık
@ DEVICE pic16F886, PWRT_ON  'Power on timer açık
@ DEVICE pic16F886, PROTECT_OFF 'Kod Koruma kapalı
@ DEVICE pic16F886, MCLR_OFF  'MCLR pini kullanılmıyor.
@ DEVICE pic16F886, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
'—————————————————————–
ON INTERRUPT GoTo SAYAC 'kesme oluşursa sayaç adlı etikete git.
OPTION_REG=%00000000 'dahili  Pull up dirençleri aktif edildi ayrıca pullup direncine gerek yok
INTCON=%10010000 'Tüm  Kesmeler aktif ve RB0/INT kesmesi aktif
TRISB=%00000001 'PortB.0  giris digerleri çıkıs yapıldı.
TRISA=%00000000 'A portu  tamamı çıkıs yapıldı.
TRISC=%00000000 'C portu  tamamı çıkıs yapıldı.
CMCON=7 '16F886 de  komparatör pinleri iptal hepsi giris çıkıs

'—————————————————————–
YUZUS var BYTE         '100x mikro saniye
MS VAR WORD            'mili Saniye
SN VAR WORD            'Saniye
SURE VAR WORD          'devir suresi
SYMBOL sinyal=PORTB.0  'sensör sinyali
SYMBOL LED1=PORTA.0    '''''''''''''''''''''''''''''''''
SYMBOL LED2=PORTA.1    '
SYMBOL LED3=PORTA.2    '
SYMBOL LED4=PORTA.3    '
SYMBOL LED5=PORTA.4    '
SYMBOL LED6=PORTA.5    '
SYMBOL LED7=PORTA.6    '
SYMBOL LED8=PORTA.7    '
SYMBOL LED9=PORTB.1    ' Led bağlantıları
SYMBOL LED10=PORTB.2   '
SYMBOL LED11=PORTB.3   '
SYMBOL LED12=PORTB.4   '
SYMBOL LED13=PORTB.5   '
SYMBOL LED14=PORTB.6   '
SYMBOL LED15=PORTB.7   '
SYMBOL LED16=PORTC.0   '
SYMBOL LED17=PORTB.1   '
SYMBOL LED18=PORTB.2   '''''''''''''''''''''''''''''''''
CLEAR                  'DEĞİŞKENLER SIFIRLANDI
'——————————————————————-
PAUSE 100
BASLA:



goto basla              ' bu satırlar  arasında dolasır


DISABLE                 'yeniden kesme  oluşması önleniyor
SAYAC:                  'KESME

IF INTCON.2=1 THEN
YUZUS=YUZUS+1
    IF YUZUS=10 THEN
    MS=MS+1
    YUZUS=0
        IF MS=1000 THEN
        SN=SN+1
        MS=0
        ENDIF
    ENDIF
INTCON.2=0   
ENDIF   

IF INTCON.1=1 THEN
SURE=(1000*SN+MS)/18
YUZUS=0
MS=0
SN=0
INTCON.1=0 'RB0/INT Bayragı (flag) silindi.
GOTO BASLA
ENDIF

Resume 'geldigin yere dön
Enable 'kesmeler yeniden  aktif.
End


ve aldığım hatalar bunlar



ELZEMEFE

PIC16F628 ise cmcon=7 yazdığında portlar dijital olur
PIC16F877   adcon1=7 yazarsan porta dijital girişl çıkış  olur
http://ww1.microchip.com/downloads/en/DeviceDoc/41291D.pdf
Buraya bir bak..

"@ __config _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF"

ya bu kalsın  yada yukardaki @ satırı başlayan yer kalsın ..
@ DEVICE pic16F886 'islemci  16F886
@ DEVICE pic16F886, WDT_on  'Watch Dog timer açık
@ DEVICE pic16F886, PWRT_ON  'Power on timer açık
@ DEVICE pic16F886, PROTECT_OFF 'Kod Koruma kapalı
@ DEVICE pic16F886, MCLR_OFF  'MCLR pini kullanılmıyor.
@ DEVICE pic16F886, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak


benim görebildiklerim bu kadar


illgnsyyz

teşekkür ederim hataların yarısının kaynağı cmcon=7    adcon1=7 karmaşasından dolayıymış.
şidi sadece Define komutundan kalan hatalar var. define kısmını çıkarırsam hatasız derliyor fakat Define ile yapmak istediklerimi config ile yapılabilir mi yapılamaz mı bilmiyorum. o konuda da yardıma ihtiyacım var.

ete

Kullandığını zişlemci yeni nesil işlemcilerden birisi. Komut larda ufak tefek farklılıklar var.
Data sheete bakma alışkanlığını edinmeniz gerekiyor.
Bu işlemcide kullanacağınız sigorta ayarları aşağıdaki gibi olabilir.

@ __config _CONFIG1, _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
@ __config _CONFIG2, _WRT_HALF 

Bu işlemcide komparatör iptali iki komut ile yaplıyor,
CM1CON0=0 'C1 Komparatör iptal
CM2CON0=0 'C2 Komparatör iptal

Analog (ADC) pinlerin iptali için
ANSEL= 0 'A portu analog pinler iptal
ANSELH=0  'B portu Analog pinler iptal
komutlarını kullanman gerekiyor.

Son olarak derleme için PBP klasörü içinde yer alan 16F886.INC dosyasında alt kısımlarda yer alan sigorta satırlarını başlarına ; koyarak kapatıp geriye kayıt etmeniz gerekir. Zira , derleme işleminde hem bu 18F886.INC dosyası, hemde MPASM içinde yer alan P16F886.INC dosyası kullanılmaktadır. Her iki INC dosyasında sigorta direktifleri yer aldığı için aynı komut iki defa işlenmiş olmaktadır. İkincisinde derleyici Found Label after Column1 gibi hatalar verir.
Kapatma işlemini yaparsanız sorun ortadan kalkar ve derlemeyi sigorta değerleri ile yapabilirsiniz.
Detaylı bilgi için aşağıdakilinki okuyunuz,

http://etepic.com/index.php/topic,300.0.html

Ete


Öncelikle dahili osc birden fazla seçeneğe sahip olduğu için OSCCON registerine değer vererek frekansı seçmeniz gerekiyor.
OSCCON=%01111110 'dahili osc 8Mhz e ayarlandı


illgnsyyz

yardım için teşekkür ederim,
16f886.inf altındaki fuse kısmını kaldırdım ama hala aynı hataları alıyorum sanırım problemim define komutlarımla ilgili. datasheet konusunda haklısınız gözden geçirmem gerkir ama konuya pek de hakim olmadığım için önemli noktalar gözden kaçıyor yinede. define komutları yerine aynı ayarlamaları __config ile de yapabiliyorum sanırım komutların nasıl kullanıldığını açıklayan bir döküman var mıdır?

ete

#5
Verdiğim linki okumadınız. Okusanız orada MPASM ile derlemede Define satırlarının kullanılmayacağını görürdünüz.
MPASM nin sigorta formatı farklıdır ve size verdiğim format onun içindi direk onu kullanınız.
Hangi sigorta ayarları kullanılabilir görmek istiyorsanız,
MPASM klasörü içinde yer alan P16F886.INC dosyasını MCS içinde açınız. Aşağıday doru ayarları tek tek görebilirsiniz. Bu ayarları MPASM formatı içinde kullanabilirsiniz.

Ete

illgnsyyz

okudum aslında ama define in hiç kullanılmayacağı noktasını kaçırmışım ben hem define hemde config kullanıcam gibi anlamıştım. peki __config nasıl kullanıyor öğrenebileceğim bi döküman var mı önerebileceğiniz.

ete

Gözünün önündekileri görmemekte ısrarlısın demekki.
Bak verdiğim linkte ne diyor;
Alıntı Yap1. Her şeyden önce programınızda baş taraflarda yazdığınız sigorta ayarları formatını MPASM 'ye göre değiştirmek gerekiyor.
Format'ın nasıl olduğunu  derleyici kalsöründe yar alan 16Fxxx.INC dosyasını açarak görebilirsiniz.
Örnekle açıklayalım. PBP kalsöründe yer alan 16F628A.INC dosyasını MCS içinde açıyorum. Alt kısıma doğru 1 adet config satırı görüyoruz. Bu satırda şunlar yazılı;
;        __config _XT_OSC & _WDT_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF
öncelikle bu satırı başına bir ";" işareti koyarak kapatıyor ve dosyayı geri kayıt ediyoruz.

Sonra kapatılan satırdaki formatı programımızda sigorta ayarları formatı olarak kullanıyoruz.
Şöyle,
@ __config _XT_OSC & _WDT_ON & _MCLRE_ON & _LVP_OFF & _CP_OFF
@ işaretinden sonra bir boşluk verilecektir bu verilmez ise derleme hatalı sonuçlanır.
Bu satıra başka sigorta ayarlarıda eklenebilir. Yapılması gereken bir & işareti ekleyip sigorta ayarını _xxxx şeklinde eklemek olacaktır.

Başka sigorta ayarları ne olabilir onlarıda MPASM içinde yer alan P16F886.INC dosyasından alabilir yada görebilirsin demiştim. O halde Config nasıl kullanılır sorusu için, Başka bir şeye ihtiyacın olduğunu sanmıyorum.
Ete

umiter

Alıntı yapılan: ete - 24 Nisan 2013, 16:24:17
Gözünün önündekileri görmemekte ısrarlısın demekki.
Bak verdiğim linkte ne diyor;
Başka sigorta ayarları ne olabilir onlarıda MPASM içinde yer alan P16F886.INC dosyasından alabilir yada görebilirsin demiştim. O halde Config nasıl kullanılır sorusu için, Başka bir şeye ihtiyacın olduğunu sanmıyorum.
Ete

Sayın, ETE Hocam


@ DEVICE pic16F88, INTRC_OSC_NOCLKOUT

TRISB = %11110111
SYMBOL Led = PORTB.3

Program:

LOW Led
pause 500
high led
pause 500

goto program


Bu kodun derlemesi sonucunda;


   ASM?
DEVICE pic16F88, INTRC_OSC_NOCLKOUT

   ENDASM?

Illegal opcode ( PIC16F88)
hatası meydan geliyor, dahili osilator tanımlasındaki hata hakkında yol gösterebilirmisiniz ?

Saygılarımla.
Bilgi elde edilmesi zor,  tüketilmesi kolay bir bulamaçtır.

ete

Normalde PBP nun PMASM si ile derlenecek şekilde yazılmış sigorta ayarını MPASM ile derlemeye kalkışınca bu hatayı verir.
Aslında iki hata vermesi gerekir. Birincisi;
- Found Label after column 1
İkincisi,
- İllegal opcode (pic16F88)

PBP klasöründe yer alan 16F88.INC dosyasında altlarda yer alan ve MPASM ye ait olan sigorta ayarlarını kapatmış isen baştaki hatayı vermeyecektir muhtemelen.
Çözüm,
Derlemeyi MPASM kullanmadan yapmak . Ancak makinanız 64 bit ise çare yok MPASM ile derleme yapacaksınız demektir.
Bu durumda da yapılacak şunlar;
- PBP klasöründe yer alan 16F88.INC dosyasındaki altta yer alan sigorta ayarlarını veya ayarını başına ; koyarak kapatmak.
- Sigorta satırını şu şekilde vermek,
ASM
__config _CONFIG1,_INTRC_IO  & _WDT_ON & _LVP_OFF & _CP_OFF
endasm
Bu arada F88 de  INTRC_OSC_NOCLKOUT  teriminin karşılığı INTRC_IO dur. Buda hataya sebep oluyor olabilir.

Ete


umiter

#10
ETE Hocam,

PBP3 ile sigorta tanımlarında dahili osilator ile 16F88 microchip ile hata almadan çalışan kaynak kodu aşağıda sizlerlerle sonuç olarak paylaşmak istiyorum.
Fırsatınız dahilinde bir göz atmanızı rica ediyorum.


' Name        : 16f88_fuse.pbp
' Compiler      : PICBASIC PRO Compiler 3.0.6.1
' Assembler    : PBP3
' Target PIC   : PIC16F88
' Hardware    : Experimenter Board
' Oscillator     : 4MHz internal crystal
' Keywords    : FUSE3x
' System        : W7/64B
' Description  : PICBASIC PRO program fuse setting, compiling error(s).
'
#CONFIG
cfg1=       _INTRC_IO    ; Oscillator
cfg1=cfg1&  _WDT_OFF     ; Watchdog Timer
cfg1=cfg1&  _PWRTE_ON    ; Power-Up Timer
cfg1=cfg1&  _MCLRE_OFF   ; Master Clear Reset
cfg1=cfg1&  _CP_OFF      ; Code Protect
cfg1=cfg1&  _CPD_OFF     ; EEPROM Data Protect
cfg1=cfg1&  _BOREN_OFF   ; Brown Out Reset
cfg1=cfg1&  _LVP_OFF     ; Low Voltage Programming
cfg1=cfg1&  _IESO_OFF    ; Internal External Switchover
cfg1=cfg1&  _FCMEN_OFF   ; Fail-Safe Clock Monitor
  __CONFIG _CONFIG1, cfg1

cfg2=       _WRT_OFF      ; Flash memory Write Protect
                   
  __CONFIG _CONFIG2, cfg2

#ENDCONFIG

TRISB = %11110111
SYMBOL Led = PORTB.3

Program:

LOW Led
pause 500
high led
pause 500

goto program


Saygılarımla.
Bilgi elde edilmesi zor,  tüketilmesi kolay bir bulamaçtır.

umiter

#11
Son olarak..

PIC16F88.INFO dosyasına CONFIG tanımları hakkında bilgiye erişmek mümkün.

Saygılarımla.
Bilgi elde edilmesi zor,  tüketilmesi kolay bir bulamaçtır.

ete

PBP3 kullandığını baştan söylesen ona göre düşünürdük elbette.

Ete

umiter

Alıntı yapılan: ete - 26 Nisan 2013, 13:40:02
PBP3 kullandığını baştan söylesen ona göre düşünürdük elbette.

Ete

Benim cahilliğime verin.

Saygılarımla.
Bilgi elde edilmesi zor,  tüketilmesi kolay bir bulamaçtır.

Powered by EzPortal