Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Seriport + I2C sorunu

Başlatan gutaussehender, 11 Ekim 2011, 23:26:11

gutaussehender

merhaba arkadaslar

aklımda olan bir projede seriporttan sürekli data gelecek data baya bi fazla 200-300 byte gelen bu bilgileri pic ile alıp I2C 24c256 seri eproma kaydetmek istiyorum fakat kafama takılan bir nokta var.

seriporttan sürekli data gelirken gelen bilgileri aynı zamanda eproma nasıl kaydedegım.
mesela:
HBusIn kontrol,address,[Str veri\96]

seklınde 96 paket bılgıyı alıp ram e atıp ordan

For y=1 To 96
SHOut DTA , CLK , msbfirst , [ veri[y] ]
Next y
Return

seklınde mı kaydetmem gerek acaba?
yada her paketı alıp kaydedıp sonra dıger paketı mı almak lazım o zaman ıkıncı paketı kacırırım gibi geliyor.
birde I2C bekleme süreside var 5ms

sizce nasıl yapmak lazım? burada takıldım kaldım :)

izwirlee_35

kusura bakma c dilinde yazıcam ama yazdığımıda anlatayım biraz


if(RCIF)i2c_write_byte(seri_al());

yani eğer alım bayrağı bir ise aldığım 8 bitlik veriyi anında eeproma yaz böylelikle paket sayılarıyla da uğraşmaszsın diye düşünüyorum.

Ustalar yanlışım varsa düzeltin bende öğrenmek isterim.
keep learning . . .

yamak

#2
Eğer seri porttan gelen verinin hızı çok fazla ise siz i2c ile eeproma yazana kadar bir başka veri gelir ve o esnada işlemci eeprom a yazmakla meşgul olduğu için o veriyi kaybedersiniz eğer mümkünse seri porttan gele verinin baud hızını düşük tutun sonra bi seri port kesmesi oluşturup kesme içinde gelen veriyi eeproma yazın.mesela  gelen veririnin hızını 9600 olduğunu varsayalım 9600/8=1200 byte yani saniyede 1200 byte eder buradan da 1 byte lık veri 1/1200 sn yani 833 us saniye eder. Siz 5ms saniyelik bekleme süresi olduğunu söylemiştiniz bu süre içinde yaklaşık 6 byte lık veri kaybı olur. Ben 9600 baud hızında olduğunu varsayarak konuştum. Yani illa kayıp olacak diye bişey yok.Ama eğer durum yukarıda anlattığım gibi istediğiniz şeyi bu şekilde gerçekleştiremezsiniz.Yani kullandığınız eeprom a anlık olarak yazamazsınız.

Kabil ATICI

Kayıt hızı yetmeyen sistemlerde genellikle RAM tampon kullanılması gerekiyor.Eğer  seri eeprom kayıt hızını yeterli bulmazsan paralel  eeprom kullanımı RAM ile kullanımı önerilir.
ambar7

gutaussehender

aslında seri port hızım o kadar da önemlı degıl serıport hızımı 1200e filan dusurebılırım
1200 kabul  etsek 1/1200kbit=833uSn her bır bıtın gelme süresi sanırım.
ben i2c yı max hızda 400kbit hızında çalıştırırsam eger oda sanırım 1/400000=2,5usn sanırım bu deger de bır bıt ıcınse 8bıt bır byte ıcın gececek olan zamanım 20usn.
daha önce İ2c kullanmadım kullanan arkadaslar elbette vardır. acaba 20usn de i2c ye bır byte verıyı yazmam mumkunmdur yanlışım yoksa.
iş böyle olunca da serıporttan dıger gelecek olan 1 byte verıde 6,664ms sürecek o zaman i2c bekleme süres 5msnyi de doldurmuş olacaz gibime geliyor.

CLR

Çok rahat yapılır fakat şöyle bir sorunun var. Sen her gelen veriyi eeprom'a yazdırıyorsun, hesaplamadım ama çok kısa bir süre sonra eeprom'un dolar. Bu birincisi, diğer durum ise bir kaç ayda da eeprom'un yazma ömrünü bitirsin. 

Sorunun cevabına gelince:
Rs232 baudrate hızına ve eeprom sayfa yazma süresine göre 5-6 tane 32byte'lık(24c256 page byte sayısı) buffer aç. Rs232'den interruptla gelen verileri 32'şer byte'lık boş olan ram'e sırasıyla yerleştir, sonra bu buffer'lardan dolanı sırasıyla (32byte'ı) eeprom'a bir seferde i2c interrupt kullanarak yaz. Bu esnada rs232'den verileri diğer bufferlara yazacaksın. Eeprom yazma süresini timer interrupt ile ayarla, timer interrupt'a girdiğinde sıradaki buffer'ı eeprom'a yaz.
Yani 3 tane interrupt kullanarak rahatça yapabilirsin. DMA'sı olan işlemcin olsaydı, çok daha rahat yapardın.


   
Knowledge and Experience are Power

yamak

Hocam merak ettim de eğer dma kullanılsaydı. i2c datalarına mı erişirdik yoksa uart mı.Bana i2c daha mantıklı geliyo da.Dma hiç kullanmadığım için ve dma kullanımını merak ettiğim için sordum

iyildirim

Alıntı yapılan: yamak - 13 Ekim 2011, 12:35:19
Hocam merak ettim de eğer dma kullanılsaydı. i2c datalarına mı erişirdik yoksa uart mı.Bana i2c daha mantıklı geliyo da.Dma hiç kullanmadığım için ve dma kullanımını merak ettiğim için sordum

DMA modülü hem UART hemde I2C'yi destekliyorsa her ikisi içinde kullanılabilir.
9600 uart hızından dolayı 400kHz lik I2C, uartdan gelecek veriyi beklemek zorunda olduğundan,  UART için olan DMA kanalında her 32byte DMA ile alındıktan sonra kesme oluşturulan DMA kesmesi içerisinde I2C için DMA ile gönderilecek 32 byte ın başlangıç adresi adresi set edilip 32 byte gönder denilebilir. 

Aynı bellek bölgesini aynı anda iki ayrı kanal kullandığında bazen sorun olabiliyor. Bundan dolayı bir çift 32 byte lık buffer kullanmak (double buffer) burada hem gerekli hemde yeterli olur .

Gelen verileri anında incelemeniz gereken durumlarda alım için DMA kullanmak bazen çokda anlamlı olmuyor. Ancak boyu belli bir veriyi göndermek için kullanıldığında DMA ciddi bir performans artışı sağlıyor.

CLR

Alıntı yapılan: yamak - 13 Ekim 2011, 12:35:19
Hocam merak ettim de eğer dma kullanılsaydı. i2c datalarına mı erişirdik yoksa uart mı.Bana i2c daha mantıklı geliyo da.Dma hiç kullanmadığım için ve dma kullanımını merak ettiğim için sordum

Uzun data transferleri için dma birebirdir. DMA varsa bir işlemcide genellikle tüm modülleri destekler. Usart,I2C,SPI data alıp gönderirken kullanılabilir. 32bytelık veri için 32byte alıncaya veya gönderilinceye kadar işlemciyi meşgul etmez. Böylece işlemci başka işlerini halleder.
Knowledge and Experience are Power

yamak

Tamam hocam teşekkür ederim.

gutaussehender

kaç gündür netimde problem vardı giremedim.
eemkutay hocam
bı arkadas kayan yazı yapmıs kaynak kodlarını ınceledım 24c256 eproma bı seferde 256 byte verı yazmıs. sordum ona evet yazarsın  hatta 256 degıl sınırsız yazarsın  hafızan dolana kadar sorun çıkmaz dedi. ???

gutaussehender

Alıntı yapılan: ambar7 - 12 Ekim 2011, 11:42:14
Kayıt hızı yetmeyen sistemlerde genellikle RAM tampon kullanılması gerekiyor.Eğer  seri eeprom kayıt hızını yeterli bulmazsan paralel  eeprom kullanımı RAM ile kullanımı önerilir.
sayın ambar7 hocam
sanırım serı eprom hızım yetersız kalacak bugün hesap ettim de seri eprom okuma hızım çok çok yavaş bu yavaşlık tüm sistemi kilitler.
onun için paralel eerpom kullanmaya karar verdim şöyle bir baktım 28c256 işimi görür gibi sonra gözüm 28f010 ve 28f020 ye takıldı.
sonunda 28f10 yada 20 kullanmaya karar verdim. daha önce devremde bır 2-3 tane serı eprom kullanmyaı dusunuyordum sanırım 28f020 işimi görecek.

yalnız paralel eeprom daha daha önce hiç kullanmadım umarım üstesinden gelirim :)