Proton harici EEPROM kullanma ile ilgili sorularım.

Başlatan M.A.A, 20 Nisan 2015, 12:10:17

M.A.A

Merhaba Arkadaşlar.

At24C512 eeprom kullanmayı düşünüyorum.

1) 512K (65,536x8) = Bunun anlamı 65536 adet adres var , bu adreslerin her biri 0-255 arasında değer saklayabilir demek mi ?

A1 ve A2 yi GND ye bağladım.  1 0 1 0 0 A1 A2 R/W olduğu için okurken 10100001 (A1), yazarken 10100000 (A0) kullanmam gerekiyor.

2) 0. adrese yazmak için
I2COut SDA,SCL,$A0,$00,$00,[$B0] yazıyorum, kabul etmiyor, derleyici hata veriyor.

I2COut SDA,SCL,$A0,$0000,[$B0]   yazyorum kabul ediyor.
I2CIn SDA,SCL,$A1,$0000,[DEGER]  bu şekilde okuyorum, değeri 255 gösteriyor.

I2COut SDA,SCL,$A0,$0100,[$B0]  bu şekilde yazıp
I2CIn SDA,SCL,$A1,$0100,[DEGER]  bu şekilde okursam DEGER = B0 oluyor.

Belli bir adres değerinden sonra çalışmasının nedeni nedir ?

Şimdiden teşekkür ederim






ete

Data sheet'e bakılırsa adres değeri 16 bit olmalı. Bu nedenle YER simli bir word değişkeni tanımla. Bu senein hafıza adresin olacaktır. Örneğin YER=10 ver , Yazma emri verirken,
I2COut SDA,SCL,$A0,YER.Byte1,YER.Byte0,[$B0]
okurkende benzer şekilde,
I2CIn SDA,SCL,$A0,YER.Byte1,YER.Byte0,[DEGER]
şeklinde oku. Device adresi A0-A1 gibi değiştirmene gerek yok. Sen hep $A0 kullan derleyici kendisi ne yapılacağını ayarlar.

Ete

M.A.A

Biraz önce denedim.

I2COut SDA,SCL,$A0,YER.Byte1,YER.Byte0,[$B0]    şekildinde kabul etmiyor. Hata veriyor.

I2COut SDA,SCL,$A0,YER,[$B0]  şeklinde kabul ediyor. (Protonun kullanım kılavuzunda da bu şekilde)

Dim Var1 as Byte ' We'll only read 8-bits
Dim Address as Word ' 16-bit address required
Symbol Control %10100001 ' Target an eeprom
Symbol SDA = PORTC.3 ' Alias the SDA (Data) line
Symbol SCL = PORTC.4 ' Alias the SSL (Clock) line
Address = 20 ' Read the value at address 20
I2Cin SDA, SCL, Control, Address, [Var1] ' Read the byte from the eeprom

Ama çalışırken YER=256 yazarsam çalışıyor, YER=20, YER=255, YER=32000 yapınca çalışmıyor.


NOT : Isis ile deniyorum

ete

Bende simulasyonda denedim şimdi.
Her iki komut da PBP da çalışıyor yani,
I2CWRITE DTA, CLK, kont,ADR,[YAZILAN]
ile yazarsam
I2CREAD DTA,CLK,kont,ADR,[OKUNAN] ile yada
I2CREAD DTA,CLK,kont,ADR.BYTE1,ADR.BYTE0,[OKUNAN] ile aynı değerleri okuyabiliyorum.
Önemli olan tek şey ADR değişkeninin 16 bitlik olması buradaki trick budur.

Ete

M.A.A

Çok teşekkür ederim hocam.

1) 512K (65,536x8) = Bunun anlamı 65536 adet adres var , bu adreslerin her biri 0-255 arasında değer saklayabilir demek mi ?

Eğer böyle ise AT24C512 nin datasheet inde adresleme kısmı neden 15 bit görünüyor.



ete

512Kbit demek 512 x 1024=524.288 bit demek oluyor Bunuda 8 bite bölersek 524288/8=65535 adet byte hafıza demek oluyorki her bir adrese 0-255 arası sayı yazabilirsin demektir.

Ete

M.A.A

Alıntı yapılan: ete - 20 Nisan 2015, 15:01:56
512Kbit demek 512 x 1024=524.288 bit demek oluyor Bunuda 8 bite bölersek 524288/8=65535 adet byte hafıza demek oluyorki her bir adrese 0-255 arası sayı yazabilirsin demektir.

Ete

Teşekkür ederim hocam

ramazan5016

kusura bakmayın konuyla alakalı değil. ben siteye yeni üye oldum bir sorum için yeni konu açacam ama nerden açacağımı bilmiyorum.yardımcı olursanız çok sevinirim.

ete

tamamen yeni bir konu başlığını üyeler açamaz. Bu nedenle açacağınız konunun mevcut konularla ilişkisine bakıp birisini seçin ve altına mesaj (yanıtla ile) yazın.

Ete

ramazan5016

ete hocam verdiğin bilgi için teşekür ederim.Konu başlığıyla alakalı konu bulamadım.Konuyu buraya açmayı uygun gördüm.Hocam benim sorunum şu şimdi bende 3 km lik rf alıcı verici kumanda sistemi var.Alıcı kumandaya sadece servo motor takılıyor.Benim yapmak istediğim servo motor sinyalini pice sürmek ve komut haline çevirmek.picten sinyal üretmeyi gördük Pice sinyal sürmeyi görmedik.Elektronikle ilgilenen kişilere sorduğumda bu çok zor denilidi.Bununla ilgili kaynaklarda yok.Sistem hep picten sinyal üretmeyi gösteriyor.Hocam ben bu servo giriş sinyalini nasıl işleyecem .Yardımcı olursanız çok sevinirim.İyi günler dilerim

ete

Çok kolay. Alıcı çıkoşını bir skop ile inceleyeceksin. Hangi komut da nasıl sinyal geliyor her birinibir yerlere kayıt edeceksin. Sonra nadıl çözeceğimizi tartışacağız. Tabiiki sen çözemezisen.
Ortada ne sinyal var ne sinyalin şekli var sanal olarak konuşmak yersiz değilmi.

Ete

ramazan5016

hocam aslında sinyali osiloskopla inceledim.Sinyal voltajı 3.3 volt, verici kumandadaki butonu ileri ittiğimde 2 milisaniye bir, 18 milisaniye sıfır, oluyor ve bu sürekli tekrarlıyor.Butonu geri ittiğimde 1 milisaniye bir 19 milisaniye sıfır oluyor sürekli olarak bu tekrarlanıyor.Yani sinyal bildiğimiz servo giriş sinyali.Benim yapmak istediğim butonu ileri yittiğimde pic çıkışında bir , butonu geri ittiğimde ise pic çıkışından sıfır alacam.Kime sorduysam zor deniliyor.Hocam yardımcı olursanız gerçekten çok sevinirim.Bununla ilgili kaynakta bulamadım.İyi günler dilerim .

ete

Bu tür kumandalar genelde model uçak ve helikopter veya kayık kumandalarında kullanılıyor. İşin temeli her bir komutun belirli puls genişliği var. Anladığım kadarı ile işin temeli tamamen RCServo Motor sürme teknolojisi ile aynı.
Servo sürmede 0,5ms ile 2 ms aralığında puls üretmek ve bunu her 20 ms de bir yapmak gerekir. Bu Radyo Konyrol sisteminde de benzer şekilde her bir komutun belirli bir sinyal genişliği var ve bu genişliğe göre sistem komut algılaması yapıyor.
Bir model arabanın kontrolünü bu şekilde yaptığımız varsayarsak;
0,5ms lik puls genişliği yolladığım zaman araç sola dönecek, 1 ms puls genişliği yolladığım zaman araç düz gidecek 1,5ms pul genişliği yolladığım zaman araç sağa dönecek 2 ms puls genişliği yolladığım zaman ise araç geri gelecek şekilde bir düzenleme yapmak mümkün olur.
Çok aradım ama bu işte kullanılan puls genişlikleri standartlarını bulamadım. Üreticilere göre değişine bir şey olsa gerek. Anlaşılan belirli bir standart yok.
Gelelim bu sistemi nasıl kullanacağımıza, elimzde bir RC vericisi var ve üzerindeki Joytick kollarının ileri geri sağa sola ittirilmesi ile alet farklı puls genişliklerini RF olarak yolluyor diyelim.
Birde alıcımız var ve bu alıcı gelen sinyali değerlendirip çıkışından puls'i çıkartıyor.
BU çıkan sinyali bir pic pinine girerek gelen puls sürelerini ölçmek mümkün. Böylece her bir farklı süre için işlemcide farklı işleri yapacak şekilde bir program yazılabilir. Böylece istenilen kontrol imkanı sağlanmış olur.

Ete

ramazan5016

Öncelikle ilgilendiğiniz için çok teşekür ederim hocam.Cevabınızda pic e puls sinyalini sürülebileceğinizi söymeşsiniz.Hocam bende pic kitapları var.İnternettende baktım nasıl sürüleceğini bulamadım.Bildiğiniz bir kaynak felan var mı hocam yani tam olarak nasıl sürecem.

ete

Sinyal sürelerini ölçtüğün ucu direk Pic pinine bağlayacaksın. tercihan kesme özelliği olan PORTB.0 pinine bağlaman en doğrusu.
Bazı piclerde bu pine INT pini deniliyor. Bu arada buradan geşen sinyalin seviyesi hç bir zaman 5V tu geçmemesi gerekir aksi halde pic bozulur. Ama sanırım 3,3V civarında bir puls çıkıyor dolayısıyla zarar vermez.

Kitaplardan öğrenmen gereken şey şu , puls genişliği nasıl ölçülür. TMR0 veya TMR1 bu amaçla nasıl kullanılır.
Basic da PULSIN diye bir komut var aslında PULSIN Pin,Konum,Değişken şeklinde kullanılıyor.
Pin denilen şey puls sinyalinin girdiği Pic pini,
Konum hangi lojik seviyenin ölçüleceği HIGH ölçülecek ise KOnum yerine 1 , LOW ölçülecek ise 0 yazılacaktır.
Değişken ise programınbaşında tanımlanan WORD tipi bir değişken olmasında yarar var. Mesela SURE gibi.
PULSIN PORTB.0,1,SURE  şeklinde kullanılır ise 4 Mhz kristal frekansında süre 10'un katları şeklinde ölçülür (her 10us lik süre 1 sayılır).
Başka şey aramaya gerek yok PULSIN komutu ile he rişini görebilirsin.
PULSIN PORTB.0,1,SURE
IF SURE=50 (yani 500us) then git şunu yap
IF SURE=100 (Yani 1000us) git şunu yap gibi komutlar vererek gelen sinyale göre işlem yaptırabilirsin.

Ete

Powered by EzPortal