Assambly gecikme döngüsü içerisinde kendiliğinden değişkenin değerinin değişmesi !

my_rules

Üye
Katılım
22 Nis 2014
Mesajlar
8
Puanları
1
Yaş
37
Öncelikle herkeze merhaba , forum içerisinde ilk açtığım konu.

Assambly diline yeni başlayan birisi olarak bana çok ilginç gelen bir sorunu paylaşmak istedim . Aşağıda paylaşacağım kodlama da program bekle döngüsüne dallandığında AL1 değişkeni hakkında hiç bir komut yazmama rağmen içeriği değişiyordu , bende bunu anlamak için AL1 değişkenini döngü içerisinde belli yerlerde W register içerisine yazdırdım kodlamalarda kodların yanlarına büyük harflerle açıklamasını yaptığım yerlerde MPLab programının " special function register" panelinden takip ettiğimde adım adım Bekle döngüsü girişinde AL1 i w a aktardığımda değer 00000001 döngü bitiminde "GOTO DONGU" komutuna gelmeden önceki komutu işlediğinde ise W register ı 00000000 şeklinde görülmekte. Değişken içeriğinin neden sıfırlandığını anlayamadım(Döngü içerisine AL1 ile alakalı herhangi bir komut yazmasam da sıfırlanmakta).Programdaki amaç butona her basıldığında değerin 1 arttırılması 1. değişken 0xff değerini aldığında diğer değişkenin arttırılmasını sağlamak bir sonraki stepte 16 bit toplama , çıkarma gibi işlemler yapmaya çalışıcam

Kod bloğu
;---------KUTUPHANELER-----------------------
LIST P=16F84A
#INCLUDE <P16F84A.INC>
;----------PIC KONFIGURASYON-----------------
__CONFIG _CP_OFF & _XT_OSC & _PWRTE_OFF & _WDT_OFF
;---------PROGRAM BALANGICI------------------
ORG 0X00
;--------REGISTER TANIMLAMALARI--------------
AL1 EQU 0X0C
AL2 EQU 0X0D
BL1 EQU 0X0E
BL2 EQU 0X0F
BSF STATUS , 5 ; BANK 1 E GEC
SAYAC1 EQU 0X8C
SAYAC2 EQU 0X8D
MOVLW 0XFF
MOVWF TRISA ;PORTA GIRIS OLARAK AYARLANILDI
CLRF TRISB
MOVLW 0X03
MOVWF SAYAC1
MOVLW 0X01
MOVWF SAYAC2 ;PORTB CIKIS OLARAK AYARLANILDI
BCF STATUS , 5 ;BANK 0 A GEC
MOVLW 0X00
MOVWF PORTB
MOVLW 0X00
MOVWF AL1
MOVWF AL2
MOVWF BL1
MOVWF BL2
;--------------ANA PROGRAM------------------
DONGU
ISLEM_SEC
BTFSC PORTA , 0 ;buton a basıldımı
GOTO ISLEM_SEC ;tekrar test et
GOTO ARTTIR ;pin 0 a çekildi ise arttıra dallan
ARTTIR
BSF STATUS , 5 ;bank 1 e geç
MOVLW 0X01
MOVWF SAYAC2 ;sayac2 yi yükle
BCF STATUS , 5 ;bank 0 a geç
MOVF AL1 ,0 ;AL1 değişken içeriğini w register ata(olması gerektigi gibi)
SUBLW 0XFF ;w register içeriğini sabit değerden çıkar w a yaz
BTFSC STATUS , 2 ;status zero bitini kontrol et AL1 değeri 0xff e esitmi
GOTO A2A ;esit ise A2A dallan
GOTO A1A ;esit değilse A1A dallan
A1A
INCF AL1 , 1 ;AL1 değişken değerini 1 arttır AL1 değişkenine yaz
MOVF AL1 , 0 ;AL1 değişken içeriğini w register a yaz (olması gerektigi gibi)
MOVWF PORTB ;w register içeriğini port b e yaz
MOVF PORTB , 0 ;Port b içeriğini w register a yaz
MOVWF AL1 ;w register içeriğini AL1 e yaz
GOTO BEKLE ;gecikme döngüsüne (Bekle) dallan
A2A
INCF AL2 , 1 ;AL2 değişken değerini 1 arttır AL2 değişkenine yaz
MOVF AL2 , 0 ;AL2 değişken içeriğini w register a yaz
MOVWF PORTB ;w register içeriğini port b e yaz
MOVF PORTB , 0 ;Port b içeriğini w register a yaz
MOVWF AL2 ;w register içeriğini AL2 e yaz
GOTO BEKLE ;gecikme döngüsüne (Bekle) dallan
BEKLE
MOVF AL1 , 0 ;AL1 DEGISKEN ICERIGINI W REGISTER A YAZ (AL1 DEGISKEN ICERIGI NORMAL OLMASI GEREKTIGI GIBI)
BSF STATUS , 5 ;BANK 1 E GEC
MOVLW 0X03
MOVWF SAYAC1 ;SAYAC1 DEGISKENINI YUKLE
DON
NOP
NOP
NOP
NOP
DECFSZ SAYAC1 ;SAYAC1 SIFIRLANDIMI
GOTO DON ;HAYIR SIFIRLANMADI DON E DALLAN
DECFSZ SAYAC2 ;EVET SIFIRLANDI , SAYAC2 DEGISKENI ICERIGINI 1 DUSUR SIFIRLANDIMI KONTROL ET
GOTO BEKLE ;HAYIR SAYAC2 SIFIRLANMADI BEKLE ETIKETINE DALLAN
BCF STATUS , 5 ;BANK 0 A GEC
NOP
NOP
MOVF AL1 , 0 ;AL1 -> W ICERISINE TEKRAR ATA(AL1 ICERIGI FARKLI SIFIRLANMIS)
GOTO DONGU
END

deneme.jpg


Bana çok ilginç gelen bir sorun , hem internette bu şekilde bir konuya raslamadım burada da deneyimli arkadaşlar ile kaynak ol uşturmuş olunur diye böyle bir konu açmayı faydalı buldum.Konu hakkında bilgisini paylaşan herkeze teşekkürler.
 
Sorunun kaynağı diğer bank içerisindeki Sayac registerlarının içeriğini değiştirmemden kaynaklanıyormuş.
 

Forum istatistikleri

Konular
128,162
Mesajlar
915,577
Kullanıcılar
449,922
Son üye
11akif

Yeni konular

Geri
Üst