== Assembly Yardım ==

Başlatan protech06, 28 Mayıs 2007, 16:22:59

protech06

Selam Arkadaşlar PIC16F877A kullanıyorum devremde Rc uclarına baglı 6 Led ve RA Uclarında 6 buton var . Devrenin calısması su sekilde Pic Enerji verildiginde Hafızadan led numarası okunacak ve ona karsılık gelen led yanacak  , yani devre calısır durumdaykende zaten butonlar test edilecek mesela RA3 butonuna basarsam 3 nolu led yanacak ve pic hafızasına 3 sayısı yazdırılacak devre enerjisini kesip geri verdigimde once hafızayı okudugu icinde 3 sayısını gorup 3 nolu ledi yakacak taki bu sayı degiştirilene kadar .. buton okuma ve hafızaye kaydetmede sorun yasamadım ama hafızayı okuduktan sonraki karsılastırma ve yonlendirmede bir turlu ayarlayamadım  hafızayı asagıdaki gibi okuyup hafızadaki sayıyı SAYI adlı degişkene atıyorum sonra yukarı donup bu  SAYI değişkenindeki numaraya göre  Eğer sayı

1 ise RC0
2 ise RC1
3 ise RC2
4 ise RC3
5 ise RC4
6 ise RC5   nolu ledin yanmasını istiyorum yani sayıya göre o ledi yakan rutine dallanıcak ve led yanık vaziyetteyken butonları test edecek yeni bir sayı girildimi diye.

*************************************************************

CALL                 HAFIZAOKU

;**********************************

; BU ALANDA SAYI DEGISKENINE GORE CIKISLAR VERILECEK

;**********************************
HAFIZAOKU
MOVLW      .1                  ;Sayı  eepromda 1 nolu ADRESte
MOVWF      MEMADRES
CALL      ALANOKU
MOVWF      SAYI             ; sayıyı SAYI  değişkenine attım          
RETURN

ALANOKU
BSF      STATUS,RP1
BCF      STATUS,RP0    
MOVWF      EEADR
BSF      STATUS,RP1
BSF      STATUS,RP0   
BCF      EECON1,EEPGD
BSF      EECON1,RD
BSF      STATUS,RP1
BCF      STATUS,RP0
MOVF      EEDATA,W
BCF      STATUS,RP1
BCF      STATUS,RP0
MOVWF      MEMDATA
RETURN

hafızayı okuyup geri dondugunde sayıya karsılık gelen ucu yakmasını nasıl karsılastırabılırım ? Sayıya gore kod alanına dallanılacak

mesmert

               MOVF        SAYI,0
	XORLW   	.1
	BTFSS   	STATUS,Z
	GOTO        LED_1
	BSF	PORTC,1
                GOTO        KONTROL_SON


LED_1
      	XORLW   	.2
	BTFSS   	STATUS,Z
	GOTO        KONTROL_SON
	BSF	PORTC,2

KONTROL_SON
                Burdan sonrası senin işin

protech06

Tşk. Hocam Asagıdaki Sekildemi Devam Edicek

Kod:

  MOVF        SAYI,W

  XORLW      .1
  BTFSS       STATUS,Z
  GOTO        LED_1
  BSF           PORTC,0
 
LED_1
  XORLW      .2
  BTFSS       STATUS,Z
  GOTO        LED_2
  BSF           PORTC,1

LED_2
  XORLW      .3
  BTFSS      STATUS,Z
  GOTO        LED_3
  BSF   PORTC,2

LED_3
  XORLW      .4
  BTFSS      STATUS,Z
  GOTO       LED_4
  BSF          PORTC,3

LED_4
  XORLW      .5
  BTFSS       STATUS,Z
  GOTO        LED_5
  BSF           PORTC,4

LED_5
  XORLW      .6
  BTFSS       STATUS,Z
  GOTO        LED_6
  BSF           PORTC,5

LED_6
  XORLW      .7
  BTFSS       STATUS,Z
  GOTO        LED_1
  BSF           PORTC,6

mesmert

aynen devam et ve ayrıca program biraz hızlandırmak içi program led iki işlemi gerçekleştiyse diğer rutinleri kontrol etmemsi için programın işlem yapacağı yere yönlendir.

protech06

Anladım hocam ilginize Tşk. Cok yardımcı oldu

elmaalma

RA0=RC0, RA1=RC1 ..... gibi karşılık geliyorsa PORTA oku eeproma kaydet.
Eepromda okunan değeride RC6 ve RC7 yi maskeleyecek şekilde PORTC ye aktar

Daha kısa ve kolay olur sanırım.

protech06

Arkadaslar W kayıtcısına bildigim kadrı ile  maksimum 255 sayısını aktarabılıyoruz  yani

MOVLW .255  
MOVWF SAYI

 Hafızaya yazarken ve degişkene yuklerken diyelimki 435 sayısını karsılaastıracam 8 bitlik değil bunu nasıl yukleyebilirim yani SAYI değişkeni içerisindeki sayı 435 se baska işlem yaptıracam 255 ten daha buyuk bir sayı bu sayı yukardaki sekilde kullanamıyorum..

  bilen arkadasların yardımlarını bekliyorum

alabora

0-255 mi yoksa 256-512 arasında mı diye test edeceğin bir test biti tanımlayabilirsin.

protech06

Evet o Sekilde Olur ama amac 000-255 arasındamı yoksa 256-435 arasındamı diye değil direk o sayıya işlem yaptırmak 435 sayısı 8 bitlik olmadıgından w kayıtcısına yukleyip karsılastırma yapamıyıorum karsılastırma işlemini nasıl yapabılırım

alabora

Ben de aslında onu anlatmaya çalışıyorum. Bu dediğini 8 bitlik W registerinde salt komut setiyle yapamazsın. Bi şekilde farklı bir algoritma türetmelisin. mesela forumda 16 bit işlemler ile ilgili mesajlara göz at istersen.

protech06

16 Bit  üzerine Örnekler Var Arkadaslar .


http://www.myke.com/16bit.htm#compare