iki pic'in I2C ile haberleşmesi

Başlatan mech, 11 Ekim 2010, 16:02:14

mech

Merhaba Sayın Arkadaşlar.

Aynı kart üzerinde birden çok picin birbiri ile haberleşmesini istiyorum. Kesme kullanmadan I2C'nin Busin ve Busout (hardware I2C kullanmadan) komutları ile bunu nasıl sağlarım. ISIS üzerinde bunu bir türlü yapamadım. Teşekkürler.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

mosfetman

yardımcı olayım ne için kullanacaksın

rakkoc

kesme kullanmadan yapmak istiyorsan surekli obur picten bir data geliyormu die kontrol etmen gerekir diye biliyorum ama bu konuda yeniyim yanlis yonlendirme yapmis olmiyim.I2C yerine UART daha mantikli geliyor bu is icin bana

mech

Uart ile, çakışma olmasından korkuyorum.
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

mufitsozen

korkunun ecele faydasi yok, :-)

hem bunlar otomobilmi cakisacak.

uart kullan problem cikarsa forumda bir suru tecrubeli insan var, hem problemini cozer, hemde kollektif  olarakyeni birseyler ogreniriz.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

pcb

UART dediğiniz, Protonda ki USART ise bu tür haberleşmeyi bende yeni öğrendim, şimdilik sadece 2 işlemci arasıda haberleşme çok iyi. Diğer hiçbir haberleşmeye benzemiyor. Anladığım kadarı ile data gönderen alıcının buffer kısmına datayı yazıyor alıcı buradan okuyor,  alıcı variable String olarak belirtilirse datalar toplanıyor kaybolması pekte mümkün değil. Üstelik alıcının Interrupt özelliği olması da  cabası.
Bilmem doğru öğrenmiş miyim ama farklı 2 işlemci data aktarımı doğru gerçekleşti.

Her işlemci de USART bulunmuyor buda işin kötü tarafı

mech

uart ile başarılı gibi görünüyor. Ancak dediğim gibi iki işlemci aynanda merkze bilgi gönderdiğinde çakışma oluyor yani dataların hareketi otomobillerden farksız. Herhalde trafik kurallarına uyan bir data yoktur. Peki bunu nasıl engelleriz. Bu durumda merkez pic kitleniyor, iletişim kuramaz oluyor. Teşekkürler...
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

mech

iki pic arasındaki hat mesafesi 5m iken gayet iyi çalışıyor.. Lakin, 9600baud oranı ile çalıştırdığım sistemi 19200 gibi bir hıza yükselttiğimde çakışmaların azaldığını ve iletişim kalitesinin de aynı oranda azaldığını gördüm. BRGH değerini 1 yaptığımda farklı hızlarda farklı SPBRG değerleri ile karşılaşıyoruz(Datasheetinde TXSTA reg.).
Bilginin Efendisi Olmak İçin Çalışmanın Kölesi Olmak Şarttır

XX_CİHAN_XX

#8
Alıntı yapılan: mech - 14 Ekim 2010, 18:40:16
uart ile başarılı gibi görünüyor. Ancak dediğim gibi iki işlemci aynanda merkze bilgi gönderdiğinde çakışma oluyor yani dataların hareketi otomobillerden farksız. Herhalde trafik kurallarına uyan bir data yoktur. Peki bunu nasıl engelleriz. Bu durumda merkez pic kitleniyor, iletişim kuramaz oluyor. Teşekkürler...
İki tane slave picin var ve bir tanede master (merkez) picin var.
Amacın Slave lerin master a bilgi göndermesini sağlamak doğru anlamışmıyım ?
Bu durumda trafik kurallarını Master picin belirlemesi gerek. I2C de ve diğer tüm haberleşme sistemlerinde olduğu gibi Birden fazla slave üniten varsa bunlara birer adres atamalısın. Örneğin veri gönderen piclerden bir tanesinin device adresi 0xC1, diğerinin ki de 0xC2 olsun. Bunlar kafasına göre veri göndermemelidir. Master pic bunlara izin verdiğinde verilerini göndermeye başlamalıdır. Master pic 0xC1 için yeşil ışık yaktığında 0xC2 olan pic bekleyecek. 0xC2 için yeşil ışık yaktığında ise diğer pic bekleyecek. Böylece çakışma sorunu ortadan kalkacak. Yeşil ışık yanana kadar her iki picte kırmızı ışıkta yani hattı sürekli dinleme modunda bekleyecekler.
Master Pic Usart Hattına önce 0xC1 datası gönderecek, bu datayı her iki aygıtta alacak kendi device adresi ile kıyaslayacak ve adresi seçilen aygıt kendi datalarını gönderecek. Bu dataları alan master pic ardından 0xC2 datasını hatta verecek. (Bu arada C1 data gönderirken C2 hala dinlemede ve C1 datalarını gönderdikten sonra da dinleme pozisyonuna geri dönecek.) Bu durumda 0xC2 aygıtı için yeşil ışık yanmış olacak.

Trafik ışıkları olmazsa, Trafik kazaları kaçınılmaz sondur :)
Master pic burada trafik ışığıdır :)
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

CLR

Alıntı yapılan: mech - 15 Ekim 2010, 19:03:38
iki pic arasındaki hat mesafesi 5m iken gayet iyi çalışıyor.. Lakin, 9600baud oranı ile çalıştırdığım sistemi 19200 gibi bir hıza yükselttiğimde çakışmaların azaldığını ve iletişim kalitesinin de aynı oranda azaldığını gördüm. BRGH değerini 1 yaptığımda farklı hızlarda farklı SPBRG değerleri ile karşılaşıyoruz(Datasheetinde TXSTA reg.).

Bu I2C haberleşmeyi 5m'lik hatta mı kullanacaksın? Ki öyleyse I2C, çok yakın mesafede kullanılır. Pull-up mantığı ile çalıştığı için hat empedansı, kapasitansı çok etkili olur yani 5m'de i2c kesinlikle kullanılmaz. Her byte'tan sonra ack okuması olduğu için kitlenmeye çok müsaitttir veya data kaybına. Free counter ile kitlenmenin önüne geçebilirsin ama
data kaybının geçemezsin.
5m için, rs232 de olur ama dediğin gibi düşük hızda çalışmalısın, Rs485 ve Can bus öneririm. Rs485'te data alındı doğrulaması yaparsan veya Can busta her alıcıya bir ID verirsen çakışma falan olmaz. 
Knowledge and Experience are Power

arges

Aynı kart üzerinde birden çok picin birbiri ile haberleşmesini istiyorsan hardware I2C kullanmalisin. yoksa  XX_CİHAN_XX nin anlattigi gibi
sadece bir PIC master olur, digerleri slave...
Hardware I2C kullanirsan  ancak o zaman slave den master e istek gonderebilirsin.
Bastan soyleyeyim de benim gibi haftalarca SW ile ugrasip sonra gececegine bastan HW tasarla...
Yok eger sadece master bilgi yollayacak, slave ler master e karismayacak diyorsan ister SW ister HW tasarla...
The whole is equal to the sum of parts(Euclid)... The whole is greater than the sum of its parts(Max Wertheimer)...

CLR

Alıntı yapılan: arges - 19 Ekim 2010, 01:34:50
Aynı kart üzerinde birden çok picin birbiri ile haberleşmesini istiyorsan hardware I2C kullanmalisin. yoksa  XX_CİHAN_XX nin anlattigi gibi
sadece bir PIC master olur, digerleri slave...
Hardware I2C kullanirsan  ancak o zaman slave den master e istek gonderebilirsin.
Bastan soyleyeyim de benim gibi haftalarca SW ile ugrasip sonra gececegine bastan HW tasarla...
Yok eger sadece master bilgi yollayacak, slave ler master e karismayacak diyorsan ister SW ister HW tasarla...


Tercih meselesi tabii, uzak mesafe için pull-up direnç değerlerini düşük değerde olursa ve I2C haberleşme hızını(clock frekansını) düşürürsen veya I2C reapeter / I2C buffer IC'leri kullanırsan haberleşilir ama herkes uzak mesafede haberleşmede hızlanmaya çalışırken, sizin tercihiniz yavaşlama yönünde olmuş olur.   
Knowledge and Experience are Power