assembly yardım

lordsansar

Üye
Katılım
16 Eki 2011
Mesajlar
6
Puanları
1
ARKADASLAR kahve makınesıne benzer bır aletın para ustu hesaplayan kısmında takıldım kucuk bır parcasını buraya aktardım. atılan parayı urun fıyatından cıkartıp aradakı farka gore para ustu veren.(1lıra yada 50 kurus) tam sonuc alamıyorum sonuc hatalı cıkıyor anlayan bırı yardımcı olsun lutfen.


BTFSS STATUS,Z
BTFSC STATUS,0 : bu kısım fark ın 1lıraya esıt mı buyuk mu yada kucuk mu olduguna bakıyor


LIST P=16F877
INCLUDE "P16F877.INC"


FARK EQU h'29'
_1_LIRA EQU h'30'
VERILECEK_50_KURUS EQU h'54'
_50_KURUS EQU h'55'
VERILECEK_1_LIRA EQU h'42'
URUN_BEDELI EQU h'50'
ATILACAK_TOPLAM_PARA EQU h'51'

CLRF h'29'
CLRF h'30'
CLRF h'42'
CLRF h'50'
CLRF h'51'
CLRF h'54'
CLRF h'55'

MOVLW d'50'
MOVWF _50_KURUS

MOVLW d'100'
MOVWF _1_LIRA

MOVLW d'60'
MOVWF URUN_BEDELI
MOVLW d'250'
MOVWF ATILACAK_TOPLAM_PARA

BANKSEL TRISB
MOVLW h'06'
MOVWF ADCON1
MOVLW h'00'
MOVWF TRISA
MOVWF TRISB
MOVWF TRISC
MOVWF TRISD
BANKSEL PORTB


MOVF URUN_BEDELI,W
SUBWF ATILACAK_TOPLAM_PARA,W
MOVWF FARK

IF1
MOVLW _1_LIRA
SUBWF FARK,W
BTFSS STATUS,Z
BTFSC STATUS,0
GOTO ISLEM
GOTO IF2
ISLEM
INCF VERILECEK_1_LIRA,F
MOVLW _1_LIRA
SUBWF FARK,F
GOTO IF1

IF2
MOVLW _50_KURUS
SUBWF FARK,W
BTFSS STATUS,Z
BTFSC STATUS,0
GOTO ISLEM2
GOTO GOSTER

ISLEM2
INCF VERILECEK_50_KURUS,F
MOVLW _50_KURUS
SUBWF FARK,F
GOTO IF2

GOSTER
MOVF FARK,W
MOVWF PORTB
MOVF VERILECEK_1_LIRA,W
MOVWF PORTC
MOVF VERILECEK_50_KURUS,W
MOVWF PORTD
GOTO SON


SON
GOTO SON
END
 
LIST P=16F877
INCLUDE "P16F877.INC"


FARK EQU h'29'
_1_LIRA EQU h'30'
VERILECEK_50_KURUS EQU h'54'
_50_KURUS EQU h'55'
VERILECEK_1_LIRA EQU h'42'
URUN_BEDELI EQU h'50'
ATILACAK_TOPLAM_PARA EQU h'51'

CLRF h'29'
CLRF h'30'
CLRF h'42'
CLRF h'50'
CLRF h'51'
CLRF h'54'
CLRF h'55'

MOVLW d'50'
MOVWF _50_KURUS

MOVLW d'100'
MOVWF _1_LIRA

MOVLW d'60'
MOVWF URUN_BEDELI
MOVLW d'250'
MOVWF ATILACAK_TOPLAM_PARA

BANKSEL TRISB
MOVLW h'06'
MOVWF ADCON1
MOVLW h'00'
MOVWF TRISA
MOVWF TRISB
MOVWF TRISC
MOVWF TRISD
BANKSEL PORTB


MOVF URUN_BEDELI,W ;ürün bedeli yukarıda 60 dec yüklenmiş
SUBWF ATILACAK_TOPLAM_PARA,W ;atılacak toplam para 250 yüklenmiş (atılacak toplam para-W(ürün bedeli) >>>>
MOVWF FARK ;pic hex çalışır> FA hex- 3C hex olarak işlem algılanır sonuç = BE hex (190 dec) olur yani fark

IF1
MOVLW _1_LIRA ;_1_LIRA EQU h'30' yukarıda atanmış burada W ye 30 hex sayısını yükler
SUBWF FARK,W ;FARK-W yani ilk adımda BEh-30h işlemi yapılır = 8Eh sonucu W ye yüklenir
BTFSS STATUS,Z ;sonuç 0 değildir iki sayı birbirine eşit değildir Z=1 olmaz alt satır işlenir
BTFSC STATUS,0 ;sonuç pozitifdir carry=1 olur alt satır işlenir işleme dallanılır
GOTO ISLEM
GOTO IF2
ISLEM ;
INCF VERILECEK_1_LIRA,F ;VERILECEK_1_LIRA başlangıçta sıfırlanmalı, sıfır kabul edersek içeriği 1 oldu
MOVLW _1_LIRA ;_1_LIRA EQU h'30' yukarıda atanmış burada W ye 30 hex sayısını yükler
SUBWF FARK,F ;fark en son BEh olmuştu BEh-30h=8Eh > sonuç FARK a yüklenir FARK=8Eh
GOTO IF1 ;yine aynı hatalı işlemler yapılmaya gidilir

IF2
MOVLW _50_KURUS
SUBWF FARK,W
BTFSS STATUS,Z
BTFSC STATUS,0
GOTO ISLEM2
GOTO GOSTER

ISLEM2
INCF VERILECEK_50_KURUS,F
MOVLW _50_KURUS
SUBWF FARK,F
GOTO IF2

GOSTER
MOVF FARK,W
MOVWF PORTB
MOVF VERILECEK_1_LIRA,W
MOVWF PORTC
MOVF VERILECEK_50_KURUS,W
MOVWF PORTD
GOTO SON


SON
GOTO SON
END



Ben bukadarına baktım eminim aşağıdada aynı hatalar vardır, söylediklerime dikkat edip yazmanı tavsiye ederim, ayrıca debug özelliği ile mplap simulator ve watch penceresinden kullandığın değişkenlerin içeriklerini gösterme kısımlarını öğrenip açıp programını adım adım kontrol etmelisin bu sayede kendinde nerede hata yaptığını bulabilirsin.
 
@karaapak kardesım ıkı gundur her secenegı denemıstım farklı dongu yontemlerı kullandım 10 saat basında oturdugumu bılıyorum. assembly e kıtaptan calıstım ama movlw komutuna sadece sabıt sayı atandıgını bılmıyordum.etıketın ıcındekı sabıt sayıyı da gordugunu sanıyordum. en temel yerde yaptıgım hatadan dolayı bu kadar vakıt kaybettım. ne kadar tesekkur etsem azdır kardesım allah razı olsun sorunu cozdun
 
Bende okuldayken öğretmenimiz assembler kursu açmıştı çok uğraşmıştım ama beni almamıştı sonra oturup kitaptan öğrenmiştim, öğrenmem epey zaman aldı sonra başka bir üniversiteye geçtim bu geçtiğim üniversitede mikrodenetleyici dersi zorunlu olduğundan dersi aldım, iyide oldu daha detaylı uygulamalar yapmaya başladım tabi kitaptan öğrenince bu gibi hatalar oluyordu bende hemen hemen aynı hatayı yapmıştım bir yerde movwf yazacağıma movlw yazmıştım aynen senin gibi 10 saatten fazla üzerinde uğraştım tam bırakıyordumki o anda hatamı farkettim şimdi bu komutu nerede görsem hata arıyorum, programının başında senin gibi 10 saat hata arayan zor bulunur helal olsun emeğine sağlık ne zaman istersen elimden geldiğince yardım ederim şunu tekrar söylemek istiyorum mplab ın debugger özelliğini ve watch penceresini kullanın programın çalışmasını birebir görebiliyoruz çok faydasını gördüm ben tekrar tavsiye ediyorum.
 
normalde yaptıgım alete lcd ekran baglayacaktım ancak bunun uzerınde cok durdugum ıcın ve assembly ıle lcd ekran cok ugrastırdıgı ıcın onu yapamayacagım galıba proteus uzerınde 1-0 larla anlatmaya calısacagım :) yarın bitirme sunumum var yumurta kapıya dayanınca yaparsan boyle oluyo malum:) programla o kadar cok ugrastım kı sımdı yazı yazarken bosluk bırakmak ıcın space e basacagıma tab a basıyorum:). tavsıyenı dıkkate alacagım ama once sunum ıcın programı bıtırmem lazım. sunumda soyledıgın watch ozellıgının faydası olur mu bana sence vakıt kalırsa ona da bakarım
 
Mp lab ı açtığında üst sıradaki aşağı açlır pencereden "debugger>>select tool>>mplabsım" seçimini yap sağüst tarafa yakın biryerlerde winamptaki gibi ileri geri tuşlarına benzer işaretler ve ok işaretleri çıkar (adları üzerine gelince çıkar "step ınto, step over, step out" debugger penceresindede bunların kısayolları yazıyor) şimdi buradan step ınto ile adım adım kodu işletebilir en sondaki reset ile programı resetleyebilirsin ayrıca bu işlemleri yaparken tanımladığın değişkenlerin, w regıster ının veya portların içindeki verilerin ne olduğunu görmek istiyorsan yine fıle project vs nin bulunduğu yerdeki "vıew>>watch " tıklanıp açılır sonra bir pencere gelir ekrana nurada iki seçenekli aşağı açılır kutular vardır soldakinin yanında addsfr yazar aşağı açılır pencereden istenen seçim tek tek yapılır ve her seçim için addsfr ye tıklanır, sağ tarafta ise add symbol yazar ve yanında yine aşağı açılır kutu bulunur buradada benzeri işlem yapılır artık istediklerini bu pencereden izleyebilirsin başta bahsettiğim step ınto (kısayolu f7) ile programı satır satır çalıştırıp her bir satırda watch penceresindeki değişkenlerin değişimini görebilirsin, bence simülasyonda gayet iyi iş görür zaten mplab ın kendi simülatörü adı üzerinde.
Ayrıca programına direk dahil edebileceğin 2*16 lcd için yazdığım programıda gönderebilirim yarım saatte projene dahil edebilirsin c, vesaire diğer dillerdeki gibi olsun diye yazmıştım ben içinde lcd olan tüm programlarımda kullanıyorum.
 
hocam watch u da ogrendım . programda yıne hata cıktı onun sayesınde sorunu cozdum cok sagolasın. lcd programını gonderırsen muhtesem olur . ben umudu kestım dırek boyle sımulasyon yapacaktım. egeer dedıgın gıbı hemen halledebılırsem. gercekten super olur
 
Programı denedim çalışıyor yanına notta ekledim dosya eklemeyi öğrenebilirsem buraya ekleyeceğim şimdi
 
A;16F877 LCD SÜRME PROGRAMI PORTC7=ENABLE, PORTC6=RW, PORTC5=RS LCD BACAKLARINA BAĞLI
; PORTD7=DATA7, PORTD6=DATA6, PORTD5=DATA5, PORTD4=DATA4 LCD BACAKLARINA BAĞLI


INCLUDE "P16F877.INC"
LIST P=16F877
__CONFIG _CP_OFF&_WDT_OFF&_XT_OSC &_PWRTE_ON&_BODEN_OFF&_DEBUG_OFF &_LVP_OFF

E EQU 7 ;LCD ENABLE BACAĞI PORTC,7 YERİNE PORTB,E YAZILABİLSİN DİYE
RW EQU 6 ;LCD R/W BACAĞI PORTC,6 YERİNE PORTB,RW YAZILABİLSİN DİYE
RS EQU 5 ;LCD R7S BACAĞI PORTC,5 YERİNE PORTB,RW YAZILABİLSİN DİYE
;LCD NİN BU BACAKLARI PORTC YERİNE BAŞKA PORTLARA BAĞLANACAKSA AŞAĞIDAKİ
;VERI VE KOMUT ALT PROGRAMLARINDA GEREKLİ PORT DÜZENLEMELERİ YAPILMALIDIR
;AYRICA KULLANILAN PORTUN FARKLI BACAKLARINA BAĞLANTI YAPILACAKSA EQU
;KISMINDA İLGİLİ DÜZENLEME YAPILMALIDIR

VERI1 EQU 50H
VERI2 EQU 51H
VERI3 EQU 52H
VERI4 EQU 53H
VERI5 EQU 54H
VERI6 EQU 55H
VERI7 EQU 56H
VERI8 EQU 57H
VERI9 EQU 58H
VERI10 EQU 59H
VERI11 EQU 5AH
VERI12 EQU 5BH
VERI13 EQU 5CH
VERI14 EQU 5DH
VERI15 EQU 5EH

KOMUT1 EQU 60H
KOMUT2 EQU 61H
KOMUT3 EQU 62H
KOMUT4 EQU 63H
KOMUT5 EQU 64H
KOMUT6 EQU 65H
KOMUT7 EQU 66H
KOMUT8 EQU 67H
KOMUT9 EQU 68H
KOMUT10 EQU 69H


SAYACVERI EQU 70H
SAYACKOMUT EQU 71H
VERIDEGER EQU 72H
KOMUTDEGER EQU 73H

SAYACA EQU 74H
SAYACB EQU 75H
SAYACC EQU 76H




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GİRİŞ ÇIKIŞ ATAMALRINDA LCD NİN DATA VE E-RW-RS İÇİN;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KULLANILAN BACAKLARI ÇIKIŞ YAPILMALIDIR;;;;;;;;;;;;;;;;;
ORG 0000H
CLRF PORTC
CLRF PORTD

BSF STATUS,5
CLRF TRISC ;ENABLE R/S R/W İÇİN
CLRF TRISD ;LCD DATA İÇİN
BCF STATUS,5

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;||||||||||||||||PROGRAMIN BAŞLANGICINDA BİRYERDE 1 DEFALIĞINA LCDKUR ALT PROGRAMI ÇAĞIRILMALIDIR

CALL LCDKUR

;||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;> LCD ALT PROGRAMINI KULLANACAK PROGRAM ÖRNEĞİ ŞÖYLE OLMALIDIR;

MOVLW 0C0H ;ÖRNEĞİN LCD NİN C0H ADRESİNDEN BAŞLANARAK YANİ 2. SATIRIN BAŞI
MOVWF KOMUT1 ;AŞAĞIDAKİ VERİLER YAZILMAK İSTENSİN ÖNCELİKLE YAZILACAK ADRES KOMUT OLARAK GÖNDERİLİR
MOVLW 0FFH ;KOMUT SONLANDIRMA DEĞERİ
MOVWF KOMUT2
CALL KOMUTISLEME ;YAZILAN KOMUTLARI İŞLER

MOVLW 52H ;YAZILMAK ISTENEN DEGERLER KARAKTER KARAKTER VERI DEĞİŞKENLERİNE YAZILIR
MOVWF VERI1 ;R
MOVLW 41H ;EĞER BİR DEĞİŞKENİN İÇERİĞİ GÖSTERİLMEK İSTENİYORSA Kİ BU DEĞİŞKENİN ASCII
MOVWF VERI2 ;A ;KARŞILIĞI OLMAK ZORUNDADIR MOVF DEGISKENASCII,W
MOVLW 0FFH ; MOVWF VERIX ;İLE GÖSTERİLEBİLİR
MOVWF VERI3 ;VERI SONLANDIRMA DEGERİ
CALL VERIISLEME


DUR GOTO DUR ;PROGRAM YAZILDIĞINDA AŞAĞIDAKİ ALT PROGRAMLARA ATLAMASINA İZİN VERİLMEMELİDİR


;;;;NOT! KOMUTISLEME VE VERIISLEME ALT PROGRAMLARINDAN DÖNÜLEBİLMESİ İÇİN HER ZAMAN SON KOMUT VE SON
; VERI DEGERI OLARAK FFH DEGERİ GİRİLMEK ZORUNDADIR

;;;;;;;;;;;;;;;;;;;;;;;;ÖRNEK PROGRAM SON;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<




;;;;;;;;;;;;;;;;;;;;LCD ALT PROGRAMI BAŞLANGIÇ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

KOMUTISLEME MOVLW 0FFH ;KOMUT İŞLEME DÖNGÜSÜ ///////////////////
MOVWF SAYACKOMUT
KOMUTISLEME2 CALL BEKLE1MS
BSF PORTC,E
BCF PORTC,RW
BCF PORTC,RS
INCF SAYACKOMUT,F
INCF SAYACKOMUT,F
MOVF SAYACKOMUT,W
CALL TABLOKOMUT
MOVWF KOMUTDEGER ;TABLODAN GELEN W DEĞERİNİ 4 BIT MODDA LCD YE GÖNDEREBİLMEK İÇİN
SUBLW 0FFH ;VE SON KOMUT DEĞERİ OLUP OLMADIĞINI GÖRMEK İÇİN KULLANILIR
BTFSC STATUS,Z
GOTO KOMUTBITTI
MOVF KOMUTDEGER,W
MOVWF PORTD
CALL BEKLE1MS
BCF PORTC,E
CALL BEKLE1MS
BSF PORTC,E
SWAPF KOMUTDEGER,W
MOVWF PORTD
CALL BEKLE1MS
BCF PORTC,E
GOTO KOMUTISLEME2
KOMUTBITTI RETURN ;//////////////////////////////////////

VERIISLEME MOVLW 0FFH ;VERİ İŞLEME DÖNGÜSÜ //////////////////
MOVWF SAYACVERI
VERIISLEME2 CALL BEKLE1MS
BSF PORTC,E
BCF PORTC,RW
BSF PORTC,RS
INCF SAYACVERI,F
INCF SAYACVERI,F
MOVF SAYACVERI,W
CALL TABLOVERI
MOVWF VERIDEGER
SUBLW 0FFH
BTFSC STATUS,Z
GOTO VERIBITTI
MOVF VERIDEGER,W
MOVWF PORTD
CALL BEKLE1MS
BCF PORTC,E
CALL BEKLE1MS
BSF PORTC,E
SWAPF VERIDEGER,W
MOVWF PORTD
CALL BEKLE1MS
BCF PORTC,E
GOTO VERIISLEME2
VERIBITTI RETURN ;/////////////////////////////////////

TABLOKOMUT ADDWF PCL,F ;HER SEFERİNDE ADDWF KOMUTUNDAN SONRAKİ 2. 4. 6. ... SATIR İŞLENİR
NOP
MOVF KOMUT1,W
RETURN
MOVF KOMUT2,W
RETURN
MOVF KOMUT3,W
RETURN
MOVF KOMUT4,W
RETURN
MOVF KOMUT5,W
RETURN
MOVF KOMUT6,W
RETURN
MOVF KOMUT7,W
RETURN
MOVF KOMUT8,W
RETURN
MOVF KOMUT9,W
RETURN
MOVF KOMUT10,W
RETURN





TABLOVERI ADDWF PCL,F ;HER SEFERİNDE ADDWF KOMUTUNDAN SONRAKİ 2. 4. 6. ... SATIR İŞLENİR
NOP
MOVF VERI1,W
RETURN
MOVF VERI2,W
RETURN
MOVF VERI3,W
RETURN
MOVF VERI4,W
RETURN
MOVF VERI5,W
RETURN
MOVF VERI6,W
RETURN
MOVF VERI7,W
RETURN
MOVF VERI8,W
RETURN
MOVF VERI9,W
RETURN
MOVF VERI10,W
RETURN
MOVF VERI11,W
RETURN
MOVF VERI12,W
RETURN
MOVF VERI13,W
RETURN
MOVF VERI14,W
RETURN
MOVF VERI15,W
RETURN


BEKLE1MS MOVLW 01H
MOVWF SAYACA
MOVWF SAYACB
GOTO DONGUB

BEKLE50MS MOVLW 01H
MOVWF SAYACA ;SAYACA*SAYACB* 1MİLİSANİYE
DONGUA MOVLW 32H ;=DECIMAL 50
MOVWF SAYACB ;SAYACB* 1 MİLİSANİYE
DONGUB MOVLW 0FFH
MOVWF SAYACC ;1MİLİSANİYE
DONGUC NOP
DECFSZ SAYACC,F
GOTO DONGUC
DECFSZ SAYACB,F
GOTO DONGUB
DECFSZ SAYACA,F
GOTO DONGUA
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

LCDKUR MOVLW 20H ;LCD RESET
MOVWF KOMUT1
MOVLW 01H ;DISPLAY TEMİZLE
MOVWF KOMUT2
MOVLW 02H ;KURSOR Ü BAŞA AL
MOVWF KOMUT3
MOVLW 28H ;2 SATIR, 5*7 KARAKTER, 4BİT MOD
MOVWF KOMUT4
MOVLW 0FH ;DISPLAY AÇIK KURSOR AÇIK KURSOR YAN-SÖN
MOVWF KOMUT5
MOVLW 06H ;HER KARAKTER YAZMADA KURSÖR SAĞA KAYACAK EKRAN SABİT
MOVWF KOMUT6
MOVLW 0FFH ;KOMUT SONLANDIRMA VERİSİ
MOVWF KOMUT7
CALL KOMUTISLEME
RETURN
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LCD ALT PROGRAMI SON ;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



end
 

Forum istatistikleri

Konular
128,349
Mesajlar
916,912
Kullanıcılar
450,199
Son üye
NCA0

Yeni konular

Geri
Üst