pic assembler if then =(eşittir) kullanımı nasıl?

Başlatan umitmura, 16 Haziran 2010, 19:34:41

umitmura

Assembler de,Bir butonla sayac değişgenini arttırıp yeni değere göre dallanma yapmak istiyorum, assemblerde dökümanları inceledim fakat mantığını kavrayamadım.
aşağıda örneğe göre assmblerde nasıl yapılır acıklayabilecek arkadaşlar varmıdır.

dim sayac as byte
basla:
if sayac=1 then goto x1:
if sayac=2 then goto x2:
if sayac=3 then goto x3:
goto basla
x1:
x2:
x3:

tyildizak

Asm'de if komutu sadece önişlemci direktiflerinde kullanılıyor, program kısmında kullanılamaz.

umitmura

if olarak kullanamıyorum zaten, basic olarak verdiğim örneği asmde nasıl yapabiliriz, ams karşılığı nedir. teşekkürler

camby

Her seferinde bunu yapmanız gerekiyor:

movlw     .1     ; karşılaştırmak istenen sayı
subwf     sayac,w
btfsc      STATUS,Z     ; Aritmetik işlem sonucu 0 mı
GOTO     AAA

movlw     .2     ; karşılaştırmak istenen sayı
subwf     sayac,w
btfsc      STATUS,Z     ; Aritmetik işlem sonucu 0 mı , btfss de kullanılabilir
GOTO     BBB
.....
.....

Bu da makrolu kullanımı:

;===============MAKRO=====================================================
LKAE		macro 		f,k, etiket
		movlw 		k
		subwf 		f,0
		btfsc		STATUS,2
		CALL		etiket
		endm


Kullanırken:

LKAE		sayac, 0, AAA	;7 segment tarama işlem sırası
		LKAE		sayac, 1, BBB
		LKAE		sayac, 2, CCC
		LKAE		sayac, 3, DDD


umitmura

Önce teşekkür ediyorum, verdiğin kodu uygulamaya çalıştım fakat karşılaştırılacak değerleri doğru yerlere koyamadım kontrol edebilmisiniz.



   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
;----------------------------------------------------------
SAYAC   EQU   H'20'      ;SAYAC ADRESİ

   ORG      h'00'      ;Program kodlarının başlangıcı
   
   CLRF   PORTB      ;PortB'yi sıfırla
   BSF      STATUS,RP0
   CLRF   TRISB      ;PortB'nin tüm uçları çıkış
   BCF      STATUS,RP0
   
   MOVWF   d'1'
   MOVLW   SAYAC


BASLA

   MOVLW     d'1'     ; karşılaştırmak istenen sayı
   SUBWF     SAYAC,W
   BTFSC      STATUS,Z     ; Aritmetik işlem sonucu 0 mı
   GOTO     AAA

   MOVLW     d'2'     ; karşılaştırmak istenen sayı
   SUBWF     SAYAC,W
   BTFSC      STATUS,Z     ; Aritmetik işlem sonucu 0 mı , btfss de kullanılabilir
   GOTO     BBB



   GOTO   BASLA

AAA
   BSF   PORTB,1
   GOTO   BASLA


BBB
   BSF   PORTB,5
   GOTO   BASLA

   END

umitmura

yani desimal 1 ile desimal 1 i eşittir deyip portb,1 i yakmaya çalıştım :)

umitmura

MOVLW VE MOVWF i yanlış yazmışım çalıştı. teşekkürler

Tagli

GOTO tablosu kullanmak çok daha doğru bir yaklaşım olacaktır.
movf     deger,w
addwf     PCL,f
nop     ;deger = 0 olamayacağını kabul ettik. Ama olabilirdi de.
goto     AAA     ;deger = 1 ise AAA'ya git
goto     BBB     ;deger = 2 ise BBB'ye git
....

Gerçi tablo kullanırken dikkat edilmesi gereken bazı noktalar var. Forumda PCLATH konusunu araştırmanı öneririm. Yoksa garip sonuçlarla karşılaşabilirsin.
Gökçe Tağlıoğlu