12C508A 'dan 12F675'e dönüşüm

Başlatan ipek, 17 Haziran 2016, 02:28:51

ipek

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

RaMu

#1
İ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:




mesaj birleştirme:: 17 Haziran 2016, 10:46:50

12C508 datasheet inede bakıp tek tek karşılaştırılabilir.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

sadogan

 İpek hocam,
Status,pc gibi registerkler zaten bu dosya içerisinde tanımlı
Bu tanımları kaldırın.
INCLUDE <P12F675.INC>

ipek

#3
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

OG

#4
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.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

RaMu

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.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

OG

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.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

RaMu

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.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

OG

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ı.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

RaMu

#9
Ü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.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html