avatar_Mucit23

I2C Eeprom Veri yazma sorunu

Başlatan Mucit23, 15 Kasım 2011, 21:38:28

F®T

selamlar.
mucit 23 aslında harici eepromlarla çalışmak isteyenler için güzel bir uygulama.bu uygulama ile ilgili temel bir örnek  verebilirsen baya faydalı olur diye düşünüyorum.
iyi çalışmalar.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Mucit23

Çalışmalarımı toparlayıp bişeyler vermeye çalışırım. Videoda çekerim mutlaka
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

I2C eepromla yakında güzel bir program örneği vereceğim. Merak edilen bir konuydu.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

toys-23

Bizim içinde faydalı olur teşekkür ederiz..

F®T

istiklal marşını eeproma kaydedip çalmak güzel olucak.ama eeprom okuma hızı yetermi acaba.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Mucit23

Bu tür I2C eepromlarla olacağını pek sanmam. SD kart en uygunu.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

inventor

Bu tür hız gerektiren işler için paralel eepromlar tercih edilmeli bence. Benim bildiğim Atmel de bu eepromlardan var
Bu alet 70nS lik hızla çalışıyor. Daha önce 25 nS lik bir hafıza ile karşılaşmıştım. Adını bulabilirsem tekrar yazarım.

http://www.atmel.com/dyn/resources/prod_documents/doc0274.pdf
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

Mucit23

Arkadaşlar çalışmalarımı toparlayıp bu konu altında paylaştım. İnceleyebilirsiniz.
http://etepic.com/index.php?topic=185.new#new
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Alıntı yapılan: inventor - 21 Kasım 2011, 13:18:30
Bu tür hız gerektiren işler için paralel eepromlar tercih edilmeli bence. Benim bildiğim Atmel de bu eepromlardan var
Bu alet 70nS lik hızla çalışıyor. Daha önce 25 nS lik bir hafıza ile karşılaşmıştım. Adını bulabilirsem tekrar yazarım.

http://www.atmel.com/dyn/resources/prod_documents/doc0274.pdf

Paralel eepromlar sadece resim göstermek için kullanılabilir. Fakat Gömülü bir Sistemde kullanılacaksa Çok fazla I/O gerektirdiği için Gereksiz yere maliyeti arttırabilir. Ama 8 bitlik bir Datayı 8 clock palsinde almak yerine bir clok palsınde almak çok fark yaratır. Benim işime yaramıyor ayrı mesele. Bana yine Seri iletişimle haberleşebilecek I2C veya SPI çok daha yüksek hızlı bir eeprom lazım. gözümde 24AA512 veya 24AA1024 var. 20Mhz clock frekansında çalışabiliyor. Eğer Toplu farnell siparişleri olursa bende almayı düşünüyorum. Türkiyede hiçbiryerde rast gelmedi bu elemanlar..
Ben Birde SD kartı düşünüyorum. Hem hafızaları çok yüksek hemde SPI iletişimde yine çok hızlı çalışıyorlar. SD modunda bile kullanılabilir.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Merhabalar Ete Hocam.
Daha Önce Bu iş için Çeşitli eepromlar sipariş ettmiştim. Geleli epeyce oldular. Fakat vizeler, Finaller derken bir türlü başlayamadım. Sağ Salim Finalleri atlattık. Şimdi epeyce bi boş vaktim var. Bu işe tekrardan el atmak istiyorum.
Denemelerimi 25A512 üzerinde yapıcam.
25A512 3V ile çalışıyor. Bu yüzden eepromu bozmadan pic ile haberleştirebilmem için araya ek bir devre kurmak zorunda kaldım. Tam olarak aşağıdaki gibi

hosting images
Eepromun DO bacağından çıkan dataları 5 Volta yükseltmem için BSS138'li level şhifter devresi vardı. Ben  BSS138 bulamadım. Farklı bir bağlantı kullanrak 2N2221 kullandım. Fakat bu seferde çıkan datalar terslenmiş oluyor. Benim asıl problemim o değil. O konuya daha sonra değinecem. Benim iletişim konusunda bazı aklıma takılanlar var onları sormak danışmak istiyorum

eeprom seri olarak haberleşiyor. Haberleşme için min. 4 bacağa ihtiyaç duyuyor. Bunlar çipi aktif etmek için  CS, Seri clock girişi için SCK, Data girişi için DI ve Data çıkışı için DO bacakları var.
İlk başta veri yazma konusunu danışmak istiyorum.
Datasheedinde byte yazma konusunda şöyle bir resim var.

hosting images
Resimden anlaşılacağı üzere bir byte lık verinin yazılması  için 32 adet clock palsi gerekiyor..

Amacım bu işi çok hızı bir şekilde yapmak . Çünkü Resim datalarını eeproma yazmak 28 adet resim için nerden baksan 10Dk sürmüştü.
Bu işi yapabilmem için bi for döngüsü kurmalıyım. Bu konuda biraz algoritma desteğine ihtiyacım var.

32 adet bir döngümüz olsun ve bu döngü her döndüğünde clock girişi 1 ve 0 olsun. İlk 8 clock palsinde . 8 bitlik instruction bilgisini göndermeliyim. Sonra ki 16 clock palsinde adres bilgisi ve sonraki 8 clock palsindede data byte 'ını göndermeliyim. Bunu bi for döngüsü içinde nasıl işlevsel ve hızlı olarak yapabileceğimi bilmiyorum.  Bu konuda biraz desteğinize ve fikir olarak önerilerinize ihtiyacım var. Birtek siz değil başka arkadaşlardan da gelen fikir ve önerilere açığım.

Sorumun şöyle 32 adetlik bir döngüde sekme yaratmadan verileri ayrı ayrı gönderirim. For döngüsü yerine tüm işlemleri teker teker alt alta yazmak dahamı mantıklı olur bilmiyorum.

Bi önceki uygulamamda yani I2C eepromları kullandığım zamanda yaptığım işlem şuydu. Her seferinde hafızadan yeni bir resim datası okuyup gidip eeproma okuduğum datayı yazıyordum. Fakat daha önce hiç page write ve page read işlemini düşünmemiştim. Ben her seferinde veri yazarken Device adresini ve Eeprom adresini yeniden gönderiyordum. Bu  çok vakit kaybı oluyor haliyle ama benim adresim zaten düzgün bir artış halinde dolayısıyla page write yapabilirim. Ama düzenli bir clock palsi ve data çıkışı nasıl yapıcam bilmiyorum . Acaba sizce MSSP Donanımını mı kullanmalıyım.
  Bana bu konuda biraz yardımcı olursanız sevinirim gerçekten. Özellikle veri yazma byte yazma işini nasıl yapıcağım konusunda biraz önerilere ihtiyacım var.

Birde okuma işlemi var Ama bunu çözersem onuda yaparım diye yazmak istemedim gerekirse o konuyada deyinmek istiyorum.

Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Ben olsam şöyle yapardım.
24 bitlik baslangıç verisini verip peşine 255 byte yollardım. Dongulerimi bu formata uygun verirdim.
Bunun dısında uygulayacağın her yöntem sana vakit kaybettirir.
Ete

Mucit23

Hocam Page Writede bahsediyorsunuz sanırım. Aslında banada o daha mantıklı geliyor. Bana kalırsa Page write ile yazma yaparken her seferinde 1024 adet datayı ayrı bir buffere yerleştirip oradan sırasıyla eeproma yazarım.  Böylece herhangi bir kesinti olmaz. Okuma yaparkende aynı işlemi yapabilirim. Benim şuanda aklıma takılan yazma ve okuma yaparken nasıl bir protokol izleyeceğim. Yani bir yandan düzgün bir clock palsi çıkarıp bir yandanda değişken içeriğini sırasıyla nasıl çıkışa aktaracağım bana bunu anlatabilirmisiniz.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

mesela hocam birdeğişkenin herhangi bir bitini çıkışa herhangi bir çıkışa aktarmak için aiağıdaki gibi bir komut kullanabiliriz.
Port.pin=Değişken.0 gibi. Peki biz değişkenin hangi bitini çıkışa aktaracağımızı başka bir değişkenle belirlemek için nasıl bir yol izlemeliyim. Bu yöntem dizi değişkenlerde işe yarıyor.
Mesela bir örnek vereyim
DO adında bir çıkışımız ve KONT asında bir değişkenimiz olsun. SCK clock çıkışı Biz Bir değişkenin içeriğini sırasıyla clock palsi eşliğinde DO çıkışından çıkarmak istiyoruz. Ben datasheede bakarak mesela aşağıdaki gibi bişeyler yazdım. 1 Byte lık veriyi bu şekilde çıkışa aktardım.
  DO=KONT.7
  SCK=1:DelayUS 1:SCK=0
  DO=KONT.6
  SCK=1:DelayUS 1:SCK=0
  DO=KONT.5
  SCK=1:DelayUS 1:SCK=0
  DO=KONT.4
  SCK=1:DelayUS 1:SCK=0
  DO=KONT.3
  SCK=1:DelayUS 1:SCK=0
  DO=KONT.2
  SCK=1:DelayUS 1:SCK=0
  DO=KONT.1
  SCK=1:DelayUS 1:SCK=0
  DO=KONT.0
  SCK=1:DelayUS 1:SCK=0
Bunu Daha pratik nasıl yapabilirim. Ne gibi yöntemler kullanabilirim. İşte bilmeyip öğrenmek istediğim konular bunlar.
Ayrıca olabildiğince hızlı haberleşmek istiyorum 20Mhz kristal için 1 byte lık veriyi bu şekilde okumam ne kadar sürer.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Page write şimdiye kadar kullanmadığım bir metod. Lazım olmadığı için kullanmadım ama mantığı şöyle olması gerek. Benim söylediğim sisteme benzer şekilde;
- Önce kontrol byte ını
- sonra 16 bit adres 'i verir ve ardından
- FOR I=0 to 8192 'mesela 8K lık bir bilgi için bu döngüyü kurarasın)
- DTA=VERI[I]
- Pulsout clk,1
-next şeklinde bir döngü kurarasın olur biter. Burada pulsout süresi 10us dir ve daha az olamaz. Bu nedenle onuyn yerine denemek üzere
CLK=1
DTA=VERI[I]
CLK=0
şeklinde bir komut diziside kullanabilirsin. Çok gerekirse araya bir iki NOP (1us lik gecikme) yada PAUSEUS 2 gibi komut ekleyebilrsin.

Benim söylediğim sistemde her 255 byte da bir yeniden kontrol ve adres bilgisini vermek şeklinde idi. Bunun sebebi, I2C komutunu kullanarak bunu yapmak idi. Komutu kullanmadığın zaman clk ve data verilmesini işini kendin hallediyorsun . Sanki bunu yapınca da komut gecikmeleri zaten bu işi geciktirir gibime gelmiş idi. Denemek lazım sanırım.

Ete

Mucit23

#29
Anladım hocam. Aslında şunu yapabilsemsorun çözülecek gibi. Bir değişkenin içeriğindeki herhangi bir bitini Başka bir değişkenin değerine göre  seçip almaya çalışıyorum.
Mesela örnek vereyim
Bir döngümüz olsun.

For X=0 to 7
PORTB.0=VERI.X ;Verinin X inci Bitini Portb.0a ver. Bu komut basic kurallarına aykırı. Bu işi yapabileceğim alternatifler arıyorum
NEXT

Hocam yukarıdaki gibi bir iş yapma istiyorum. N kadar bir döngü kurup Bir değişkenin N inci bitini çekip almak istiyorum. ben burada takıldım.

Aslında şimdi Biraz baktımda Protonun Saple klasöründe Seri eepromları kullanılışına örnek bir program yazılmış. Shiftout komutu kullanılmış. Ben Clock Ve data sinyallerini takip etmek açısından ben kendim shiftout komutunun yaptığı işi yapmak istiyorum. Boşunamı uğraşıyorum yoksa.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal