STATUS , C BİTİ

Başlatan Extreme, 28 Ekim 2014, 11:45:57

Extreme

Merhaba forum üyeleri

Status , c biti

Örnek olsun diye bir kod koyalım
MOVF    	dene
	   	ADDWF   	ntv,1
	   	BTFSS   	STATUS,C


ntv = ntv+dene

ve ntvnin msb bitinde taşma var mı ?

sonuç bu mu ?

yani bu bit sadece msbde taşma olup olmadığına bakar

taşma olursa =1
olmazsa =0

bu kadar mı ? yoksa bu flag başka durumlardada set edilebilir mi ?

mir_as82

#1
Yanlış hatırlamıyorsam C carry demekti. Hocam yaptığın işlemin sonucunda taşma varsa bu bit 1 olur. Taşma nasıl olur?8 bit işlemci olduğunu kabul edersek memory alanındaki işlem yapacağın değerin 255 olsun. Ve sen onu W register içeriği de 1 olsun. Sen o değişkenin ile W i toplarsan sonucun 256 olur. Bu ise 9 bit ile ifade edilebilir. Ama senin W registerin en fazla 8 bit ?? O zaman ne yapıyor sana elde var 1 diyor. (Toplama yapar gibi).

Hocam o bitin set edildiği komutlar vardı. Mesela rotate left shift diye komut vardı. Orada da 7. bitler Carry bitine gidiyordu galiba. Tık tık diye sola atınca, 7. bitlerin düştüğü çukur hep carry oluyor du.

Extreme

#2
onu biliyorum hocam onun dışında örnek olarak aşağıdaki kodda ne işlem yapar.

MOVLW      D'100'
SUBWF      adc_2M,w
BTFSS      STATUS,C


Bu işlemin sonucuda

adc_2M ≥ 100 
ise 1
değilse 0 diyebilirmiyiz

mir_as82

MOVLW      D'100' //decimal 100 sabitini W ye alır
SUBWF      adc_2M,w//W den(yani 100 den) senin önceden tanımladığın adc_2M registerini çıkarır ve sonucu tekrar W e yazar
BTFSS      STATUS,C//Eğer C biti 1 ise alttaki satırı yapmaz bir sonraki satırı yapar, C 1 ise xxxxxx satırı yapılmaz, direkt yyyyyyy satırına atlanır
xxxxxxxxxx
yyyyyyyyyy

sadogan

Toplma işleminden sonra sonunda MSB bitinden taşma varsa(sonuç 255 den büyükse) C=1 olur.
Carry flagı etkileyen başka konutlarda var sub işlemide C yi etkiler,kaydırma işlemleri RLF,RRF C ile birlikte yapılır.

mir_as82

Before instruction execution: REG = 3, W = 2, C = x, Z = x
After instruction:  REG = 1, W = 2, C = 1, Z = 0 result is positive

Before instruction execution: REG = 2, W = 2, C = x, Z = x
After instruction:  REG = 0, W = 2, C = 1, Z = 1 result is 0

Before instruction execution: REG = 1, W = 2, C = x, Z = x
After instruction:  REG = 0xFF, W = 2, C = 0, Z = 0 result is negative

Substract W from File: yani F - W işlemiymiş.
Sonuç pozitif ise C=1, Z=0

Sonuç 0 ise: C=1, Z=1

Sonuç negatif ise: C=0,Z=0

sadogan

Verdiginiz örnekte  adc_2M > 100  C=0 deyilse C=1 burda çıkarma işlemi
100-adc_2M şeklinde olmuştur.

mir_as82

Yani sonuçta, sonuç pozitif ve sıfır ise alt satırı yapmaz. Ama sonuç negatif ise BTFSS      STATUS,C nin bir alt satırı yapılır. Yani bir nevi sonuç negatif olursa program normal çalışma akışından başka bir çalışma akışına yönlendirirlir.

Extreme

#8
@sadogan ve @mir_as82 cevaplarınız için teşekkür ederim
(@sadogan üniversite bitirme tezime bu forum vasıtasıyla çok katkısı olmuştu tekrardan teşekkürler.)

Sanırım soruyu net olarak soramadım. Daha güzel bir mesajla sormak istediğim soruyu tekrarlıycam.

BTFSS yi incelememize gerek yok sadece status c bitin durumuna bakalım lütfen

1.DURUM

    
MOVF    	dene
ADDWF   	ntv,1
BTFSS   	STATUS,C
a1
a2


Kod açıklaması
ntv=ntv + dene
yeni ntv değişkeni 255i aşarsa msb 1den 0a geçer status c biti 1 olur.
eğer ntv değişkeni 255i geçmezse status c biti 0 dır.

Bu konuda anlaştık bunu biliyorum.

2.DURUM
RRF VE LLF tarzlarındaki status,c biti olayınıda biliyorum.



3.DURUM
Benim sormak istediğim veya emin olmak istediğim soru aşağıdadır (daha çok subwf komutu ile ilgili)
[/u]


MOVLW      D'100'
SUBWF      adc_2M,w
BTFSS      STATUS,C
a3
a4



w=adc_2M - 100
adc_2M - 100 ≥ 0 ise c biti 1 olur
adc_2M - 100 < 0 ise c biti 0 olur



İşte benim soru üst 2 satırda yazdığım açıklama doğru mu ?






mir_as82