==Assembly Sayı Atama Sorunu==

Başlatan protech06, 08 Haziran 2007, 12:54:22

protech06

Arkadaslar forumda daha öncede bu konu uzerine yazmıstım bu sorunu hala çözemedim assembly olarak yardımcı olabılırmısınız ?  
Pic Hafızasına değişken içerisindeki sabit  bir sayıyı kayıt yapabiliyorum mesela 210 sayısını her bir sayı ayrı bir adrese gelecek sekilde hafızaya kayıt yapıyorum yani
pic hafızasındaki
1. adrese = 2
2. adrese = 1
3. adrese = 0
bu sekilde kayıt yapıyorum.
sonra kullanıcam zaman bu adreslerden degeri tekrar okuyorum asagıdaki gibi ;

*************************************************************
HAFIZAOKU
MOVLW .1
MOVWF MEMADRES
CALL SEKTOROKU
MOVWF SAYI1

MOVLW .2
MOVWF MEMADRES
CALL SEKTOROKU
MOVWF SAYI2

MOVLW .3
MOVWF MEMADRES
CALL SEKTOROKU
MOVWF SAYI3
RETURN
SEKTOROKU
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
;***********************************************************
burada adreslerden sayıları okudum ve her okudugum sayıyı yine ayrı bir değişkene attım

SAYI1 = 2
SAYI2 = 1
SAYI3 = 0

okuduktan sonra bu sayıyı tekrar tek bir degişken icerisinde 210 olarak gormem gerekiyor yani bu 3 değişken icerisindeki sayıyı 210 haline tekrar nasıl getirebilirim ?
Mesela okuduktan sonra asagıdaki gibi tek bir sedişken icinde gormek istiyorum ama bir turlu çözemedim  

GENELSAYI = 210

SpeedyX

Aklıma ilk gelen;
SAYI3 ü sıfır olana kadar azalt ve bu sırada başka bir değişkeni 1 arttır, SAYI3 0 olduğunda SAYI2 yi bir azalt ve SAYI3 e 9 yükle, SAYI2 0 olduğunda SAYI1 i bir azalt ve SAYI2 ye 9 yükle, tabi bu azaltmalarda söz konusu değişken bir arttırılacak.. böylece 100*SAYI1+10*SAYI2+SAYI3 kadar döngüde kendi sayını bulursun.

protech06

Hocam değişken içerisindeki sayı sabit değil yani bu sayı degişebilecek 000 ile 999 arasında değişecek bu sayı onun iicn zorlanıyorum yani 255 ten buyuk bir sayı olabilme ihtimalide oldugu için   bunu bir kod ile acıklama imkanınız varmı hocam ?

SpeedyX

Eğer yanlış yoksa şöyle olabilir;

lx   movf   sayi1,f
     btfsc  status,z
     goto   gx
     incf   sonuc1,f
     btfsc  status,z
     incf   sonuc2,f
     decf   sayi1,f
     goto   lx
gx   movf   sayi2,f
     btfsc  status,z
     goto   fx
     movlw  09
     movwf  sayi1
     decf   sayi2,f
     incf   sonuc1,f
     btfsc  status,z
     incf   sonuc2,f
     goto   lx
     return
fx   movf   sayi3,f
     btfsc  status,z
     return
     decf   sayi3,f
     movlw  09
     movwf  sayi2
     incf   sonuc1,f
     btfsc  status,z
     incf   sonuc2,f
     goto   lx


burada sonuc1 ve sonuc2 değişkenin 255den büyük olan sayı. sayi1,2,3 ise eeprom dijitleri.

Kullanımı:
movlw .2
movwf sayi3
movlw .1
movwf sayi2
movlw .0
movwf sayi1
call lx


Denemedim.

protech06

Hocam deneme yapıcam hemen yalnız burda anlamadım ben şimdi sayıları hafızadan okudum elinde 3 ayrı degişken icinde sayı var bunları baska bir degişken icine nasıl aılacanı burda anlayamadım

  sayıları 3 ayrı adresten okuyup Genelsayı adlı bir deişkene atmam lazım sayı1,2,3 icindeki 2,1,0 sayılarını tek değişken içinde yani
Genelsayı=210 olarak gormem lazım  sayıları hafızaya yazmada ve okumada sorun yok sadece okuduktan sonra  baska bir tanımlanmıs değişken içerisine atamıyorum

SpeedyX

Alıntı yapılan: "SpeedyX"burada sonuc1 ve sonuc2 değişkenin 255den büyük olan sayı. sayi1,2,3 ise eeprom dijitleri.
Yani Genelsayı değişkenin ama değişkenler 8 bitlik olduğu için ve sen 255 ten büyük bir sayınında olası olduğunu söylediğin için sonuc1 ve sonuc2 şeklinde iki değişkende bu sayı saklanabiliyor.
Bunda anlaşılmayacak bir durum görmüyorum ben.

protech06

Hocam sizinde soylediginiz gibi

"Yani Genelsayı değişkenin ama değişkenler 8 bitlik olduğu için ve sen 255 ten büyük bir sayınında olası olduğunu söylediğin için sonuc1 ve sonuc2 şeklinde iki değişkende bu sayı saklanabiliyor. "

burda 2 değişken icerisinde saklanıyor ben bu sayıyı tek olan  "genelsayı"
adındaki değişkende gormem gerekiyorki karsılastırma yapcam yani  eger genel sayı ıcerisindeki sayı 600 ise sunu yap eger sayı 400 ise bunu yap yada eger genel sayı icerisindeki sayı 700 den buyuk ise sunu yap seklinde karsılastırmada kullanıcam burdaki sayıya göre programı farklı rutinlere dallandıracam

SpeedyX

Dostum eğer işlemcin 8 bitlik değişkenleri destekliyorsa bir değişkende 255 ten büyük sayı saklayamazsın, öyle bir sayıyı birden fazla değişkende saklaman lazım ve işlerde biraz zorlaşır. Karşılaştırmayıda 2 aşamada yaparsın.
İşlemcilerde malesef durum böyle.