ASM Uygulama ( Aritmetik )

Başlatan ucdemirhan, 07 Ocak 2021, 00:37:53

ucdemirhan



Herkese merhabalar,
Öğrenciyim.
Mikroişlemci dersini alıyorum. Hocamız bizden bunları uygulamamızı istedi.
Maalesef ki hiçbir şey yapamıyoruz.
Yardımcı olabilir misiniz?
Teşekkürler...

alisumer

#1
hiç birşey yapamadık derken umarım Asm ile ilgili birazcık bişeyler vardır diyerek program ile değilde şöyle yardımcı olmaya çalışayım alt byteler ile üst byteler işlemciler 8 byte olduğundan ayrı ayrı hesaplanmalı en azından ASM için bu böyle 4 adet değişken atarsınız  A3 -E0= c3 sonuçta taşma olduğundan ilgili taşma bayrağını kontrol edip taşma var ise üst bayttan bir eksiltirsiniz yani (61-E0)-1.sonucu da port bacaklarında gösterirsiniz .Alt byte lerde gerek yok sonucu drek bacaklara yansıtırsınız da üst byte lerin saklanması için de bi değişkene daha ihtiyaç var.
Hep meraktan

ucdemirhan

Hocam elimde bu programları uygulamak için
3 adet kod satırları var.
Fakat uzaktan eğitim şartlarından dolayı öğrenemiyoruz. Tam olarak anlayamıyoruz.
Yapmamız gereken bu üç programın birleşiminde bir sonuç elde etmek.
Yardımcı olabilirseniz eğer buyrun kod satırları;

;PROGRAM-17) 8-bit'lik sayıların çıkarılmasına örnek program
;(büyük sayıdan küçük sayıyı çıkarma). PORTB saklayıcısı
;içerisindeki h'5A' sayısından W saklayıcı içerisindeki h'53'
;sayısını çıkarır, sonucu PORTB'ye bağlı LED'lerde gösteriri.
;Çıkarma sonucunun negatif veya pozitif olduğunu RA3'e bağlı LED'de gösterir.
   
;===PROG17.ASM====17/05/2005================================
LIST    P=16F628A
INCLUDE    "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
;-----------------------------------------------------------
ORG        h'00'
CLRF        PORTB        ;PORTB'deki LED'leri söndür
CLRF        PORTA        ;PORTA'daki LED'leri söndür
BANKSEL    TRISB        ;BANK1'e geç
MOVLW        b'11110111'    ;PORTA.3 çıkış
MOVWF        TRISA      
CLRF        TRISB        ;PORTB tüm uçlar çıkış
BANKSEL    PORTB        ;BANK0'a geç
MOVLW        h'5A'        ;W ? h'5A'
MOVWF        PORTB        ;PORTB ? W
MOVLW        h'53'        ;W ? h'53'
SUBWF        PORTB, F        ;PORTB ? PORTB - W
BTFSC        STATUS,0        ;STATUS C=1 mi?
BSF        PORTA,3        ;Evet, çıkarma sonucu pozitif
DONGU
GOTO    DONGU
END
;----------------------------------------------------------





;PROGRAM-18) 8-bit'lik sayıların çıkarılmasına örnek program
;(küçük sayıdan büyük sayıyı çıkarma). PORTB saklayıcısı içerisindeki
;h'52' sayısından W saklayıcısı içerisindeki h'53' sayısını çıkaran,
;sonucu PORTB'ye bağlı LED'lerde gösteren program.

;===PROG18.ASM====17/05/2005================================
        LIST    P=16F628A
        INCLUDE    "P16F628A.INC"
        __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
;-----------------------------------------------------------
        ORG    h'00'
        CLRF    PORTB        ;PORTB'deki LED'leri söndür
        CLRF    PORTA        ;PORTA'daki LED'leri söndür
        BANKSEL    TRISB        ;BANK1'e geç
        MOVLW    b'11110111'        ;PORTA.3 çıkış
        MOVWF    TRISA      
        CLRF    TRISB        ;PORTB tüm uçlar çıkış
        BANKSEL    PORTB        ;BANK0'a geç
BASLA
        MOVLW    h'53'        ;W ? h'5A'
        MOVWF    PORTB        ;PORTB ? W
        MOVLW    h'5A'        ;W ? h'53'
        SUBWF    PORTB, F        ;PORTB ? PORTB - W
        COMF    PORTB, F        ;PORTB'yi tersle
        INCF    PORTB, F        ;PORTB'ye 1 ekle
        BTFSC    STATUS,0        ;STATUS C=1 mi?
        BSF    PORTA,3        ;Evet, çıkarma sonucu pozitif
DONGU
        GOTO    DONGU
        END
;-----------------------------------------------------------



;PROGRAM-19) 16-bit'lik sayıların çıkarılmasına örnek program ;
;(büyük sayıdan küçük sayıyı çıkarma). h'0004' sayısından h'0001'
;sayısını çıkaran program. Program çalıştığında çıkarma sonucunun
;alt bayt'ı PortB'deki LED'lerde görülür. Üst bayt'ı görmek için RA0 butonuna basılır.

;===PROG19.ASM====17/05/2005================================
LIST    P=16F628A
INCLUDE    "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
;-----------------------------------------------------------
CBLOCK    20h
AL,AH,BL,BH            ;Değişken adreslerini atama bloğu
ENDC
ORG        h'00'    ;Program kodlarının başlangıç adresi
CLRF        PORTB    ;PortB'yi sıfırla
BANKSEL     TRISB    ;BANK1'e geç
CLRF        TRISB    ;PortB'nin tüm uçları çıkış
MOVLW        H'FF'    ;W ? h'FF'
MOVWF        TRISA    ;PortA'nın tüm uçları giriş
BANKSEL     PORTB    ;BANK0'a geç
MOVLW        h'07'    ;W saklayıcıya h'07' yükle
MOVWF        CMCON    ;W-->CMCON PORTA girişleri dijital
BASLA
MOVLW        h'04'    ;W ? h'04'
MOVWF        AL        ;AL ? h'04'
MOVLW        h'00'    ;W ? h'00'
MOVWF        AH        ;AH ? h'00'  
MOVLW        h'01'    ;W ? h'01'
MOVWF        BL        ;BL ? h'01'
MOVLW        h'00'    ;W ? h'00'
MOVWF        BH        ;BH ? h'00'
CIKAR  
MOVF        BL, W    ;W ? BL
SUBWF        AL, F    ;AL=AL-W(BL), alt bayt sonucu
BTFSS        STATUS, 0    ;CARRY BAYRAĞI=0 mı ?
DECF        AH, F    ;Evet, AH=AH-1    
MOVF        BH, W    ;Hayır, W ? BH
SUBWF        AH, F    ;AH=AH-W(BH), üst bayt sonucu
ALT_BAYT_GOSTER
MOVF        AL, W    ;W ? AL
MOVWF        PORTB    ;Alt bayt sonucunu göster
TEST_RA0
BTFSC        PORTA, 0    ;RA0 butonuna basıldı mı?
GOTO        TEST_RA0    ;Hayır, tekrar test et
MOVF        AH, W    ;Evet, W ? AH
MOVWF        PORTB    ;Üst bayt sonucunu göster.
DONGU
GOTO        DONGU
END
;-----------------------------------------------------------

alisumer

#3
   
;===PROG17.ASM====17/05/2005================================
LIST    P=16F628A
INCLUDE    "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _BODEN_OFF & _LVP_OFF & _DATA_CP_OFF & _CP_OFF
;-----------------------------------------------------------
sayl	equ	h'21
sayh 	equ	h'22
cikl	equ h'23
cikh	equ	h'24
ustsnc	equ	h'25
;değişkenleri tanımladık uygun kayıtçılara
;gerekli giriş çıkış ayarlarını yapın
ORG        h'00'
;ilgili sayılar sonradan girilmediği için ilk başta bunları değişkenlerin 
içine atıyoruz böylelikle enerji verdiğinde sayılar kaayıtçılara hemen kaydedilir
;----------------------------------------------------------
basla
	MOVLW h'61
	movwf	sayh	;değişkenlere verilen sayıları girdik
	movlw h'A3
	movwf	sayl
	movlw h'2e
	movwf	cikh
	movlw h'e0
	movwf	cikl
ilk							;alt byteleri çıkaralım
	MOVF	cikl ,W      	;çıkarılacak sayının low byte ini w ye attık 
	SUBWF 	sayl , W	 	; sayl sayısından w içine attığımız sayıyı çıkarıp tekrar W ye yazdık  
	movwf 	portb			;w deki sonucu sonucu B de gösterdik
kontrol	
	btfsc	status ,c		;çıkarma sonucu taşma olmuşmu baktık yoksa iki adlı programa atladık varsa  bir alt satırdan devam
	goto iki
	incf	cıkh ,w			;çıkan sayının üst byyte na 1 ekledik w ye kaydettik ( siz eksilen sayıyı bir eksilterek de yapabilirsiniz sonuçta aynı şey olacak) 
	subwf	sayh ,w			;yeni sayıyı eksilen sayıdan çıkarıp w ye kaydettik ( işlem yaptığımız sayıları tekrar w ye yazıyoruzki orijinalleri değişmesin)
	movwf	ustsnc			; w deki sonucu ustsnc kayıtçısına atıp saklıyoruz A0 tuşuna basınca alacağız onu
	btfsc	porta ,0		;porta 0 sıfır mı diye bakıyoruz (dahili pulup ayarlarına bakın sonucu etkiler)
	goto basla				;tuşa basılmamışsa en başa dönüp alt bytletri gene gösterir
	movwf	portb			;basılmışsa portb ye üst byte sonucunu atar
	btfss	porta .0		;tuş 1 olmuş ise başlaya dön ve alt byte sonucu göster
	goto	kontrol			;hala basılı ise kontrol satırını döndür
	goto	basla
	
iki
	subwf	sayh ,w			;taşma yok ise ki sayılar belli olduğundan ve taşma olacağından aslında bu satırlara gerek yok ama programı şenlendirir:)
	movwf	ustsnc	
	btfsc	porta ,0		;porta 0 sıfır mı diye bakıyoruz (dahili pulup ayarlarına bakın sonucu etkiler)
	goto basla				;tuşa basılmamışsa en başa dönüp alt bytletri gene gösterir
	movwf	portb			;basılmışsa portb ye üst byte sonucunu atar
	btfss	porta .0		;tuş 1 olmuş ise başlaya dön ve alt byte sonucu göster
	goto	iki				;hala basılı ise iki satırını döndür
	goto	basla
end
Hep meraktan

alisumer

#4
muhtemelen biliyorsunuzdur ama hatırlatayım" pic simulator ide" programı var yazdıklarınızı  o programda deneyebilirsiniz  ASM kodlarının nasıl işlediğini de görmüş olursunuz tabi proteus ile de simule edebilirsiniz
Hep meraktan

ucdemirhan

Hocam elinize emeğinize sağlık,
Çok teşekkür ediyorum beni büyük bir yükten kurtardınız. 🙏🏼

alisumer

bu arada kodları denemedim ama register ayarlarını düzgünce yaparsanız muhtemelen çalışır en azından mantığını yan taraflarda yazdım ufak tefek aksaklıkları da siz gidericeksiniz datasheet okuyun az :)
Hep meraktan

alisumer

#7
buda çalışan hali
;PROGRAM-17) 8-bit'lik sayıların çıkarılmasına örnek program
;(büyük sayıdan küçük sayıyı çıkarma). PORTB saklayıcısı
;içerisindeki h'5A' sayısından W saklayıcı içerisindeki h'53'
;sayısını çıkarır, sonucu PORTB'ye bağlı LED'lerde gösteriri.
;Çıkarma sonucunun negatif veya pozitif olduğunu RA3'e bağlı LED'de gösterir.
   
;===PROG17.ASM====17/05/2005================================
LIST 	p=PIC16F628	
#INCLUDE <P16F628.INC>
__CONFIG 	08E2
;-----------------------------------------------------------
sayl	equ	0x21
sayh 	equ	0x22
cikl	equ 0x23
cikh	equ	0x24
ustsnc	equ 0x25
;değişkenleri tanımladık uygun kayıtçılara
;gerekli giriş çıkış ayarlarını yapın
;ORG        h'00'
;ilgili sayılar sonradan girilmediği için ilk başta bunları değişkenlerin 
;içine atıyoruz böylelikle enerji verdiğinde sayılar kaayıtçılara hemen kaydedilir

		BSF		STATUS ,RP0			;BANK 1
		MOVLW	B'00000001'			;PORTA 0-2 GİRİŞ	
		MOVWF	TRISA

		MOVLW	B'00000000'			;PORTB	4 GİRİŞ
		MOVWF	TRISB

		BSF		OPTION_REG ,7		
		BCF		STATUS ,RP0			;BANK 0
		MOVLW 0x07 ; bacaklar 1*0
		MOVWF CMCON

;----------------------------------------------------------
basla
	MOVLW 0x61
	movwf	sayh	;değişkenlere verilen sayıları girdik 
	movlw 0xA3
	movwf	sayl
	movlw 0x2e
	movwf	cikh
	movlw 0xe0
	movwf	cikl
ilk							;alt byteleri çıkaralım
	MOVF	cikl ,W      	;çıkarılacak sayının low byte ini w ye attık 
	SUBWF 	sayl , W	 	; sayl sayısından w içine attığımız sayıyı çıkarıp tekrar W ye yazdık  
	movwf 	PORTB			;w deki sonucu sonucu B de gösterdik

	btfss	STATUS ,DC		;çıkarma sonucu taşma olmuşmu baktık yoksa iki adlı programa atladık varsa  bir alt satırdan devam
	goto iki
kontrol	
	incf	cikh ,w			;çıkan sayının üst byyte na 1 ekledik w ye kaydettik
	subwf	sayh ,w			;yeni sayıyı eksilen sayıdan çıkarıp w ye kaydettik
	movwf	ustsnc			; w deki sonucu ustsnc kayıtçısına atıp saklıyoruz A0 tuşuna basınca alacağız onu
	btfsc	PORTA ,0		;porta 0 sıfır mı diye bakıyoruz (dahili pulup ayarlarına bakın sonucu etkiler)
	goto basla				;tuşa basılmamışsa en başa dönüp alt bytletri gene gösterir
	movwf	PORTB			;basılmışsa portb ye üst byte sonucunu atar
	btfss	PORTA ,0		;tuş 1 olmuş ise başlaya dön ve alt byte sonucu göster
	goto	kontrol			;hala basılı ise kontrol satırını döndür
	goto	basla
	
iki
	subwf	sayh ,w			;taşma yok ise ki sayılar belli olduğundan ve taşma olacağından aslında bu satırlara gerek yok ama programı şenlendirir:)
	movwf	ustsnc	
	btfsc	PORTA ,0		;porta 0 sıfır mı diye bakıyoruz (dahili pulup ayarlarına bakın sonucu etkiler)
	goto basla				;tuşa basılmamışsa en başa dönüp alt bytletri gene gösterir
	movwf	PORTB			;basılmışsa portb ye üst byte sonucunu atar
	btfss	PORTA ,0		;tuş 1 olmuş ise başlaya dön ve alt byte sonucu göster
	goto	iki				;hala basılı ise iki satırını döndür
	goto	basla
end
Hep meraktan

alisumer

simulasynda en azından denedim
Hep meraktan

ucdemirhan

Hocam ilginiz için çok teşekkür ediyorum,
Burdan açıklayamadığım sebeplerden dolayı bunu öğrenmemiz mümkün değil.
Öğrenmemiz için hiçbir şey yapılmıyor ve sürekli bu dersten ödev alıyoruz.
hiçbir türlü simülatör kullanmadan .txt yi editleyerek .asm kaydedip MPASMWIN programında convertliyoruz
Derste de anlamak mümkün değil, bir şekilde dersten geçeceğiz ama gerçekten çok kötü bir deneyim oluyor.
Çözüm bulamıyoruz
Yine de çok teşekkür ederim saygılarımla...

alisumer

 :o  beyler bende bunun okulunu okumadım ETE  den basic öğrenmeye çalıştım sağ olsun .ASM yi de mikroişlemcilerin datasheet dosyalarından öğrendim ASM kolaydır aslında kullandığı kelime sayısı çok az 30 kelime ile kontrol ediyorsunuz en azından çok karmaşık olmayan programları ASM ile yapmak iyi gelir işlemcinin nasıl çalıştığını registerlerin içeriğini anlarsın herşeyi okuldan beklemeyin öğrenmek isteyene burası da okulun kralı
Hep meraktan

ucdemirhan

Estağfurullah hocam, anlıyorum demek istediğinizi.
Bakıldığı zaman kendi açımdan mikroişlemcilerle alakalı bir işte çalışacağımı düşünmüyorum.
bu durum bakıldığı zaman zor ama öğrenildiğinde yapılmayacak bir şey olmadığı kanaatindeyim

alisumer

:) okuduğunuz bölüme bakarak nedense işlemciler ile ilgili bir işte çalışırsınız sanmıştım tabi ufkunuz geniş ise kolay yoldan memur da olabilirsiniz ve hayatınız boyunca o ufka söversiniz ben bundan daha fazlasıyım diye
Hep meraktan

ucdemirhan

Bilgisayar Teknolojisi ve Bilişim sistemleri öğrencisiyim,
Temel Elektronik ve Sayısal Elektronik derslerini kısmen aldım diyelim.(Aynı hocadan)
Şimdi de mikroişlemci dersini kısmen alıyorum.
Diğer taraftan bölüm daha çok yazılım ağırlıklı.
Tabi tüm bunlara rağmen mezun olduktan sonra ticaret yapmak geçiyor aklımdan diğerleriyle alakasız :)
Bakalım her şeyin hayırlısı...

Powered by EzPortal