bir programla uğraşıyorum assembler ile yazılmış,encoder'den gelen pals'ları 2 bit buton haline çeviriyor,elde bir adet 12C508A vardı ona attım ve program tamda istediğim gibi çalıştı,dinazor 12C508 ile uğraşmayayım ,12F675'e çevireyim dedim.CMCON,ile Comparatoru kapattım,Ansel ile Analog girişleri kapattım,Ram bölgesini yeniden düzenledim,PullUplar açık,sadece bir portun yerini değiştirdim,12F675 GP3 PullUp desteklemiyor diye,eskiden 16C'leri 16F'lere çevirebiliyordum,demekki bir şeyi atlıyorum,ilgilenen olursa çalışan ve çalışmayan simulasyon ektedir,not 2'ci 12F675 sadece simulasyon için grey kodu üretiyor 90 derece faz farklı ,kısaca encoderi simule ediyor...Isis'inki berbat bende bu yöntemi buldum..
çalışan [code title "Incremental 2 Pulse Convertor - v.1.0"
list p=12c508a, F=INHX8M
__config 0Ah ; MCLR off, CP off, WDT off, OSC int RC
;* RC int., Tcpu=1us, 12C508A
;**********************************************************************
;
; Vdd -| U |- Vss
; cw pulse -| |- channel A
; ccw pulse -| |- channel B
; pulse 25ms -| |- not use
c equ 0 ;def. status
dc equ 1
z equ 2
rp0 equ 5
ina equ 0 ;def. gpio
inb equ 1
pulse25 equ 3
outccw equ 4
outcw equ 5
cw equ 0 ;def. flag
ccw equ 1
;def. RAM (registers):
indir equ 0
rtcc equ 1
pc equ 2
status equ 3
fsr equ 4
osccal equ 5
gpio equ 6
flag equ 7
old equ 8
new equ 9
cha equ 0A
chb equ 0B
org 0 ;reset vector
movwf osccal ;calibration value for RC osc.
goto start
;**********************************************************************
;* init settings - ports, prescaler,... *
;**********************************************************************
;ports: 0-output, 1-input
start
movlw b'001111' ;ina, inb, pulse25 input
tris gpio ;outcw, out ccw output
clrf gpio
movlw b'00000100' ;ps 1:32, pull-up
option
clrf flag ;clear registers
clrf old
clrf new
;----------------------------------------------------------------------
detent
clrf cha ;clear registers
clrf chb
movfw gpio ;read channels
andlw b'00000011'
movwf new
btfsc new,ina ;channel A
bsf cha,0
btfsc new,inb ;channel B
bsf chb,0
movfw cha
xorwf chb,0 ;compare channels A, B
btfss status,z ;same?
goto change ;no
btfsc flag,cw
goto valid
btfsc flag,ccw
goto valid
movfw new ;new > old
movwf old
goto detent
;----------------------------------------------------------------------
valid
rrf new,0
andlw b'00000001'
xorwf old,0 ;compare log. levels - channel B
btfss status,z ;different (valid detent position)?
call pulse ;yes gen. pulse
goto detent
;----------------------------------------------------------------------
change
btfsc flag,cw ;continue only if it's first change
goto detent ;(flags cw=0 and ccw=0)
btfsc flag,ccw
goto detent
movfw old ;channel A
andlw b'00000001'
xorwf cha,0 ;compare two last reading
btfss status,z ;same?
bsf flag,cw ;no change on the channel A (set cw=1)
rrf old,0 ;channel B
andlw b'00000001'
movwf old
xorwf chb,0 ;compare two last reading
btfss status,z ;same?
bsf flag,ccw ;no change on the channel B (set ccw=1)
call delay ;wait a moment
goto detent
;----------------------------------------------------------------------
;generation pulse
pulse
btfsc flag,cw ;cw rotation?
bsf gpio,outcw ;yes, pulse on the cw pin
btfsc flag,ccw ;ccw rotation?
bsf gpio,outccw ;yes, pulse on the ccw pin
btfsc gpio,pulse25 ;pulse delay 25ms?
goto $+4 ;no skip
call delay ;pulse 25ms (15+10)
call delay
call delay
call delay ;pulse 10ms
call delay
clrf gpio ;set init values
clrf flag ;(detent position)
retlw 0
;----------------------------------------------------------------------
;delay subrutine - 5ms
delay
movlw .100 ;(256-100)x32us
movwf rtcc ;rtcc=5ms
movfw rtcc ;read rtcc
btfss status,z ;overflow rtcc?
goto $-2 ;ne repeat
retlw 0
end][/code]
çalışmayan title "Incremental 2 Pulse Convertor - v.1.0"
LIST P=12F675, R=DEC, F=INHX8M
INCLUDE <P12F675.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _BODEN_OFF & _INTRC_OSC_NOCLKOUT & _CP_OFF &_CPD_OFF
;
; Vdd -| U |- Vss
; cw pulse -| |- channel A
; ccw pulse -| |- channel B
; pulse 25ms -| |- not use
c equ 0 ;def. status
dc equ 1
z equ 2
rp0 equ 5
ina equ 0 ;def. gpio
inb equ 1
pulse25 equ 2 ;3
outccw equ 4
outcw equ 5
cw equ 0 ;def. flag
ccw equ 1
;def. RAM (registers):
indir equ 20h
rtcc equ 21h
pc equ 22h
status equ 23h
fsr equ 24h
osccal equ 25h
gpio equ 26h
flag equ 27h
old equ 28h
new equ 29h
cha equ 2Ah
chb equ 2Bh
org 0 ;reset vector
goto start
;**********************************************************************
;* init settings - ports, prescaler,... ports: 0-output, 1-input *
;**********************************************************************
;
start
bcf STATUS,RP0 ;bank 0
clrf GPIO ;init GPIO
movlw b'00000111' ;comparator off, digital pins
movwf CMCON ;
bsf STATUS,RP0 ;bank 1
clrf ANSEL ;digital pins Analog disable
movlw b'00000111' ;settings GPIO (input/output) ;ina, inb, pulse25 input
movwf TRISIO
; clrf INTCON ;interupts disable
movlw b'00000100' ;ps 1:32, pull-up enable
movwf OPTION_REG
movlw b'00000111' ;pull-up
movwf WPU ;ok
call 3ffh ;call calibration value
movwf OSCCAL ;calibrate RC osc.
bcf STATUS,RP0 ;bank 0
clrf flag ;clear registers
clrf old
clrf new
;----------------------------------------------------------------------
detent
clrf cha ;clear registers
clrf chb
movfw gpio ;read channels
andlw b'00000011'
movwf new
btfsc new,ina ;channel A
bsf cha,0
btfsc new,inb ;channel B
bsf chb,0
movfw cha
xorwf chb,0 ;compare channels A, B
btfss status,z ;same?
goto change ;no
btfsc flag,cw
goto valid
btfsc flag,ccw
goto valid
movfw new ;new > old
movwf old
goto detent
;----------------------------------------------------------------------
valid
rrf new,0
andlw b'00000001'
xorwf old,0 ;compare log. levels - channel B
btfss status,z ;different (valid detent position)?
call pulse ;yes gen. pulse
goto detent
;----------------------------------------------------------------------
change
btfsc flag,cw ;continue only if it's first change
goto detent ;(flags cw=0 and ccw=0)
btfsc flag,ccw
goto detent
movfw old ;channel A
andlw b'00000001'
xorwf cha,0 ;compare two last reading
btfss status,z ;same?
bsf flag,cw ;no change on the channel A (set cw=1)
rrf old,0 ;channel B
andlw b'00000001'
movwf old
xorwf chb,0 ;compare two last reading
btfss status,z ;same?
bsf flag,ccw ;no change on the channel B (set ccw=1)
call delay ;wait a moment
goto detent
;----------------------------------------------------------------------
;generation pulse
;
pulse
btfsc flag,cw ;cw rotation?
bsf gpio,outcw ;yes, pulse on the cw pin
btfsc flag,ccw ;ccw rotation?
bsf gpio,outccw ;yes, pulse on the ccw pin
btfsc gpio,pulse25 ;pulse delay 25ms?
goto $+4 ;no skip
call delay ;pulse 25ms (15+10)
call delay
call delay
call delay ;pulse 10ms
call delay
clrf gpio ;set init values
clrf flag ;(detent position)
retlw 0
;----------------------------------------------------------------------
;delay subrutine - 5ms
;
delay
movlw .100 ;(256-100)x32us
movwf rtcc ;rtcc=5ms
movfw rtcc ;read rtcc
btfss status,z ;overflow rtcc?
goto $-2 ;ne repeat
retlw 0
end
http://s4.dosya.tc/server/9nv1rv/12C508__i2p-convertor.rar.html
http://s4.dosya.tc/server/4m74wu/12F675__i2p-convertor.rar.html
İlk hözüme çarpan:
çalışan
;def. RAM (registers):
indir equ 0
rtcc equ 1
pc equ 2
status equ 3
fsr equ 4
osccal equ 5
gpio equ 6
-----------çalışmayan
;def. RAM (registers):
indir equ 20h
rtcc equ 21h
pc equ 22h
status equ 23h
fsr equ 24h
osccal equ 25h
gpio equ 26h
Hocam burada olayı biraz yanlış anlamışsınız,
bunlar mcu nun Special Function Register larının adresleri
12F675 için olması gereken değerleri datasheet e göre şunlar olur:
(https://lh4.googleusercontent.com/-gEgvkhl9RvY/V2Oo35OBoEI/AAAAAAAAAFk/99ywI34RaO0O9g2Ny-26dhVlt-8g6longCL0B/w846-h312-no/12F675%2Bspecial%2Bfunction%2Bregisters%2Badresses%2B.PNG)
mesaj birleştirme:: 17 Haziran 2016, 10:46:50
12C508 datasheet inede bakıp tek tek karşılaştırılabilir.
(https://lh4.googleusercontent.com/-37EY-5WAmvg/V2OqtpqlXAI/AAAAAAAAAGQ/lrGG64AEJZ40SYkMYdcD1u7YtlUZXXi2QCL0B/w267-h364-no/12c508%2Bspecial%2Bfunction%2Bregisters%2Badresses.PNG)
İpek hocam,
Status,pc gibi registerkler zaten bu dosya içerisinde tanımlı
Bu tanımları kaldırın.
INCLUDE <P12F675.INC>
arkadaşlar ikinizde sağolun...
ben include dosyasını ekleyince herşeyi otomatik yapacağını hayal etmiştim...
her iki mcu'nun INC dosyasını açtığımda adreslerde olağanüstü değişiklik farkettim,gerekli değişiklikleri yaptım ve çalıştı...
birde tris komutu vardıki çok uğraştırdı meğerse yeni mplab onu refüze etmiş ,onada bir kılıf buldum,
sonuçta bildiklerimi unutmuşum şu Picbasic'in bizi kolaya alıştırmasından....
mesaj birleştirme:: 17 Haziran 2016, 13:12:02
bayağı bir temizlik yaptım,belki birilerinin işine yarar...
title "Incremental 2 Pulse Convertor - v.1.0"
LIST P=12F675, R=DEC, F=INHX8M
INCLUDE <P12F675.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _MCLRE_OFF & _BODEN_OFF & _INTRC_OSC_NOCLKOUT & _CP_OFF &_CPD_OFF
errorlevel ,-302
;
; Vdd -| U |- Vss
; cw pulse -| |- channel A
; ccw pulse -| |- channel B
; not use -| |- pulse 25ms
ina equ 0 ;def. gpio
inb equ 1
pulse25 equ 2
outccw equ 4
outcw equ 5
cw equ 0 ;def. flag
ccw equ 1
;def. RAM (registers):
flag equ 20h
old equ 21h
new equ 22h
cha equ 23h
chb equ 24h
org 0 ;reset vector
goto start
;**********************************************************************
;* init settings - ports, prescaler,... ports: 0-output, 1-input *
;**********************************************************************
;
start:
bcf STATUS,RP0 ;bank 0
clrf GPIO ;init GPIO
movlw b'00000111' ;comparator off, digital pins
movwf CMCON ;
bsf STATUS,RP0 ;bank 1
clrf ANSEL ;digital pins Analog disable
movlw b'00000111' ;settings GPIO (input/output) ;ina, inb, pulse25 input
movwf TRISIO
movlw b'00000111' ;ps 1:256, pull-up enable ( eskisi ps 1:32 00000100 )
movwf OPTION_REG
movlw b'00000111' ;pull-up
movwf WPU ;ok
call 3ffh ;call calibration value
movwf OSCCAL ;calibrate RC osc.
bcf STATUS,RP0 ;bank 0
clrf flag ;clear registers
clrf old
clrf new
;----------------------------------------------------------------------
detent:
clrf cha ;clear registers
clrf chb
movfw GPIO ;read channels
andlw b'00000011'
movwf new
btfsc new,ina ;channel A
bsf cha,0
btfsc new,inb ;channel B
bsf chb,0
movfw cha
xorwf chb,0 ;compare channels A, B
btfss STATUS,Z ;same?
goto change ;no
btfsc flag,cw
goto valid
btfsc flag,ccw
goto valid
movfw new ;new > old
movwf old
goto detent
;----------------------------------------------------------------------
valid:
rrf new,0
andlw b'00000001'
xorwf old,0 ;compare log. levels - channel B
btfss STATUS,Z ;different (valid detent position)?
call pulse ;yes gen. pulse
goto detent
;----------------------------------------------------------------------
change:
btfsc flag,cw ;continue only if it's first change
goto detent ;(flags cw=0 and ccw=0)
btfsc flag,ccw
goto detent
movfw old ;channel A
andlw b'00000001'
xorwf cha,0 ;compare two last reading
btfss STATUS,Z ;same?
bsf flag,cw ;no change on the channel A (set cw=1)
rrf old,0 ;channel B
andlw b'00000001'
movwf old
xorwf chb,0 ;compare two last reading
btfss STATUS,Z ;same?
bsf flag,ccw ;no change on the channel B (set ccw=1)
call delay ;wait a moment
goto detent
;----------------------------------------------------------------------
;generation pulse
;
pulse:
btfsc flag,cw ;cw rotation?
bsf GPIO,outcw ;yes, pulse on the cw pin
btfsc flag,ccw ;ccw rotation?
bsf GPIO,outccw ;yes, pulse on the ccw pin
btfsc GPIO,pulse25 ;pulse delay 25ms?
goto $+4 ;no skip
call delay ;pulse 25ms (15+10)
call delay
call delay
call delay ;pulse 10ms
call delay
clrf GPIO ;set init values
clrf flag ;(detent position)
retlw 0
;----------------------------------------------------------------------
;delay subrutine - 5ms
;
delay:
movlw .100 ;(256-100)x32us
movwf TMR0 ;rtcc=5ms
movfw TMR0 ;read rtcc
btfss STATUS,Z ;overflow rtcc?
goto $-2 ;ne repeat
retlw 0
end
Hocam bastan yeniden yazsaydınız yarım saatte yazardınız.
ASM yi, yaptığı işin tümü yani "yazılımın tümü için" kullanan mı var, kaldı mı, küçük programlar için belki.
ASM bilsenizde, işinizi üst seviyeli dillerde yazarsınız, gerektiği yerde insert girer, kullanılır, tekrar üst dil ile devam edersiniz.
Alıntı yapılan: OG - 20 Haziran 2016, 20:35:19
...
ASM yi, yaptığı işin tümü yani "yazılımın tümü için" kullanan mı var, kaldı mı, küçük programlar için belki.
...
Var hocam, hemde büyük programlar için.
Aslında C kullanıyorum ama tamamen asm ile yazdığımız ticari programlar var.
Inline asm konusunda çok haklısın hocam,
hatta bazen hiç gereği olmadığı yerde dahi,
bir parça kodu C ile yazmaktansa ASM ile yazmak,
daha kolay geliyor ve çok çok daha verimli oluyor.
Hocam onlar ASM üstadları, asm den farklı dilde yazmak daha zor geliyordur, ana dilinden farklı dil konuşmak gibi. Kaç kişi olabilir bu kapasitede.
Hocam ASM ile program yazmak zannedildiği kadar zor değil aslında.
Esas problem algoritma kuramamakta.
Benim için en zorlayan dezavantajı
bazen çok iyi bildiğim bir rutini yazmak için
onca satır kodu yazarak
hamallık yapmak zorunda kalıyorum.
Ama en büyük kolaylık sağlayan avantajı
C de yazdığımda bu kod neye dönüştü
neresini nasıl yaptı
diye düşünmek zorunda kalmıyorum,
aynen birebir ne yazdıysam harfi harfine o satırlar o kodlar çalışıyor.
Kullandığım mcu yuda gayet iyi tanıyor olmak zorunda olduğumdan
istisnasız bu şekilde çalışır diyebiliyorum
asm ile yazdığım kodlara.
Derleyicilerde bulduğum hatalar ve eksikler de olduğundan
yazdığım son kısım hatasız çalışması gereken ürünler için
asm yi cezbedici veya zorunlu hale getiriyor.
Ayrıca ASM bilerek yazılan C kodları çok çok farklı oluyor.
Belki de esas sıkıntı zaman, en azından benim için öyle.
Bu sebeple direk sonuç almak, ama en hızlı, ama en kolay vs.
Bu durumda mcu nun bank larına kadar bilmek zorunda kalmıyorsunuz.
Ancak dediğim gibi, ASM cilik ÜSTAD lık dır.
Bizim ki ise, zamana karşı ÜSTAD olma, yani, ÜSTTE, ÖNDE olma çabası.
Üretim aşamasında zaman sıkıntısı çıkardığı çok açık, buna diyecek hiçbir şey yok.
Bazen register kurulumunu yapmak için C de yazıp asm çıktısına bakıp,
datasheet ten kontrol edip,
ha ben burayı atlamışım dediğim olmuyor değil.
Kodun başka mcu ya uyarlanması,
üzerinde revizyonlar yapılması,
bir projede kullanılan harici entegrenin
başka projede kullanılması durumunda kütüphane olarak aktarılması,
vs. durumlarda C açık ara avantajlı oluyor.
Hele ansi C yazılmışsa mcu üretici firma bile fark etmiyor artık,
misal atmel için yazılmış kodu kolaylıkla pic için çevirebiliyoruz.
Yada algoritması çözülen bir işlemi C de koda dökmek çok kolay oluyor.
Ama örneğin ABCD EFGH şeklinde 8 biti CDHE ABFG şeklinde 8 bite dönüştüren
bir kısım gerekti, burada asm ile yazmadıkça optimize bir kod çıkmıyor.
C derleyicilerininde hakkını yememek lazım, çok iyi iş çıkarıyorlar aslında.
Vakit ayırmak isteyen arkadaşlara şunu söyleyebilirim:
C de farklı şekillerde yazdığınız
aynı sonucu verecek kodlarınızın
ASM çıktılarını karşılaştırmak,
bir daha benzer bir kod yazarken
daha çok işe yarayacak olanı seçmekte faydalı oluyor.