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