Assembly Programlama - Yardım?

Katılım
11 Ara 2011
Mesajlar
4
Puanları
1
Merhaba,
PIC16F84 assembly programlama ile ilgili problemim var.

A Portuna bağlı butonlarım var.3 tane
B Portunu çıkış olarak yapacağım.

Örneğin a0,a1,a2'ye
Sırayla 0,0,0 geldiğinde PORTB'deki 0 biti yakan programı yaptım.Giriş durumunu sürekli kontrol edecek.
Yine sırasıyla: 0,0,1 geldiğinde PortB'deki 1.biti yakacak.Ve diğer durumları...

Benim takıldığım nokta;
Assembly'de kodlar sırasıyla işletiliyor.
Eğer Buton 0,0,1 olduğu durumda ikinci programa geçsin.Mesala 0,1,0 olduğu durumda
üçüncü programa geçsin.Ve girişleri sürekli kontrol etsin.

Kısaca giriş durumları değiştiğinde ana program alt programlara yönlendirsin.
Umarım anlatmışımdır.
Teşekkürler

Yaptığım kadarı
LIST P=16F84


INCLUDE "P16F84.INC"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


;INCLUDE "P16F84.INC"
;__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC
;Kod koruma var : _CP_ON
;Kod koruma yok : _CP_OFF
;Power-on-reset var : _PWRTE_ON
;Power-on-reset yok : _PWRTE_OFF
;Watchdog timer devrede : _WDT_ON
;Watchdog timer devrede yok : _WDT_OFF
;RC Osilatör : _RC_OSC


CLRF PORTB
BSF STATUS,5
CLRF TRISB
MOVLW h'FF'
MOVWF TRISA
BCF STATUS,5


ANA_PROGRAM
TEST_PORT0
BTFSC PORTA,0
BTFSC PORTA,1
BTFSC PORTA,2
GOTO TEST_PORT0
BSF PORTB,0
CALL GECIKME
MOVLW h'00'
MOVWF PORTB
GOTO TEST_PORT1


TEST_PORT1
BTFSS PORTA,0
BTFSC PORTA,1
BTFSC PORTA,2
GOTO TEST_PORT1
BSF PORTB,1
CALL GECIKME
MOVLW h'00'
MOVWF PORTB


TEST_PORT2
BTFSC PORTA,0
BTFSS PORTA,1
BTFSC PORTA,2
GOTO TEST_PORT2
BSF PORTB,2
CALL GECIKME
MOVLW h'00'
MOVWF PORTB


GOTO ANA_PROGRAM


GECIKME
MOVLW D'99'
MOVWF 0X4D
MOVLW D'167'
MOVWF 0X4E
DECFSZ 0X4E
GOTO $-1
DECFSZ 0X4D
GOTO $-5
RETURN
END
 
Son düzenleme:
Merhaba
8 olasılık söz konusu olduğu için(000-001-010-011-100-101-110 ve 111)PORTA 'ya girecek bit şekli böyle olacaktır.Bu olasılıklar tek tek
TEST1
MOVLW H'00'; geçici registere H'00' yükle
XORWF PORTA; W değerini PORTA ile (exor) kontrol et
BTFSS STATUS,2; PORTA'nın değeri ile W değeri eşit değilse TEST2 ye git
GOTO----------(istenen eylem 1)
TEST2
MOVLW H'01'; geçici registere H'01' yükle
XORWF PORTA; W değerini PORTA ile (exor) kontrol et
BTFSS STATUS,2; PORTA'nın değeri ile W değeri eşit değilse TEST3 ye git
GOTO----------(istenen eylem 2)
bu şekilde PORTA'nın alacağı her olasılığı kontrol edip ona göre istenen eyleme yönlendirilir.
 
Belki başkasına da yararı olur.

LIST P=16F84


INCLUDE "P16F84.INC"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


;INCLUDE "P16F84.INC"
;__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC
;Kod koruma var : _CP_ON
;Kod koruma yok : _CP_OFF
;Power-on-reset var : _PWRTE_ON
;Power-on-reset yok : _PWRTE_OFF
;Watchdog timer devrede : _WDT_ON
;Watchdog timer devrede yok : _WDT_OFF
;RC Osilatör : _RC_OSC


CLRF PORTB
BSF STATUS,5
CLRF TRISB
MOVLW h'FF'
MOVWF TRISA
BCF STATUS,5


TEST0
CLRW
MOVLW H'00'; geçici registere H'00' yükle
XORWF PORTA; W değerini PORTA ile (exor) kontrol et
BTFSS STATUS,2; PORTA'nın değeri ile W değeri eşit değilse TEST1 ye git
GOTO TEST1
BSF PORTB,0
CALL GECIKME
MOVLW h'00'
MOVWF PORTB
TEST1
CLRW
MOVLW H'01'; geçici registere H'01' yükle
XORWF PORTA; W değerini PORTA ile (exor) kontrol et
BTFSS STATUS,2; PORTA'nın değeri ile W değeri eşit değilse TEST2 ye git
GOTO TEST2
BSF PORTB,1
CALL GECIKME
MOVLW h'00'
MOVWF PORTB
TEST2
CLRW
MOVLW h'02'
XORWF PORTA
BTFSS STATUS,2
GOTO TEST3
BSF PORTB,2
CALL GECIKME
MOVLW h'00'
MOVWF PORTB
TEST3
CLRW
MOVLW h'03'
XORWF PORTA
BTFSS STATUS,2
GOTO TEST4
BSF PORTB,3
CALL GECIKME
MOVLW h'00'
MOVWF PORTB
TEST4
CLRW
MOVLW h'04'
XORWF PORTA
BTFSS STATUS,2
GOTO TEST5
BSF PORTB,4
CALL GECIKME
MOVLW h'00'
MOVWF PORTB
TEST5
CLRW
MOVLW h'05'
XORWF PORTA
BTFSS STATUS,2
GOTO TEST6
BSF PORTB,5
CALL GECIKME
MOVLW h'00'
MOVWF PORTB
TEST6
CLRW
MOVLW h'06'
XORWF PORTA
BTFSS STATUS,2
GOTO TEST7
BSF PORTB,6
CALL GECIKME
MOVLW h'00'
MOVWF PORTB
TEST7
CLRW
MOVLW h'07'
XORWF PORTA
BTFSS STATUS,2
GOTO TEST0
BSF PORTB,7




GECIKME
MOVLW D'99'
MOVWF 0X4D
MOVLW D'167'
MOVWF 0X4E
DECFSZ 0X4E
GOTO $-1
DECFSZ 0X4D
GOTO $-5
RETURN
END
 
Merhaba
Çok ufak bir atrıntı,CLRW komutu çalışır fakat minicik bir yer işgal eder yazmasanız da çalışması lazım.Çünkü her seferinde zaten W'ya atama yapıyorsunuz silmenize gerek yok(CLRW) üstüne yazılacağı için otomatikman silinir.
 
Programa dallandırma konusunda ikinci bir alternatif program counter a veriyi ekleyerek satır atlamasını saglamak ve ordanda yonlendirme yapmak

movf sayı,w
addwf pc,f
goto 1.islem
goto 2.islem
goto 3.islem
...
 
PORTA ile XORLW işlemi yaptığınızda bu diğer pinleri de kapsar.. PORTA nın diğer pinlerini pull-down yapmanız ya da çıkış olarak ayarlamanız veya yazılımda and işleminden geçirmeniz mantıklı olacaktır..

Bu arada yazdığınız programda 1. butona basıldığında tüm progr*****lar çalışır.. İstediğiniz alttaki gibiyse bu sistemi kullanabilirsiniz.. PORTA dan tek okuma yapıldığından 2 işlemi ard arda yapma olasılığı da yoktur aynı zamanda..

MOVF PORTA, W
ANDLW b'00000111'

XORLW h'01'
BTFSS STATUS, Z
GOTO TEST1_SONU
---komutlar vs..
GOTO BASA_DÖN
TEST1_SONU

XORLW h'02'^h'01'
BTFSS STATUS, Z
GOTO TEST2_SONU
---komutlar vs..
GOTO BASA_DÖN
TEST2_SONU

XORLW h'04'^h'02'
BTFSS STATUS, Z
GOTO TEST3_SONU
---komutlar vs..
GOTO BASA_DÖN
TEST3_SONU

^ operatörü mplabda xor olarak geçer.. ^ işaretinin solundaki karşılaştırdığım değer, sağındaki ise W ile işleme sokulan bi önceki değer.. Şahsen ben bu tip şeylerde bunu kullanıyorum.. Anlaşılırlığı arttırıyor benim için..

Programa dallandırma konusunda ikinci bir alternatif program counter a veriyi ekleyerek satır atlamasını saglamak ve ordanda yonlendirme yapmak

movf sayı,w
addwf pc,f
goto 1.islem
goto 2.islem
goto 3.islem
...

Alarmko nun dediği de çok kullanılan etkili bir yöntem ama elinizde 3-4 işlem varsa ve acemiyseniz size büyük sorun yaratır. Bu komutları 256 komuttan uzun programlarda kullanmak için mutlaka başına ORG h'xx00' şeklinde ibare kullanıp, buradaki h'xx' adresini de PCLATH'a atamanız gerekir.. Eğer komutlar 256 lık iki bloğun arasına denk gelirse ve pclath ona göre ayarlanmamışsa yanlış yerlere sıçrama yapar program..

CLRW komutuna da değineyim.. :) 7 yıldır asm programlarım CLRW kullandığımı hatırlamıyorum.. :) Pdfye göre MOVLW h'00' dan tek farkı STATUS,Z yi sıfırlıyor olması.. :)
 

Forum istatistikleri

Konular
128,844
Mesajlar
920,936
Kullanıcılar
450,946
Son üye
colakemir26

Yeni konular

Geri
Üst