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
(https://s26.postimg.cc/kzcapv0yt/Ads_z.png) (https://postimg.cc/image/kzcapv0yt/)
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);
}
}
Bu konudan anlayan olmaması ihtimali yok diye düşünüyorum
Transceiver'lar nerede?
Master ve slave ID lerine dikkat ettin mi?
TX ve RX leri ters bağlamış olabilir misin?
@dumansiz (https://s26.postimg.cc/d6oe64omd/Ads_z2.png) (https://postimg.cc/image/d6oe64omd/)
diğerleri kodda yazıyor master ve slave ID kısmını çok bilmiyorum ama yaptım sanırım
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.
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?
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?
@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
"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.
@dumansiz Sıkıntı tamda bu
ıd verme ve bunu okuma olayını yapamıyorum kodsal olarak
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?
https://www.picproje.org/index.php/topic,56452.0.html
@dumansiz bunları ne için soruyorsun anlayamadım .
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.
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.