Proton+ Usart ile çok sayıda pic aynı hattan nasıl haberleşecek ?

Başlatan gtekdemir, 16 Ekim 2011, 22:56:43

rree

Seri haberleşme önemli.  Usart birimi 8 bit olması   doğrudan donanımsal hebeleşmede yetersiz kalıyor.
Pic bir işle meşgul durumda iken 8 bit seri verii donanımsal bilgi  alabiliyor. Usart birimi 32 bit olsaydı 16 biti adres 16 biti data düşünüp bir çok picle rahat haberleşebilirdi.Sekiz bit olmasından dolayı  bilgileri  byte byte göndermeli her bir byte te cevap beklemeli.Bu durumda bir iletişim protokolüne ihtiyaç var.  Ben kendim bir iletişim protokulu yazmaya çalışıorum.Hazır bir protokol var ise boşuna uğraşmayayım bilen arkadaş var ise paylaşılsın. Daha önceden ard arda 4 byte gönderiyordum. Karşıdan cevap bekliyordum. Bilgiler çoğu zaman kayıplara neden oluyordu  çakışmalar ile karşılaşıyordum.İletişim protokülündeki amaç iletişimdeki dataları garantilemek.Birinci byte tasarım 1XXX XXXX   7. bit   Adresi temsil ediyor geriye 7bit kalıyor. 2^7=128 adet pici
adresleebilirim. 1000 0000  adres  Master olan picin adresi. 1000 0001 adresi ise 1.pic. 1111 1111 adres ise
yayın adresi tüm slove picler tarafından alınacak. ikinci byte 0000 DDDD  1. Datanın düşük 4 biti
0001DDDD 1.datanın yüksek 4 bitini değeri gibi düşünüyorum....... 0100YYYY 1.Datanın düşük 4 biti Slove pic yanıt bilgisi. Daha bir çok ayrıntı işin içine giriyor. TCP nasıl yazdılar??

OG

invert noninvert hatası yapmışım editledim.

Alıntı YapMaster ve slave modüller TTL değil MAX232 ile RS232 seviyesinde haberleşecekler.
Sonuçta PIC'e giris cikis yaparken illaki TTL seviyesine dönecek. Ayrıca RS232 hat üzerine paralel yükleme yapamazsın, RS485 kullanman gerekir.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

gtekdemir

Alıntı yapılan: OG - 18 Ekim 2011, 15:54:15
invert noninvert hatası yapmışım editledim.
Sonuçta PIC'e giris cikis yaparken illaki TTL seviyesine dönecek. Ayrıca RS232 hat üzerine paralel yükleme yapamazsın, RS485 kullanman gerekir.

Dediğiniz gibi RS232 ile çok sayıdaki cihazı haberleştirmek mümkün değilmiş, PCB tasarımını değiştirip MAX485 kullanacağım. Aklımdaki haberleşmeyi nasıl yapacağım sorularına cevap bulmaya başladım. Hafta sonu birkaç deneme yapacağım, neticeyi buradan paylaşırım.

 

Maxim

Alıntı yapılan: rree - 18 Ekim 2011, 15:49:18
Seri haberleşme önemli.  Usart birimi 8 bit olması   doğrudan donanımsal hebeleşmede yetersiz kalıyor.
Pic bir işle meşgul durumda iken 8 bit seri verii donanımsal bilgi  alabiliyor. Usart birimi 32 bit olsaydı 16 biti adres 16 biti data düşünüp bir çok picle rahat haberleşebilirdi.Sekiz bit olmasından dolayı  bilgileri  byte byte göndermeli her bir byte te cevap beklemeli.Bu durumda bir iletişim protokolüne ihtiyaç var.  Ben kendim bir iletişim protokulu yazmaya çalışıorum.Hazır bir protokol var ise boşuna uğraşmayayım bilen arkadaş var ise paylaşılsın. Daha önceden ard arda 4 byte gönderiyordum. Karşıdan cevap bekliyordum. Bilgiler çoğu zaman kayıplara neden oluyordu  çakışmalar ile karşılaşıyordum.İletişim protokülündeki amaç iletişimdeki dataları garantilemek.Birinci byte tasarım 1XXX XXXX   7. bit   Adresi temsil ediyor geriye 7bit kalıyor. 2^7=128 adet pici
adresleebilirim. 1000 0000  adres  Master olan picin adresi. 1000 0001 adresi ise 1.pic. 1111 1111 adres ise
yayın adresi tüm slove picler tarafından alınacak. ikinci byte 0000 DDDD  1. Datanın düşük 4 biti
0001DDDD 1.datanın yüksek 4 bitini değeri gibi düşünüyorum....... 0100YYYY 1.Datanın düşük 4 biti Slove pic yanıt bilgisi. Daha bir çok ayrıntı işin içine giriyor. TCP nasıl yazdılar??

TX9 9.bit transmit enable biti diye birşey var, buna baktınızmı ?
birde EUSART çıkışlı olan piclerde daha fazla detay özellik var

gtekdemir

18F452 datasheet' inde şöyle diyor;
16.2.3 SETTING UP 9-BIT MODE WITH ADDRESS DETECT
This mode would typically be used in RS-485 systems. To set up an Asynchronous Reception with Address.

Eğer daha önceden bu şekilde haberleşme yapan olduysa tecrübelerinden yararlanmak isterim. http://www.protonbasic.co.uk sitesinde araştırma yaptım ama konuyla ilgili pek birşey bulamadım.








OG

Alıntı YapThis mode would typically be used in RS-485 systems. To set up an Asynchronous Reception with Address.
RS485 ile ne ilgisi var anlamadım.

9. bit ile TX/RX kontrolu mu yapıyor acaba?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

iyildirim

Alıntı yapılan: OG - 30 Ekim 2011, 03:39:45
RS485 ile ne ilgisi var anlamadım.

9. bit ile TX/RX kontrolu mu yapıyor acaba?

USART Modülü 8 veya 9 bit iletişim yapabiliyor.

9 bit iletişim seçilince 9. bit değeri bu registere yazılıyor.  9. bit data veya parity veya adres biti olarak kullanılabiliyor.

18f452 de de Modülün hardware parity desteği yok. Parity olarak kullanılırken soft olarak hesaplanıp bu bite yazılması gerekiyor. 

Adresli kullanım için de; (Bu konudaki bilgim daha çok dsPIC lerden. PIC18 üzerine pek bilgim yok. Ufak tefek değişiklikler dışında benzerdir diye düşünüyorum.)
Master veriyi hangi slave 'e göndermek istiyorsa 9.biti set ederek adres verisini gönderiyor. ADDEN biti set edilmiş olarak beklemekte olan slave'ler 9.bit set olduğu için gelen verinin adres verisi olduğunu anlayıp,  soft olarak değerlendirip verinin ona gelip gelmediğine karar veriyor.  Adresi uyan slave ADDEN bitini reset ediyor.

Master adres verisinden sonra 9.bit reset edilmiş olarak göndermek istediği veriyi yolluyor. ADDEN biti reset edilmiş olan slave gelen veriyi alabiliyor.
ADDEN biti set edili slave lerde gelen veri dikkate alınmıyor, çıkış bufferına gönderilmiyor, kesme oluşmuyor..

Master işi bitince konuştuğu slave'e bir şekilde senle işim bitti dediğinde slave de ADDEN biti set edilip beklemeye başlıyor.

Kısacası adresli kullanım için 9.bit iletişim gerekiyor. Veride ki 9.bit ile ADDEN biti and operatörü ile maskeleniyor.   

ADDEN biti set edildiğinde gelen verinin (Adres bilgisi) de 9.bitinin set edilmiş olması gerekiyor. Yoksa gelen veri slave de dikkate alınmıyor.  Böylece başkalarının konuşması slave de işi kesmemiş oluyor.
9. biti reset edili olarak gelen veriyi alabilmek içinde ADDEN bitinin reset edilmiş olması gerekiyor. ADDEN biti reset olduğunda ise master ın söylediği herşey duyulabiliyor.


Bu şekilde mesafe de 20 cm civarındaysa herhangi bir çevirici chip vs. kullanmadan TTL seviyesinde slave'ler ile master'ın haberleşmesini sağlamak mümkün. Tüm slave leri  paralel bağladıktan sonra çaprazlayıp hattı master a girmeniz yeterli olur.

Ancak wifi modül ile 9 bit haberleşme olanağı olmaz sanırım. 
Bundan dolayı master için 2 adet USART modül barındıran bir chip seçmek daha rahat bir çalışma olanağı sağlar. Eğer tek USART lı bir işlemci kullanılmak zorunda ise wifi modül ile master ve slave ler ile master arasına bir anahtar- and kapısı vs. girilip hangi tarafla haberleşilecekse o tarafın hattı aktif hale getirilip buna göre de master da USART modülünü 8 bit 9 bit iletişim e anahtarlayıp çalışma da mümkün olabilir.
Ancak 2 USART lı bir işlemci ile bütün bunlara gerek kalmadan yapmak daha sağlıklı olur ...

Edit.
Dediğim gibi PIC18 leri pek tanımıyorum. 452 deki USART modülü asenkron veya I2C gibi senkron kullanılabiliyor. Direkt paralel bağlayın derken bunların TX pinlerinin de weak pull-up olduğunu düşünerek yazmıştım. Uygulamadan önce bunu kontrol etmeniz de fayda var.

gtekdemir

Öncelikle açıklamalarınız için çok teşekkürler.

Alıntı yapılan: iyildirim - 30 Ekim 2011, 04:46:17
Adresli kullanım için de; (Bu konudaki bilgim daha çok dsPIC lerden. PIC18 üzerine pek bilgim yok. Ufak tefek değişiklikler dışında benzerdir diye düşünüyorum.)
Master veriyi hangi slave 'e göndermek istiyorsa 9.biti set ederek adres verisini gönderiyor. ADDEN biti set edilmiş olarak beklemekte olan slave'ler 9.bit set olduğu için gelen verinin adres verisi olduğunu anlayıp,  soft olarak değerlendirip verinin ona gelip gelmediğine karar veriyor.  Adresi uyan slave ADDEN bitini reset ediyor.

Master adres verisinden sonra 9.bit reset edilmiş olarak göndermek istediği veriyi yolluyor. ADDEN biti reset edilmiş olan slave gelen veriyi alabiliyor.
ADDEN biti set edili slave lerde gelen veri dikkate alınmıyor, çıkış bufferına gönderilmiyor, kesme oluşmuyor..

Master işi bitince konuştuğu slave'e bir şekilde senle işim bitti dediğinde slave de ADDEN biti set edilip beklemeye başlıyor.

Kısacası adresli kullanım için 9.bit iletişim gerekiyor. Veride ki 9.bit ile ADDEN biti and operatörü ile maskeleniyor.   


Anladığım kadarı ile;

[1]- Slave'ler adres bilgisi için dinlemede olacağı için RCSTA registerının ilgili bitleri olan;

Bit6 RX9: 9-bit Receive Enable bit
1 = Selects 9-bit reception
0 = Selects 8-bit reception

Bit3 ADDEN: Address Detect Enable bit
Asynchronous mode 9-bit (RX9 = 1):
1 = Enables address detection, enable interrupt and load of the receive buffer
when RSR<8> is set 
0 = Disables address detection, all bytes are received, and ninth bit can be used as parity bit

Bit0 RX9D: 9th bit of Received Data
This can be Address/Data bit or a parity bit, and must be calculated by user firmware.

Bitlerinin 1 yapılması gerekiyor

[2]- Master dinlemede olan slavelere öncelikle adres bilgisini göndereceği için, TXSTA registerının ilgili bitleri olan;

Bit6 TX9: 9-bit Transmit Enable bit
1 = Selects 9-bit transmission
0 = Selects 8-bit transmission

Bit0 TX9D: 9th bit of Transmit Data
Can be Address/Data bit or a parity bit.

Bitlerinin 1 yapılması gerekiyor.

Master adres bilgisini içeren 9 bitlik veri gönderir, mesela 1. slave için %100000001 , 2.slave için %100000010 , 3.slave için %100000011 ... şeklinde.
1.slave için olan %100000001 verisinin gönderildiğini farz edelim. Bu sırada slave modüllerin tümü adres bilgisini beklediği için gelen %100000001 bilgisi ile slavelerin RCIF değerleri 1 olur ve kesme rutinine giderler ve burada gelen bilgi ile slave modülün önceden tanımlanmış olan adres bilgisi karşılaştırılır.

Gelen  %100000001 bilgisi sadece 1.slave ile eşleştiği için diğer slave modüller kesme rutininden çıkarak işlerine devam ederler. 1.slave modül kesme rutininde öncelikle ADDEN bitinin değerini 0 yapacak ve RCREG içeriğini okuyup 8bitlik veri almaya hazır hale gelecek. Master 8 bitlik bilgiyi gönderdiği için bu gelen bilgi diğer slave modüller tarafından dikkate alınmayacak çünkü diğer slaveler 9.bit lik adres bilgisi bekliyorlar.

Gelen 8 bitlik veri alındıktan sonra ise 1.slave modül  master modüle gönderdiğin veriyi aldım diyecek ve haberleşme 1.slave için bitmiş olacak bitmiş olacak. Bu işlem tüm slave modüller için sırasıyla devam edecek.

Umarım mantığı doğru anlamışımdır.

Modüller arası mesafe şimdiki projede 20cm fakat başka projelerde bu mesafe uzayabileceği için RS485 kullanacağım. Master olarak çift usart bulunan kolay tedarik edilecek pic tavsiye edermisiniz.

Teşekkürler.


ete

PBP da yapılmış bir çalışma örneğini aşağıdaki linkte görebilirsiniz.
Mesajların sonunda gerekli dosylar da verilmiş olup örnek devre, 1 master ve 3 adet  Slave üzerine kurulmuş bir sisteme aittir.
Her bir slave'in bir ID numarası bulunur ve çalışmayı Master, ID numaralarına göre yönledirir. Sistem aslında RF üzerinden haberleşme amacı ile yapılmış olup simulasyon için devreye RS485 entegreleri ilave edilerek master ve slave ler bir birine bağlanmıştır.

http://etepic.com/index.php?topic=57.15

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com