Seri Haberleşme

Başlatan Teğmen, 25 Eylül 2017, 16:39:15

Teğmen

Merhaba
1 Master 2 Slave olacak şekilde rs485 ile haberleşme yapmaya çalışıyorum.
Simülasyonda slave lerin ucuna verilerin geldiğini sanal terminalden görebiliyorum.Fakat Lcd ekrana yazdıramıyorum.Sanırım farklı 2 veriyi alıp
hangisinin kendisinin olduğuna bakıp işlemesi gerekiyor.
Yardım edebilirseniz


MASTER KODU



#include <master.h>
#include <lcd.c>
#include <rs485.c>

//////////////////////////////////////////////////LCD pin connect//////////////////////////////////////////////////////////////

#define LCD_ENABLE PIN        PIN_D0        
#define LCD_RS_PIN            PIN_D1
#define LCD_RW_PIN            PIN_D2
#define LCD_DATA4             PIN_D4
#define LCD_DATA5             PIN_D5
#define LCD_DATA6             PIN_D6
#define LCD_DATA7             PIN_D7

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#use fast_io(b)
#use fast_io(c)
#use fast_io(d)


/////////////////////////////////////////// RS-485 SETTINGS ////////////////////////////////////////////////////////////////////

#define RS485_USE_EXT_INT_FALSE
#use rs232(baud=9600,xmit=RS485_TX_PIN,rcv=RS485_RX_PIN,enable=RS485_ENABLE_PIN,bits=9,long_data,errors,stream=slave_1)
#use rs232(baud=9600,xmit=RS485_TX_PIN,rcv=RS485_RX_PIN,enable=RS485_ENABLE_PIN,bits=9,long_data,errors,stream=slave_2)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void main()
{
   set_tris_b(0x00); output_b(0x00);
   set_tris_c(0x80); output_c(0x00);
   set_tris_d(0x00); output_d(0x00);
   
   lcd_init();                        delay_us(20);
   rs485_init();                      delay_us(20);
   
   while(TRUE)
   {
     printf(lcd_putc,"\f Veri Gonderme");
     delay_ms(500);
     
     
     output_high(RS485_ENABLE_PIN);
     fprintf(slave_1,"\f Veri1=%s","Elma");  delay_us(20);
     fprintf(slave_2,"\f Veri2=%s","Armut"); delay_us(20);   
     
     
   }

}


Slave 1 Kodu

#include <slave_1.h>
#include <lcd.c>
#include <rs485.c>

//////////////////////////////////////////////////LCD pin connect//////////////////////////////////////////////////////////////

#define LCD_ENABLE PIN        PIN_D0        
#define LCD_RS_PIN            PIN_D1
#define LCD_RW_PIN            PIN_D2
#define LCD_DATA4             PIN_D4
#define LCD_DATA5             PIN_D5
#define LCD_DATA6             PIN_D6
#define LCD_DATA7             PIN_D7

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#use fast_io(b)
#use fast_io(c)
#use fast_io(d)


/////////////////////////////////////////// RS-485 SETTINGS ////////////////////////////////////////////////////////////////////

#define RS485_USE_EXT_INT_FALSE
#use rs232(baud=9600,xmit=RS485_TX_PIN,rcv=RS485_RX_PIN,enable=RS485_ENABLE_PIN,bits=9,long_data,errors,stream=slave_1)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

char x,y;


void main()
{
   set_tris_b(0x00); output_b(0x00);
   set_tris_c(0x80); output_c(0x00);
   set_tris_d(0x00); output_d(0x00);
   
   lcd_init();                        delay_us(20);
   rs485_init();                      delay_us(20);
   
   while(TRUE)
   {
     printf(lcd_putc,"\f Haberlesme");
     delay_ms(500);
     
     
     output_low(RS485_ENABLE_PIN);
     x=fgets(y,slave_1);
     printf(lcd_putc,"\f Veri Alindi  %s",x);
     delay_ms(500);
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
   }

}



Slave2 Kodu


#include <slave2.h>
#include <lcd.c>
#include <rs485.c>

//////////////////////////////////////////////////LCD pin connect//////////////////////////////////////////////////////////////

#define LCD_ENABLE PIN        PIN_D0        
#define LCD_RS_PIN            PIN_D1
#define LCD_RW_PIN            PIN_D2
#define LCD_DATA4             PIN_D4
#define LCD_DATA5             PIN_D5
#define LCD_DATA6             PIN_D6
#define LCD_DATA7             PIN_D7

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#use fast_io(b)
#use fast_io(c)
#use fast_io(d)


/////////////////////////////////////////// RS-485 SETTINGS ////////////////////////////////////////////////////////////////////

#define RS485_USE_EXT_INT_FALSE
#use rs232(baud=9600,xmit=RS485_TX_PIN,rcv=RS485_RX_PIN,enable=RS485_ENABLE_PIN,bits=9,long_data,errors,stream=slave_2)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

char y;


void main()
{
   set_tris_b(0x00); output_b(0x00);
   set_tris_c(0x80); output_c(0x00);
   set_tris_d(0x00); output_d(0x00);
   
   lcd_init();                        delay_us(20);
   rs485_init();                      delay_us(20);
   
   while(TRUE)
   {
     printf(lcd_putc,"\f Communication");
     delay_ms(500);
       
   
     output_low(RS485_ENABLE_PIN); 
     fgets(y,slave_2);
     delay_us(50);
     output_high(RS485_ENABLE_PIN);
     printf(lcd_putc,"\f Veri Alindi \n%c",y);
     
     delay_ms(500); 
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
   }

}


"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

Teğmen

Bu konudan anlayan olmaması ihtimali yok diye düşünüyorum
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

dumansiz

Transceiver'lar nerede?
Master ve slave ID lerine dikkat ettin mi?
TX ve RX leri ters bağlamış olabilir misin?

Teğmen

@dumansiz



diğerleri kodda yazıyor master ve slave ID kısmını çok bilmiyorum ama yaptım sanırım
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

Teğmen

Ya çok basit bir problem aslında

atıyorum puts(':',elma );
gibi bir kod yazılmayacak mı baştaki : slave1 in adresi olacak yani onu görünce alması gerektiğini anlayacak ve alıp işleme tabi tutacak.
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

dumansiz

LCD lere en başta yazdırdığın;

     printf(lcd_putc,"\f Veri Gonderme");

     printf(lcd_putc,"\f Haberlesme");

     printf(lcd_putc,"\f Communication");

yazılarını LCD lerde görüyor musun?

Bir de A ile B arasına koyduğun 10K değerlerini nasıl seçtin?

dumansiz

Slave lerde kullandığın fgets() fonksiyonu ne işe yarar?
1 byte lık veri mi alır, yoksa string tarzı dizi mi alır?
Kullanımında hata yapıyor olabilir misin?

Teğmen

@dumansiz
o yazıları lcd de görüyorum
dirençlerde de sıkıntı yok tek tek haberleşme yaptığımda yapılabiliyor.
Sıkıntı şu master bir veri gönderdiğinde slavelerin hepsi bu veriyi görüyor.Sadece kendine mi gönderilmiş başkasına mı bunun taramasını yapıp ona göre işleyecek.
Bu olayı koda çeviremedim
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

dumansiz

"slave1.h" ve "slave2.h" dosyalarında id ler olması lazım. O dosyaları inceleyebilirsin.
Alıntı YapSıkıntı şu master bir veri gönderdiğinde slavelerin hepsi bu veriyi görüyor
Master veri gönderdiğinde bilgi tüm slavelere gider. Slaveler gelen paketteki id ye bakıp paketin kime geldiğini anlar. "rs485.c" nin içerisinde yapılıyor olması lazım.
Sanal terminalde gördüğün için, tüm slaveler bu veriyi alıp, id sini kontrol etmeden işliyor, diye düşünüyorsan yanılıyorsun.
Yok eğer slave LCD lerinde aynı şeyi görüyorsan( "elma" ve "armut") slave idleri aynı tanımlanmış olabilir.

Teğmen

@dumansiz
Sıkıntı tamda bu
ıd verme ve bunu okuma olayını yapamıyorum kodsal olarak
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

dumansiz

rs485.c
slave1.h
slave2.h

Bu dosyaların içerisindeki kodları siz mi yazdınız,yoksa hazır kütüphane olarak mı kullandınız?
İçlerindeki kodu buraya ekleyebiliyor musunuz?

kudretuzuner

Amatör

Teğmen

@dumansiz bunları ne için soruyorsun anlayamadım .
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

kudretuzuner

Merhaba,
SPI hakkında tam bilgim yok fakat  slavlerden kullanmak istediğinizin SS pinini Masterde yazılımsal olarak low a çekiniz ve datayı sonra yollayınız.
Amatör

dumansiz

fprintf() ve fgets() fonksiyonları,
RS485 paketini ayıklayıp mı, veriyi alıyorlar?
Yoksa, sadece usart bufferındaki bilgileri aynen alıyor mu?

Yani; RS485 protokolünü başlatıyorsun ama RS485 paket alma, paket gönderme fonksiyonlarını kullanıyor musun?
rs485.c dosyasının içinde paket alma fonksiyonu varsa onu kullan.