USART SENKRON İLETİŞİMDE SLAVE MODU

Başlatan kaplan_65, 11 Şubat 2007, 16:29:40

kaplan_65

Slm
Arkadaşlar senkron iletişimde clock sinyalinin harici olarak (slave mode) seçildiği durumda clock sinyalini pic in(16f628) hangi pinine bağlamak lazım? Slave modundayken pic in clock ucu datasheet te rb2/tx çıkış olarak belirtiliyor. Çıkış olarak belirtilen bir yere nasıl clock sinyali göndereyim ki :!:
Bir de senkron moddayken  data alışverişi rb1/rx üzerinden yapılıyor. Hem alımda hem de gönderimde bu uç datasheette hep giriş olarak tanımlanıyor. Nasıl oluyor da data, giriş olan bir uçtan gönderilebiliyor :?:
Yardımlarınızı bekliyorum :roll:
KAZIM ASLAN Gazi Üniversitesi Elektrik Elektronik  Mühendisliği...

Ziya

Alıntı yapılan: "kaplan_65"Slm
Arkadaşlar senkron iletişimde clock sinyalinin harici olarak (slave mode) seçildiği durumda clock sinyalini pic in(16f628) hangi pinine bağlamak lazım? Slave modundayken pic in clock ucu datasheet te rb2/tx çıkış olarak belirtiliyor. Çıkış olarak belirtilen bir yere nasıl clock sinyali göndereyim ki :!:
Bir de senkron moddayken  data alışverişi rb1/rx üzerinden yapılıyor. Hem alımda hem de gönderimde bu uç datasheette hep giriş olarak tanımlanıyor. Nasıl oluyor da data, giriş olan bir uçtan gönderilebiliyor :?:
Yardımlarınızı bekliyorum :roll:
Datasheetten master modunu oku. Slave modu için çok açık yazılmamış. Bu nedenle senkron haberleşmenin her iki modunu iyice anlamalısın. Master modda clock çıkışı olan pin slave modda clock girişidir. 2 yıl kadar önce ISIS üzerinde slave senkron haberleşme simulasyonu yapmıştım ama detaylarını unuttum. 877'yi SPI portundan 16F628'in uart modülüne bağlamıştım. Çok güzel haberleştiler. Ama bir tek sorun vardı. SPI little endian, uart ise bigendian haberleşiyordu. Yani gönderdiğim verinin ayna simetrisini karşı taraf alıyordu. Sorunu SPI yerine kendi tanımladığım data/clock haberleşme rutini ile çözmüştüm. Her iki tarafta da uart modül kullanacaksan sorun yok.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

kaplan_65

Her iki tarafta da usart kullanıyorum.Fakat alıcı tarafında (slave modda bulunan) clk girişini giriş yaptığımda çalışmıyor. Datasheet teki gibi çıkış yaptığmda da kısa devre oluyor.Haberleşme, normalde asenkron modda çalışıyor.
Master kısmı bilgiyi ve clk kısmını hatasız gönderiyor.Sorun alıcı tarafta.
Her iki tarafı da master modda çalıştırırsam data alışverişi olur mu :?:
Acaba konfigürasyon bitlerinde mi sorun var.
CLOCK KISMI:
__CONFIG _INTRC_OSC_NOCLKOUT
KAZIM ASLAN Gazi Üniversitesi Elektrik Elektronik  Mühendisliği...

Ziya

//--------------  USART SLAVE --------------
void usart_slave_init()
{
unsigned char dummy;
#asm bsf status,5
#endasm
rcsta.spen = 0; // Serial port enable bit, 1 enable, 0 disable

txsta.tx9  = 0;
txsta.sync = 1; // 1 synchronous, 0 async
txsta.csrc = 0; // clock source 1 master, 0 slave (external clock)
txsta.tx9d = 0;
txsta.txen = 0; 

//pie1.txie = 1;
//pie1.rcie = 1;
#asm bcf status,5
#endasm

rcsta.cren = 0; // Continuous Receive Enable bit 1 enable.
rcsta.ferr = 0;
rcsta.sren = 0; // Single receive enable bit, sync slave de kullanılmıyor.
rcsta.spen = 1; // Serial port enable bit, 1 enable, 0 disable

dummy = rcreg;
dummy = rcreg;
dummy = rcreg;

}

//#INT_RDA //             RS232 receive data available

#define usart_yon_giris()  {bit_set(status,5); \
                            txsta.txen = 0;    \
                            bit_clear(status,5); \
                            rcsta.cren = 1; }
#define usart_yon_cikis()  {rcsta.cren = 0; \
                            bit_set(status,5);\
                            txsta.txen = 1;\
                            bit_clear(status,5);}

/*void usart_yon_giris()
 {
  bit_set(status,5);   // bank 1
  txsta.txen = 0;
  bit_clear(status,5); // bank 0
  rcsta.cren = 1; // Continuous Receive Enable bit 1 enable.
 }
void usart_yon_cikis()
 {
  rcsta.cren = 0; // Continuous Receive Enable bit 1 enable.
  bit_set(status,5);
  txsta.txen = 1;
  bit_clear(status,5);
 }*/

// #INT_TBE //             RS232 transmit buffer empty

// ---------------- USART bitti ----------


Umarım işine yarar. Rutinlerden de göreceğin üzere haberleşme yönünü rcsta.cren ve txsta.txen ile ayarlıyorsun. Gerisi normal uart haberleşmesi gibi.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

kaplan_65

Arkadaşlar benim elimde slave modda full-duplex çalışan bir alet var.(Yani eşzamanlı data alışverişi)
Fakat kullandığım işlemcide(16F628) half-duplex(belli bir sürede sadece veri alımı ya da sadece veri iletimi) iletişim yapılabiliyor. Eşzamanlı data alışverişi için  16f877 de çıkışlar mevcut. Bunu 16f628 de yapmak mümkün mü? Mümkün değilse hangi pic i tavsiye edersiniz :?:
KAZIM ASLAN Gazi Üniversitesi Elektrik Elektronik  Mühendisliği...

Ziya

Alıntı yapılan: "kaplan_65"Arkadaşlar benim elimde slave modda full-duplex çalışan bir alet var.(Yani eşzamanlı data alışverişi)
Fakat kullandığım işlemcide(16F628) half-duplex(belli bir sürede sadece veri alımı ya da sadece veri iletimi) iletişim yapılabiliyor.
Nasıl yani? Senkron modda bilgi gönderirken aynı zamanda bilgi alma işlemi yapmasını da mı istiyorsunuz? Slave ya da master olması sadece clock sinyalini kimin göndereceği ile alakalıdır. 877 de ne yapılıyorsa 628 de de aynısı yapılıyor.
Alıntı YapEşzamanlı data alışverişi için  16f877 de çıkışlar mevcut. Bunu 16f628 de yapmak mümkün mü? Mümkün değilse hangi pic i tavsiye edersiniz :?:
Siz senkron slave haberleşmesi yapacağım dediniz. Bu 628 de de 877 de de aynı şekildedir. Yani half duplex. Senkron ful duplex haberleşmesi için 877 de çıkış mevcut değildir. Asenkron haberleşme yapacaksanız her ikisi de gönderme yaparken alma işlemi de yapabilirsiniz. Her ikisinin hattı da, registerleri de ayrıdır.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

kaplan_65

The USART can be configured in the following modes:
• Asynchronous (full-duplex)
• Synchronous - Master (half-duplex)
• Synchronous - Slave (half-duplex)


Yukarıdaki kısmı 16f628 in datasheet inden aldım.Yani senkron modda full duplex yapılamıyor. iletişimin Full duplex yapılabilmesi için DATA-IN,DAT-OUT ve CLOCK uçlarının farklı olması lazım.  Ama 16f628 de ise sadece clock ve data çıkışı bulunuyor.

Bu da 16f877 nin datasheet inden:
The SPI mode allows 8 bits of data to be synchronously
transmitted and received simultaneously. All four
modes of SPI are supported. To accomplish
communication, typically three pins are used:
• Serial Data Out (SDO) – RC5/SDO
• Serial Data In (SDI) – RC4/SDI/SDA
• Serial Clock (SCK) – RC3/SCK/SCL


Yani senkron modda full duplex yapılabiliyor.Ve de gördüğünüz gibi 3 tane çıkış var. (simultaneously ifadesi eş zamanlı demektir...)
Yani 16F877 de çıkış mevcut.Aksine 16f628 de mevcut değil.

Ben sizlere slave modu şunun için sormuştum:

Elimde full duplex çalışan slave modunda bir alet var.
İki tane 16F628 kullanarak senkron full duplex iletişim kurmaya çalışıyorum.Çünkü aynı anda datanın alınabilmesi için alıcı kısmı slave moda çekip clock sinyalini de verici taraftan sağlıyorum. Bu clock sinyalini aynı zamanda kullandığım alete de veriyorum.Bu alet veri gönderince slave moddaki alıcı pic te datayı okuyacak.
Kısacası; bir pic data ve clock gönderecek, diğeri de aletten gelen datayı okuyacak.
KAZIM ASLAN Gazi Üniversitesi Elektrik Elektronik  Mühendisliği...

Ziya

Hocam, başından beri usart kullanıyorum diyordunuz şimdi ise SPI portuna geçmişsiniz. SPI portu farklıdır. Size yazdığım ilk mesajda bahsettiğim gibi SPI little endian, usart ise big endian haberleşirler. Yani birinden 10000000 bitlerini gönderirseniz diğerinde 00000001 şeklinde alırsınız.

SPI portu kullanacaksanız 16F628'de donanımsal olarak bulunmadığından yazılım ile halledeceksiniz.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

kaplan_65

Evet usart kullanıyorum fakat senkron full duplex için 16f877 de çıkışların olduğunu söyledim.877 de usart kullanacağımı söylemedim ki :!:  Ama siz
Alıntı Yap
Senkron full duplex haberleşmesi için 877 de çıkış mevcut değildir
demişsiniz. 8O
Neyse...
Yazılımla; giriş olarak kullandığım bir pinden direkt olarak karşıdan gelen 8 bitlik veriyi alabilir miyim?
KAZIM ASLAN Gazi Üniversitesi Elektrik Elektronik  Mühendisliği...

XX_CİHAN_XX

Burada zaten tek hattan manuel 8 bit veri gonderımı ıle ılgılı gereken her turlu bılgıyı vermıstım.
http://picproje.org/index.php/topic,14091
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.

kaplan_65

Asenkron iletişimde datanın gelip gelmediğini start ve stop bitleriyle belirtiyoduk. Fakat datayı bana gönderecek alet(bir tür joystick slave modda) senkron modda çalışıyor.Bildiğim kadarıyla senkron iletişimde start ve stop biti kullanılmıyor, bunun yerine clock kullanılıyor. Datanın gelip gelmediğini nasıl anlayacağım? burada kafam karıştı :x
KAZIM ASLAN Gazi Üniversitesi Elektrik Elektronik  Mühendisliği...

XX_CİHAN_XX

Cevabını kendın vermıssın zaten clock ıle.
Clock hattı normalde lojık 1 de ıse dusen kenarda data degısıyor demektır.
Bostayken lojık 0 da ıse yukselen kenarda data gelıyor demektır.
Bu durumda yapıcagın en basit işlem clock hattını rb0 a bagla ve dedıgım sekılde dusen ve ya yukselen kenar kesmesı olarak ayarla.
Kesmeye gırdıgın anda datanın ılk bıtı geldı demektır.Bu bit start bitide olabılır formatı bılmıyorum.Senkron olsun asenkron olsun butun haberleşmelerde start stop bıtlerı vardır.Anlattıgım sekılde clock sorarak bit, bit datayı okuyabılırsın.....
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.

Ziya

Alıntı yapılan: "kaplan_65"Evet usart kullanıyorum fakat senkron full duplex için 16f877 de çıkışların olduğunu söyledim.877 de usart kullanacağımı söylemedim ki...
İkinci mesajınızda "Her iki tarafta da usart kullanıyorum.Fakat alıcı tarafında (slave modda bulunan) clk girişini giriş yaptığımda çalışmıyor. Datasheet teki gibi çıkış yaptığmda da kısa devre oluyor.Haberleşme, normalde asenkron modda çalışıyor. " demiştiniz. Sorununuzu baştan beri tam olarak anlatmadan sağlıklı bir cevap alabilmeniz gördüğünüz gibi mümkün olmuyor. İki adet 16F628 mi kullanacaksınız, 1 adet 628 ve bir adet 877 mi, yoksa fulduplex senkron cihazınız vad ve bununla senkron mu haberleşeceksiniz? Senkron haberleşmede start, stop, parite bitleri olmaz fakat little ve bigendian meselesi yüzünden haberleşmede problem yaşayabilirsiniz diyorum. Ayrıca senkron haberleşmede ilk başlangıçtaki senkronizasyon için gerekli elsıkışma (handshaking) mantığını da çözmeniz gerekir.

Elinizdeki cihazın haberleşmesi spi üzerinden mi? Bunu kesin anlamış iseniz sorun yok. Bu durumda usart modülü kullanmanız problem çıkartır. 877 üzerinden SPI veya 628 üzerinden yazılım emulasyonu ile spi haberleşmesi yapacaksınız.
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey

kaplan_65

Haklısınız Ziya bey. Konuyu biraz karışık sordum. İlk sorduğum sorudaki amacım: Acaba iki pic16f628 arasında senkron olarak iletişim kurabiliyor muyum(verici master alıcı slave)?Eğer bunu başarırsam kullanacağım alet üzerinde deneyecektim. Baktım iş karmaşıklaşıyor 16F877 ile kolay yoldan yaparsam nasıl olur diye sizlere sordum.Yani amacım elimdeki aletle uygun pic ya da pic leri kullanarak haberleşmek.Aletin özellikleri ise şöyle:
1)Slave modda çalışıyor.
2)data in, data out, clock ve de attention çıkışları mevcut.
3)data alışverişi için önce bir anahtar kod(0x42) istiyor ve attention girişi logic 0 a çekmek gerekiyor.
4)önce LSB yi alıyor.(galiba sizin bahsettiğiniz bigendian)
5) Full duplex çalışıyor.
Özellikler böyle olunca sizce hangi pic mantıklı olur?Sormak istediğim soru bu. :o
KAZIM ASLAN Gazi Üniversitesi Elektrik Elektronik  Mühendisliği...

Ziya

Alıntı yapılan: "kaplan_65"Haklısınız Ziya bey. Konuyu biraz karışık sordum. İlk sorduğum sorudaki amacım: Acaba iki pic16f628 arasında senkron olarak iletişim kurabiliyor muyum(verici master alıcı slave)?Eğer bunu başarırsam kullanacağım alet üzerinde deneyecektim.
Senkron modda her iki 628i de haberleştirebilirsiniz. Biri master diğeri slave olacak şekilde. Benim verdiğim kod zaten 628 üzerinde çalışan kodlardı.
Alıntı YapBaktım iş karmaşıklaşıyor 16F877 ile kolay yoldan yaparsam nasıl olur diye sizlere sordum.Yani amacım elimdeki aletle uygun pic ya da pic leri kullanarak haberleşmek.Aletin özellikleri ise şöyle:
1)Slave modda çalışıyor.
2)data in, data out, clock ve de attention çıkışları mevcut.
SPI üzerinden haberleşme yapıyor. 877 üzerindeki clk çıkışını aletteki clocka, DO çıkışını aletteki data in girişine, 877 DI girişini aletteki data out çıkışına, attention girişini de 877 deki CS çıkışına bağlayacaksınız. 877 üzerindeki pin yönlerini de trisc kayıtçısından ayarlamanız gerekir.
Alıntı Yap
3)data alışverişi için önce bir anahtar kod(0x42) istiyor ve attention girişi logic 0 a çekmek gerekiyor.
877 bunu otomatik yapacaktır.
Alıntı Yap
4)önce LSB yi alıyor.(galiba sizin bahsettiğiniz bigendian)
5) Full duplex çalışıyor.
Özellikler böyle olunca sizce hangi pic mantıklı olur?Sormak istediğim soru bu. :o
4 numara işi karıştırdı. Çözümü kolay da bigendian olduğundan eminmisiniz? Yani gönderilecek olan sayı 0x42=0100 0010 big endian da olsa little endian da olsa aynı olduğundan yanlış algılamış olabilirmisiniz.

877 SPI haberleşmesini ayarlayın (CS yi kullanacağınızı da ayarlarda belirtin). deneme yapın. Muhtemelen çalışacaktır. Haberleşme hızını düşük tutun. Özellikle uzun mesafelerde en düşük haberleşme hızına ayarlayın.

Eğer gerçekten bigendian haberleşme istiyorsa bunu assembly ile kolayca halledebilirsiniz. Size 16 kod alanına malolur. deg1 göndermek istediğiniz sayı ise aşağıdaki kod parçasından sonra deg2 yi göndereceksiniz. Böylece little endian haberleşmeyi bigendiana dönüştürmüş olursunuz.
#assembler
   rlf deg1
   rrf deg2

   rlf deg1
   rrf deg2

   rlf deg1
   rrf deg2

   rlf deg1
   rrf deg2

   rlf deg1
   rrf deg2

   rlf deg1
   rrf deg2

   rlf deg1
   rrf deg2

   rlf deg1
   rrf deg2
#endasm
Bu günden sonra hiç kimse sarayda, divanda, meclislerde ve seyranda Türk dilinden başka dil kullanmaya. (13 Mayıs 1277) Karamanoğlu Mehmet Bey