F

EEPROM 'dan seri olarak bilgi gönderme

Başlatan faruk_zone, 28 Ocak 2012, 16:46:34

faruk_zone

kolay  gelsin arkadaşlar eeprom ile ilgili bir sorum olacaktı.

1-)16f877a kullanıyorum eeprom hafızasına word tipi değişken ile örneğin 3600 değerini yazdırdım

    data=3600
    write 0,data

2-)ete hocamızın notlarında bilgiyi 8 bit olarak kaydettirmelisiniz yazıyor,aslında 0 ve 1 nolu adreslere yazıldı diye tarif etmiş ete hocamız.

3-)ozaman 2 kısımda okutmamız gerekiyor

  read 0,data.lowbyte
  read 1,data.hıghbyte

4-)beni mazur görün hiçbir nane anlayamadım bu işten
      yani aslında 0 ve 1.nolu adreslere yazılıyor ise;
     a-)   ben diğer değişkenimi
            write 1,data2 olarak yazdırabilirmiyim.?yazdıramaz isem write 2,data2 yani adres 2'denmi başlamalıyım?
     b-)diğer sorum ise;
     
İf tus=0 then data=3600
write 0,data
            '
            '
            '
yukle:
       
  HSEROUT #DATA
         '
         '
         '

ben bu komut satırı örneğindeki gibi okuma yazdırma işlemi yaptırmak istiyorum
mantık yanlışmıdır? 3600 değerini 0.adrese kaydettirdim ve seri olarak gönderdim
ancak cihazı kapatıp açtığım zaman eeprom'a kayıtlı olan 3600 değerini read komutunu
kullanıpdamı seri olarak göndercem yani;
read 0,data
hserout #data

şimdiden sağolun.

Mucit23

#1
Normalde Write komutu 16 Btilik bir datayı iki parçaya bölüp eeproma yazar. Bu yüzden Write $0,data dediğiniz zaman eepromun 0 ve 1. adreslerine datayı yazmış olursunuz.
Okuma yaparken ise İki parça halinde okunmalıdır.
Read $0,Data.LowByte
Read $1,Data.HighByte

Buraya kadar tamam

Burada dikkat etmeniz gereken nokta eğer 16 bitlik data yazıyorsanız data eepromun hangi adresine yazılacaksa belirttiğiniz adresten sonraki adresinde kulanılmaması gerektiğidir
Dolayısıyla Write $0,data komutu 0. ve 1. adreslere datayı yazdığı için bundan sonra başka bir değişkeni yazmak isterseniz eepromun $2 nolu adresine datayı yazmalısınız. Okuma yaparkende eğer datanız 8 bitlikse sadece yazdığınız adresi, 16 bitlik ise belirttiğiniz adresi ve bir sonraki adresi iki parça halinde okumalısınız.

Pic çalıştığında datayı okuyup göndermek istiyorsanız yukarıda belirttiğim gibi aynı okuma protokolünü uygulamalısınız.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#2
İlk okul usulü anlatayım daha kolay anlarsınız herhalde.
Bir elinizde 8 adet gözü olan bir kutu var. Her göze 1 elma sığabiliyor ancak. Bu kutulardan bir sürü de yanınızda duruyor. İstediğiniz zaman alabiliyorsunuz. Diğer elinizde ise 16 adet elma var. Şimdi 16 adet elmayı bu 8 gözlü kutuya koymaya çalışın bakalım. Ne olur ancak 8 adedini koyarsınız. Ben koyayım (Write 0, DATA ve DATA 16 bitlik) ne olursa olsun bir şekilde onlar orada kalır derseniz havanızı alırsınız. Yalnızca 8 adedi oraya yerleşir diğerleri açıkta kalır.
Peki ne yapmak lazım. yanınızda bir kutu daha var müsait. (Sıradaki kutu yani) onu alırım ve kalanınıda oraya koyarım derseniz doğru bir iş yapmış olursunuz. Bu durumda önce sıfır numaralı kutuyu ardından da 1 nolu kutuyu kullanmış oldunuz. Peki elinizde başka elmalar var ise sıradaki boş kutu hangisi olacaktır tabiiki 2 numaralı kutu çünki sıfır ve 1 nolu kutuyu kullandınız sıradaki 2 nolu kutu olacaktır. Yine 16 adet elmanız var ise 8 adedini 2 nolu kutuya ve kalan 8 adedini ise 3 nolu kutuya koyup işi bitirirsiniz. Daha sonra yeniden alma kutulamak gerekiyor ise sıradaki kutu 4 nolu kutu olacaktır. Bu işde kutular hafızaları , kutuların gözleri bitleri elmalarda data bitlerini temsil etmektedir. Bu açıklamadan da bir şey anlamadı iseniz en başa dönüp sayı sistemlerini bit , byte , word tanımlamalarını sayı sistemlerini yeniden öğrenmeniz gerekiyor.

Son olarak peyece açıklandı ama bu kadar açıklamanın sonuna eklemekte fayda görüyorum.
Bit denilen şey ikili (binary) sayı sisteminde tek birimlik bir bilgidir. Değeri 1 veya 0 olabilir.
Bunun 8 adedi bir araya gelerek byte bilgisini oluşturur.  Her bir byte 8 bitlik bilgi içerir.
2 adet byte birleşerek (8+8) bir word bilgisini oluşturur. Dolayısıyla bir WORD değişkeni 2 adet Byte değişkeninden meydana gelir ve aynı zamanda 16 adet bit ihtiva eder.
Dolayısıyla yalnızca byte yazılabilen bir yere WORD yazamazsınız sığmaz çünki (8 elmalık yere 16 Elma sığdırmak gibi). O zaman bir word değişkeni kendisini oluşturan 2 adet byte değişkenine ayrılıp her biri bir hafızaya yazılarak 2 adet hafıza kullanılır. Böylece bir word değişkeni hafızada 2 adet yer kaplar.
Bir word değişkeni 2 adet byte değerine nasıl ayrılır. ? Kolay yolu onu HEX formatında yazıp 2 şer bitlik 2 parçaya ayırmaktır. Olmayan bitler yerine sıfır kullanılır. Örnek veriyorum. 600 sayısı bir word sayısıdır (8 bitden (veya 255 den)  büyük ise otomatikman word dür) 600 sayısının hex karılığı  $258 dir. bu aslında $0258 şeklinde yazılmalıdır. Bunu ikişer byte olarak ayrdığımız zaman $02 ve $58 sayılarını elde ederiz. İşte bu sayı hafızaya yazılırken $02 bir göze (kutuya) ve $58 diğer göze yazılır. Peki bu sayıları normal hesapla nasıl hesaplarız? Şöyle;
600/256 =2  bunun hex karşılığı $02 dir.
600-(2*256)=88  bunun hex karşılığı $58 dir.
Basic de bu işlemi otomatik yapan komut vardır. SAYI word değişkeni olsun.
SAYI=600 olsun
SAYI.Byte0 denildimi,  bu otomatikman 88 sayısına eşdeğer olacaktır
SAYI.Byte1 denildimi, buda otomatikman $02 veya desimal 2 sayısına eş değer olacaktır.
O halde hafızaya word değişkenlerini yazarken ve okurken bu avantajı kullanmamız gerekir.
Write 0,SAYI.Byte0
Write 1,SAYI.Byte1
Aynı şekilde
READ 0,SAYI.Byte0
Read 1,SAYI.Byte1  şeklinde bir okuma yaptığınız zaman otomatikman SAYI=600 olacaktır. Sİzin ayrıca bir işlem yapmanız gerekmeyecektir.

Umarım anlaşılmıştır bu konu artık.

Ete


faruk_zone

Mucit23 teşekkür ederim sağol anladım. ete hocam senle anlaşamıyorum ben frekanslar tutmuyo sorduklarımla cevabın arasında bir alaka kuramadım neyse yinede sağol.

faruk_zone

Bir sorum daha olucak ..
seri porttan örneğin 3.500 veya 1.0 biçiminde nasıl sayı göndericez ve bunu nasıl alıcaz
yani virgüllü sayı olunca nasıl kod yazcaz çözemedim

1-seri porttan şu biçimde alıcam ;
   3.500
bu sayıdaki nokta aynı yerde kalıcak yani 3.900 3.100 veya 1.630 gibi olucak bunu nasıl hserin yapıcam ?

Mucit23

bunun farklı yolları var ama en kolay yöntemi sayıyı büyütmek.
3,500 gibi bir sayın olsun. Bu sayıyı virgülden kurtarmak için sayıyı büyütmemiz gerekir. Ohalde sayımızı 1000 ile çarparsak 3500 sayısını elde ederiz. Karşı tarafa bu veriyi yollarız. Sonra karşı tarafta 3500 verisi geldikten sonra tekrar lazım olduğu yerde 1000'e bölerek 3,5 sayısını elde ederiz bunu iki parça halinde işlersin. Tabi çok kaba taslak söylüyorum. İşin mantığı böyledir anlaman için yani.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

faruk_zone

hocam mesela hyperterminalden ben 3.500 sayısını girdim bunu pic nasıl algılıyor burdan yapabilirmiyiz?

önce 3 sonra (.) sonra 5 sonra 0 sonra0
bunu pic'e gönderip daha sonra noktayı sayıyı yerleştirebilirmiyiz?

faruk_zone

birde hani önceki yorumlarda word'ü 2 byte olarak çevirme işlemini anlatmıştınız peki bunu byte'a yapabilirmiiiyiz yani 0000 1111 2 tane 4 lüğe çevirme işlemi?

ete

Bir byte bilgisini ikiye bölsen de her bir yine birer byte olacaktır. Unutma. İllaki bölmek istersen şöyle yaparsın.

SAYI=%1011 0110 olsun
BIR=(SAYI & %11110000)>>4   (BIR= SAYI & %11110000= %10110000 >>4 = %00001011 şeklinde elde edilir)
IKI=SAYI & %00001111             (IKI =SAYI & %00001111 = %00000110  şeklinde elde edilir)

Ete

faruk_zone

HAH tamamdır hocam wala oldu .cahillik zor yeminediyorum .sorular devam edecek :)

Powered by EzPortal