Bu macro'yu nasıl saydırabilirim

Başlatan serkan, 17 Aralık 2022, 07:16:31

serkan

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

alikeskinkilic

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
Hep meraktan

serkan

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

alikeskinkilic

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.
Hep meraktan

alikeskinkilic

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.
Hep meraktan