Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: serkan - 17 Aralık 2022, 07:16:31

Başlık: Bu macro'yu nasıl saydırabilirim
Gönderen: serkan - 17 Aralık 2022, 07:16:31
Arkadaşlar merhaba.

32 bit bir macrom var,direk ulaşabiliyorum.Saydırma işi nasıl yapılacak?

sayi =sayi+1; gibi
 


       
          ;LIST DIRECTIVE OPTIONS   
;r=radix hex Sayi tabanini ayarla: hex, dec, oct. Radix'.
;st={ON|OFF} Liste dosyas?nda sembol tablosunu yazd?r.
;t={ON|OFF} Kapali Listeleme sat?rlar?n? kisaltin (aksi takdirde sar?n).
;w={0|1|2} 0 Mesaj seviyesini ayarlayin.
;x={ON|OFF} Açik Makro genisletmeyi açar veya kapatir.

          title   "32-bit binary to ascii"
        LIST p=16F628A,r=dec ,n=80,x=off,st=off
       
#INCLUDE <p16f628a.inc>


__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF
            errorlevel -302  ; no bank warnings
    errorlevel -305  ; no default dest warnings
 
#define d7      PORTB,3     
#define d6      PORTB,2       
#define d5      PORTB,1       
#define d4      PORTB,0       
#define EN      PORTA,3       
#define RS      PORTA,2
#define UP      PORTB,7
#define DOWN    PORTB,6
 
sayi =0 

b_32bitsayi MACRO 
local m,n,p
p = sayi  / 16777216   ;7,358598053455353
movlw p
movwf bin  ;7,358598053455353 ;
m = (sayi  - p * 16777216) / 65536   ;31604936100,1989
movlw m
movwf bin+1
n = (sayi  - p * 16777216 - m * 65536) / 256  ;5,302347487555929e+17
movlw n
movwf bin+2
movlw sayi  - p * 16777216 - m * 65536 - n * 256  ;3,474946449444654e+22
movwf bin+3
ENDM

CBLOCK 0x20

        bin:5               ;32 bit ikili sayi (isaretsiz)   32-bit
bcd:10       ;10 BC hanesi veya 10 ascii karakteri
ii                    ;döngü sayaci
d1,d2,d3,d1a,d2a,d3a  ;gecikme
txt,cnt,com
ENDC

        ORG     0X00 
;port ve lcd init
        CLRF    PORTA
        CLRF    PORTB
        BANKSEL TRISA
        MOVLW   b'00000000'

MOVWF   TRISA
        MOVLW   b'11110000'
        MOVWF   TRISB

BCF OPTION_REG, NOT_RBPU  ;PORTB pulup var
BANKSEL CMCON
        MOVLW   0x07
MOVWF   CMCON

BSF EN   
CALL   Delay
BCF RS   
BCF d4
BCF d5
BCF d6
BCF d7
BCF EN     

MOVLW d'2'          ; Cursor basta
CALL KOMUT_LCD
MOVLW d'40'          ; 4bit modu
CALL KOMUT_LCD
        MOVLW d'15'          ; Cursor acik
CALL KOMUT_LCD
MOVLW d'16'          ; Cursor sol d'16'  Cursor sag d'6'
CALL KOMUT_LCD
MOVLW d'12'          ; Cursor kapali
CALL KOMUT_LCD
MOVLW d'1'             ; Clear screen
CALL KOMUT_LCD
GOTO $+1         

main_while

BTFSS UP         
CALL  SAYICI
GOTO main_while
SAYICI
CALL   Delay1             
sayi =100000
         b_32bitsayi    
CALL ikiliden_bcd ; 32 bit ikiliden 10 bcd'ye dönüstür 
CALL    goster_sayi

RETURN
 
;******************************************************************
; konumundaki 32 bit ikili sayiyi bir bcd numarasina dönüstürün

ikiliden_bcd
movlw .32 ; 32-bits
movwf ii ; döngü sayaci 
clrf bcd ; sonuç alanini temizle 
clrf bcd+1
clrf bcd+2
clrf bcd+3
clrf bcd+4
 
b2bcd2
movlw bcd ; isaretçi pointer   
movwf FSR
movlw .5
movwf cnt

; Mike's routine:**********************************************
b2bcd3
movlw 0x33
addwf INDF,f         ; her iki nibble'a da ekle
btfsc INDF,3 ; test if low result > 7
andlw 0xf0 ; dü?ük sonuç > 7 ise test edin low result >7 so take the 3 out
btfsc INDF,7 ; yüksek sonuç > 7 ise test edin test if high result > 7
andlw 0x0f ; yüksek sonuç > 7 yani tamam high result > 7 so ok
subwf INDF,f ; herhangi bir sonuç <= 7, geri çikar  any results <= 7, subtract back
INCF FSR,f ; point to next
decfsz cnt
goto b2bcd3
rlf bin+4,f         ; bin+4,f EKLEDI
rlf bin+3,f ; get another bit
rlf bin+2,f
rlf bin+1,f
rlf bin+0,f
rlf bcd+4,f ; bcd'ye koy
rlf bcd+3,f
rlf bcd+2,f
rlf bcd+1,f
rlf bcd+0,f
decfsz ii,f ; hepsi tamami all done?
goto b2bcd2 ; hayir, döngü no, loop
        RETLW .0                ; yes; yes;RETURN

goster_sayi

        movlw   .128               ;LCD ilk satir
        call    KOMUT_LCD          ;LCD'ye gönder
 
        swapf   bcd+0,w           ; alt parçasiyla degtirin
        andlw   0x0F              ; alt yarim bayt için maske 
        addlw   0x30              ; ASCII karakter seti için ofset ekle
        call    DATA_LCD          ; Bayt? W cinsinden LCD'ye gönder
 
        movf    bcd+0,w           ; BCD hanesini W'nin alt parças?na koyun
        andlw   0x0F              ; düsük yarim bayt için maske
        addlw   0x30              ; 48 =0 ASCII karakter  için ofset ekle 
        call    DATA_LCD          ; Bayt? W cinsinden LCD'ye gönder
 
        swapf   bcd+1,w           
        andlw   0x0F               
        addlw   0x30               
        call    DATA_LCD         
;
        movf    bcd+1,w           
        andlw   0x0F             
        addlw   0x30               
        call    DATA_LCD         
;
        swapf   bcd+2,w           
        andlw   0x0F             
        addlw   0x30               
        call    DATA_LCD           
 
        movf    bcd+2,w           
        andlw   0x0F               
        addlw   0x30             
        call    DATA_LCD           
       
swapf   bcd+3,w           
        andlw   0x0F             
        addlw   0x30               
        call    DATA_LCD           
;
        movf    bcd+3,w           
        andlw   0x0F               
        addlw   0x30               
        call    DATA_LCD           
 
        swapf   bcd+4,w           
        andlw   0x0F               
        addlw   0x30               
        call    DATA_LCD           
;
        movf    bcd+4,w           
        andlw   0x0F               
        addlw   0x30               
        call    DATA_LCD           

        return
 
KOMUT_LCD    

MOVWF com
BSF EN   
        CALL   Delay 
BCF RS   

BCF d4
BCF d5
BCF d6
BCF d7

BTFSC com, 7   
BSF d7
BTFSC com, 6
BSF d6
BTFSC com, 5
BSF d5
BTFSC com, 4
BSF d4

BCF EN   
CALL   Delay
BSF EN   

BCF d4
BCF d5
BCF d6
BCF d7

BTFSC com, 3
BSF d7
BTFSC com, 2
BSF d6
BTFSC com, 1
BSF d5
BTFSC com, 0
BSF d4

BCF EN   

RETURN
;-------------------------------------------------
DATA_LCD              
MOVWF txt
BSF EN     
        CALL   Delay
BSF RS   
BCF d4
BCF d5
BCF d6
BCF d7
BTFSC txt, 7 
BSF d7
BTFSC txt, 6
BSF d6
BTFSC txt, 5
BSF d5
BTFSC txt, 4
BSF d4

BCF EN   
CALL   Delay
BSF EN 

BCF d4
BCF d5
BCF d6
BCF d7

BTFSC txt, 3
BSF d7
BTFSC txt, 2
BSF d6
BTFSC txt, 1
BSF d5
BTFSC txt, 0
BSF d4
BCF EN     

RETURN

Delay
movlw 0x01
movwf d1
movlw 0x6
movwf d2
movlw 0x01
movwf d3
Delay0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto Delay0
goto $+1
goto $+1
goto $+1
   RETURN

Delay1
movlw 0x3
movwf d1a
movlw 0x7
movwf d2a
movlw 0x04
movwf d3a
Dela
decfsz d1a, f
goto $+2
decfsz d2a, f
goto $+2
decfsz d3a, f
goto Dela

RETURN
 
      END
Başlık: Ynt: Bu macro'yu nasıl saydırabilirim
Gönderen: alikeskinkilic - 29 Aralık 2022, 22:30:15
eğer kastettiğin 32 bit bir değişkeni arttımak ise
ıncfsz sayı
goto $+6
ıncfsz  sayı+1
goto $+4
ıncfsz  sayı+2
goto $+2
ıncfsz  sayı+3
Başlık: Ynt: Bu macro'yu nasıl saydırabilirim
Gönderen: serkan - 30 Aralık 2022, 17:31:08
Evet sayıyı artırmak istiyorum.
Bu şekil denedim.
  INCFSZ sayi+0   ;PAGESEL $
   goto $+6
  b_32bitsayi
    CALL ikiliden_bcd  
CALL    goster_sayi
  INCFSZ  sayi+1
   goto $+4
  b_32bitsayi
    CALL ikiliden_bcd
CALL    goster_sayi
  INCFSZ  sayi+2
   goto $+2
   b_32bitsayi
    CALL ikiliden_bcd
CALL    goster_sayi
   INCFSZ  sayi+3
   b_32bitsayi
   
CALL ikiliden_bcd
CALL    goster_sayi

219 invalid ram location specified uyarısı veriyor.Kod çalışmıyor.

Sayı değişkenini CBLOCK içinde tanımladığımda uyarı vermiyor fakat kod yine çalışmıyor.

Bu şekilde problem yok sayıyı yazarak değiştiriyorum.Artırma azaltma işlemini yapamadım. :)
  sayi =1234567890  ;
  b_32bitsayi
Başlık: Ynt: Bu macro'yu nasıl saydırabilirim
Gönderen: alikeskinkilic - 05 Ocak 2023, 15:25:34
LOCAL bir makro içinde tanımlanan etikettir.Endm komutu ile kullanıma kapatılır.program içerisinde okuyamazssınız sadece makro içerisinden erişilir programına bakmadım ama sorun bu olabilir. lokal yerine vericeğiniz 32 bit veriyi stantardt ram bölgelerine yazarsanız da makrodan okuyabilirsiniz.sorununuz ise sayıyı 32 bitlik tek sayı yerine 4 adet 8 byte veri şeklinde yazarsınız.UDATA komutunu bi inceleyin 32 byte veriyi tek satırda yazmaya izin veriyor ama kullanımına tam hakim değilim ben daha çok 4 byte veriyi ayrı ayrı vererek 32 bit oluşturuyorum okuması zor kullanımı benim açımdan daha kolay.ayrıca programda hata da olması muhtemel dediğim gibi tüm programı okumadım çok vakit istiyor.
Başlık: Ynt: Bu macro'yu nasıl saydırabilirim
Gönderen: alikeskinkilic - 27 Ocak 2023, 00:15:00
eğer sorun sadece 32 bitlik bir sayıyı birbir arttırmak ise benim verdiğim kod çalışır .siz sanırım 32 bit sayıyı bcd ye çevirmeye çalışıyorsunuz ama programda nasıl çevirdiğinizi çözemedim .benim bildiğim ilk önce her desimal basamak için en değerli basamaktan başlayarak ,o basamak değerleri ile artık bölünemeyene kadar bölünmesi gerektiği ardından da bcd için çıkan sonucun her basamak değerine 4 bitlik 0 ile 9 sayısını elde etmek için ayrı yerleştirmek bu da size sayı basamağının yarısı kadar uzunlukta byte mal olması demek.tabi sayının kaç basamak olacağı da muamma çünki 32 bit birler basamağı harıç 9 ayrı  bölme istiyor eğer tüm basamaklar bulunacaksa alabileceği max değer 4.294.967.295 olduğu için.