rs485 iletimde sorun

Başlatan fm, 11 Nisan 2013, 22:19:50

xoom

Konu Paralel olunca bu başlıktan tekrar sormak istedim..
Camby Hocam 2 Slave 1 Master olucak ve Master devre PC'Ye bağlanacak şekilde bir tasarım yapabilirmisiniz..
Not: Az önce denemeler yapıyorum Birşeyler bendede ters gidiyor.. Örnek bir Çalışma olsa hiç fena olmayacak
*Bu rs485 master Slave Konusunda CCS 'ye artık birinin güzel bir destek  vermesi bence çok iyi olucak. Kodu Vs içinde. İlgi ve Alakalı arkadaşları bu konuda desteklerini bekliyorum..

camby

Aynı hat üzerinde birden fazla master olabilir , bu mümkün ancak ona uygun protokol yazmak lazım. 1 Master ve slaveler kendi aralarında güzelce anlaşırken PC nasıl devreye girip master'lığı devreye alacak bunu kurgulamak lazım.

MCU'lar üzerinde 3er 5er USART modülü var , eğer PC'nin slave 'ler ile iletişim kurması gerekmiyorsa , PC , Master'ın başka bir Usart hattından master ile iletişim kurabilir. Bu daha kolay olur.

485 üzerinden modbus yazdım ancak assembly ile .


Tek master tek slave 485 üzerinden 1 byte bile gönderdiğinizde gerisi çorap söküğü..

xoom

Hocam 1 Master Olucak.. 2 Slave olucak Yanlış anladınız sanırım..
Şöyle bir tasarım Yaptım.. İncelermisiniz.
https://www.dropbox.com/s/9zd6fn737vlqp5r/rs485-max487-%C5%9Fema.DSN
Şimdi bu tasarımda RX1 TX1 ile MCU Slavleri yönetip Slaveleri sorgulayıp Master'a verdikleri Cevapları Rx2 ve Tx2'den PC'ye aktarmak istiyorum..
Bu konuda yardımcı olurmusunuz..

camby

Alıntı yapılan: xoom - 13 Nisan 2013, 15:21:12
Hocam 1 Master Olucak.. 2 Slave olucak Yanlış anladınız sanırım..
Şöyle bir tasarım Yaptım.. İncelermisiniz.
https://www.dropbox.com/s/9zd6fn737vlqp5r/rs485-max487-%C5%9Fema.DSN
Şimdi bu tasarımda RX1 TX1 ile MCU Slavleri yönetip Slaveleri sorgulayıp Master'a verdikleri Cevapları Rx2 ve Tx2'den PC'ye aktarmak istiyorum..
Bu konuda yardımcı olurmusunuz..
2 slave 1 master kısmını anladım da ek olarak Master devre PC'ye bağlanacak demişsiniz ben onun için konuştum.

Sizin yaptığınıza baktım , ben de bu şekilde anlattım işte. Aynısını yapmışsınız zaten. PC , master slave arası iletişime karışmayacak hiçbir şekilde. Birbirinden bağımsız olursa yazması/kurgulaması daha kolay olur.

Master/slave iletişimi düzgün çalışıyor mu ?


PC ve Master arası iletişimde de , PC master olabilir. PC istek gönderdikçe sahadaki master , pc ye istediği cevapları göndersin . PC- Master iletişimi sırasında , Master-slave iletişiminin ne olacağına da siz karar vereceksiniz. o sırada yapılan iletişim , duraklatılabilir , iptal edilebilir , yada hiç etkilenmeden devam edebilir ( bu durumda seri port kesmelerini iyi yönetmeniz gerekir )

xoom

Benim Amacım Şu ;
Slavelerde KartOkuyucu var ne zaman bir Kart okutulursa PC'ye kartın ID'sı gelecek başka hiçbir şey yapılmayacak
Extra olarak PC Master'a emir vermeyecek.. Tek amaç Slavelerde okutulan ID'yı anında PC'ye aktarmak..

arslan74

Alıntı yapılan: xoom - 13 Nisan 2013, 15:37:03
Benim Amacım Şu ;
Slavelerde KartOkuyucu var ne zaman bir Kart okutulursa PC'ye kartın ID'sı gelecek başka hiçbir şey yapılmayacak
Extra olarak PC Master'a emir vermeyecek.. Tek amaç Slavelerde okutulan ID'yı anında PC'ye aktarmak..

Bu şekilde RS485 in düzgün çalışması için herbir cihaz doğrudan bir Uart protuna bağlanmalı. Tek bir uart portuyla böyle bir sistemi rs485 ile haberleştirmessin. Ya dediğim yapacaksın, yani ürerinde bir sürü uart poru olan bir uC kullanacaksın. PICler de en fazla 6 adet olanları var, daha fazlası yok. Yada ikini yol kart okuyucuya kendin bir uC bağlayıb sonra bilgileri uC ile rs485 göndermek şeklinde olabilir.

Bir ücünücü yol yok malesef.




xoom

Alıntı yapılan: arslan74 - 13 Nisan 2013, 16:14:13
Bu şekilde RS485 in düzgün çalışması için herbir cihaz doğrudan bir Uart protuna bağlanmalı. Tek bir uart portuyla böyle bir sistemi rs485 ile haberleştirmessin. Ya dediğim yapacaksın, yani ürerinde bir sürü uart poru olan bir uC kullanacaksın. PICler de en fazla 6 adet olanları var, daha fazlası yok. Yada ikini yol kart okuyucuya kendin bir uC bağlayıb sonra bilgileri uC ile rs485 göndermek şeklinde olabilir.

Bir ücünücü yol yok malesef.
Hocam Paylaştığım Şemayı incelemediniz sanırım.. Slavelerde 16f628 var zaten..ben mi sizi yanlış anladım acaba.. 16f628'lere kartOkuyucu Bağlanacak.




fm

Hocalarım benden daha kıdemli ve bilgilisiniz rica etsem müsait olduğunu bir anda konunun başında paylaştığım tasarıma ve kodlara bakıp nerede hata yaptığımı bana izah edebilir misiniz? Yoksa gerçekten rs485 kullanarak böyle bir bağlantı gerçekleştirmek mümkün değilmidir.

arslan74

Alıntı yapılan: fm - 13 Nisan 2013, 18:14:17
Hocalarım benden daha kıdemli ve bilgilisiniz rica etsem müsait olduğunu bir anda konunun başında paylaştığım tasarıma ve kodlara bakıp nerede hata yaptığımı bana izah edebilir misiniz? Yoksa gerçekten rs485 kullanarak böyle bir bağlantı gerçekleştirmek mümkün değilmidir.

Bana söylüyorsanız ?

Sorun senin yazdığın kodlarda. Özellikle master kodunu değiştirmen gerek, çünkü o kodda gönderme ve alma modu arasındaki geçişi nerede yaptığını göremedim.


Alıntı YapHocam Paylaştığım Şemayı incelemediniz sanırım.. Slavelerde 16f628 var zaten..ben mi sizi yanlış anladım acaba.. 16f628'lere kartOkuyucu Bağlanacak.

Yok ben yanıl anlamışım. Şemayı incelememiştim. yazıklarına göre yorum yapmıştım. Şemada bir sorun yok, çalışması gerek,  eğer kodların da sorun yok ise.


xoom

Alıntı yapılan: arslan74 - 13 Nisan 2013, 21:02:55

Yok ben yanıl anlamışım. Şemayı incelememiştim. yazıklarına göre yorum yapmıştım. Şemada bir sorun yok, çalışması gerek,  eğer kodların da sorun yok ise.
Ortada bi Kod yok ki :) Beceremedim.. Algoritmaya kafa basıyorda yazılımda çuvallıyorum..

arslan74

Alıntı yapılan: xoom - 15 Nisan 2013, 18:15:00
Ortada bi Kod yok ki :) Beceremedim.. Algoritmaya kafa basıyorda yazılımda çuvallıyorum..

RS485 aslında çok basit olmasına rağmen onunla çok iyi bir haberleşme yapabilen bir ağ protokol programını yazmak gerçekten iyi bir yazılım bilgisi ister. Onun yerine örneğin CAN-Bus kullanmak daha kolay olur. Zira CAN-BUS'in içindeki protokol hazır olduğu için onu yazmak zorunda kalmayıp. Sadece Can-Bus modulu ayarlayıp ondan sonra gönder-al yapıyorsun.


fm

#26
@arslan74

Hocam master ve slave için anlağım kadarı ile söylediklerinizi kodlar üzerinde yaptım ama sonuç anlamadım. tek yönde iletişim kurabilmdim ama iki yönde gerçekleştiremedim.
Tasarımı ve son yazdığım kodları ekledim eğer bakarsanız çok sevinirim.

Saygılarımla..



Master Kod:
// BU PROGRAMDA KESMEYE GEREK YOKTUR. LM35

#include <16F877A.h>
#include <string.h>

#FUSES NOWDT                    
#FUSES XT                       
#FUSES NOBROWNOUT               
#FUSES NOLVP                    
#FUSES NOPUT
#FUSES NODEBUG
#FUSES WRT_50%
#FUSES NOCPD
#FUSES NOPROTECT

#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(d)

#define use_portb_lcd TRUE
#include <lcd.c>

#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) // iletişimleri ayarlamak için isim verildi.

char giris[80]; 
int i,kb, bayrak;
char *k;

void main()
{
   setup_adc_ports (NO_ANALOGS) ;
   setup_adc (ADC_OFF) ;
   setup_psp (PSP_DISABLED) ;
   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1) ;
   setup_timer_1 (T1_DISABLED) ;
   setup_timer_2 (T2_DISABLED, 0, 1) ;
   setup_comparator (NC_NC_NC_NC) ;
   setup_vref (FALSE) ;
   setup_CCP1 (CCP_OFF) ;
   setup_CCP2 (CCP_OFF) ;
     
   set_tris_b (0x00);
   output_b (0x00) ;
   
   set_tris_c (0x80);
   
   set_tris_d (0x03);
   output_d (0x00);
   
   lcd_init();
   
   i=0;
   kb=0;
   
   printf(lcd_putc,"\fLutfen");
   printf(lcd_putc,"\nBekleyiniz");
   delay_ms(900);
   printf(lcd_putc,"\fOkuma Yapiliyor");
   delay_ms(5);

   while (1)
   {
      output_high(pin_C4);
      delay_ms(5);
      output_high(pin_C5);
      delay_ms(5);
      
      
      putc(0);
       delay_ms(5);
      putc(13);  
      
      output_low(pin_C5);//DE
       delay_ms(5);
      output_low(pin_C4);//RE
      delay_ms(5);
      
      kb=kbhit();
   
      if(kb==1)
      {    
         gets(giris);
         delay_ms(5);
         
//!         k =giris; // yukarda veri1'e "gonder" stringi atandı. Burada k="gonder oluyor".         
//!         do
//!         {
//!           putc(*k);   // veri dizisinin tüm elemanlarını yolla
//!         } while(*(++k) != '\0');
         
         //putc(13); // gets için sonlandırma kodu. klavyedeki Enter tuşu
         
         printf(lcd_putc,"\f%d numarali",i);
         printf(lcd_putc,"\nslave okunuyor");
         delay_ms(500);
         printf(lcd_putc,"\f%s",giris);
         delay_ms(900);
         
         kb=0;
       }
   }   
}

 


Slave Kod:
#include <16F877A.h>
#include <ds18b20.c>  

#FUSES NOWDT                    
#FUSES XT                       
#FUSES NOBROWNOUT               
#FUSES NOLVP                    
#FUSES NOPUT
#FUSES NODEBUG
#FUSES WRT_50%
#FUSES NOCPD
#FUSES NOPROTECT

#use delay(clock=4000000)

#use fast_io(a)
#use fast_io(b)

#define use_portb_lcd TRUE
#include <lcd.c>


#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)

char bayrak,data[50];
char *k; //pointer olrakk alınıyor.

float sicaklik_ust,sicaklik_alt;
int secici;


#int_rda //seri haberleşme kesmesi
void seri_haberlesme()
{  
   enable_interrupts(int_rda);
   secici=getc();
   if (secici == 0) // giris ve veriye atanan string ifadeler aynı ise sonuc 0 döndürür.
   {
      bayrak = 1;
   }
}

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc (adc_off) ;
   setup_psp (PSP_DISABLED) ;
   setup_timer_0 (RTCC_INTERNAL | RTCC_DIV_1) ;
   setup_timer_1 (T1_DISABLED) ;
   setup_timer_2 (T2_DISABLED, 0, 1) ;
   setup_comparator (NC_NC_NC_NC) ;
   setup_vref (FALSE) ;
   setup_CCP1 (CCP_OFF) ;
   setup_CCP2 (CCP_OFF) ;
   
   set_tris_a(0xFF);
 
   set_tris_b(0x00);
   output_b (0x00);
   
   set_tris_c (0x80);

   set_tris_d (0x00);
   output_d (0x00);
  
   lcd_init ();
   
   enable_interrupts (int_rda);
   enable_interrupts (GLOBAL);
   
   printf(lcd_putc,"\fTest Olcumu Icin");
   printf(lcd_putc,"\nButona Basin");
   delay_ms(250);
   
   while (1)
   {
      output_low(pin_C5);
      delay_ms(5);
      output_low(pin_C4);
      delay_ms(5);
      
      sicaklik_ust=ds1820_read();
      delay_ms(1);
      sicaklik_alt=ds1820_read1();
      delay_ms(1);

      if (bayrak == 1)
      {
         output_high(pin_C4);
         delay_ms(5);
         output_high(pin_C5);
         delay_ms(5);
         
         printf(lcd_putc,"\fSicaklik1=%1.1f%cC",sicaklik_ust,223);
         printf(lcd_putc,"\nSicaklik2=%1.1f%cC",sicaklik_alt,223);
         delay_ms(500);

         sprintf(data,"%f,%f",sicaklik_alt,sicaklik_ust); //bilgiyi paket haline getirdik  
           
         k =data; // yukarda veri1'e "data" stringi atandı. Burada k="data" oluyor.
         do
         {
            putc(*k);   // veri dizisinin tüm elemanlarını yolla
         } while(*(++k) != '\0');
         putc(13); // gets için sonlandırma kodu. klavyedeki Enter tuşu  
         
         delay_ms(2); // gönderme yapıldıktan sonra gecikme verilmeli bu programda yoksa datanın son 2 hanesi gitmiyor
      } 
  }

}


mesaj birleştirme:: 16 Nisan 2013, 14:08:46

Hocam birde simülasyonda "Logic contention(s) detected on net" diye bir hata alıyorum. Bu sanırım bağlantılarda mantık hatası oldupu anlamına geliyor.

arslan74

Yazdığın kodlar da daha öncede söylediğim gibi gönderme ve alma işlemlerinde ki geciş sırasında mod geçişinin yapıldığı bir kod göremiyorum. Sanki standart uart gibi gönderme ve alma yapmışsın. Aradaki RS485 chipi görmezlikten gelmişsin.

Eğer uart gibi yapacaksan o zaman iki tane rs485 kullan. Göndermeyi ve almayı ayrı hatlarda kullan böylelikle hiçbir sorunlar karşılaşmassın.

xoom

#28
Arslan74 hocam
C4 -C5  pinleriyle re-de pinlerini kontrol ediyor..
fm isis semasini biryere upload edermisin baglantilar net gözükmüyor

fm

Alıntı yapılan: arslan74 - 16 Nisan 2013, 14:59:12
Yazdığın kodlar da daha öncede söylediğim gibi gönderme ve alma işlemlerinde ki geciş sırasında mod geçişinin yapıldığı bir kod göremiyorum. Sanki standart uart gibi gönderme ve alma yapmışsın. Aradaki RS485 chipi görmezlikten gelmişsin.

Eğer uart gibi yapacaksan o zaman iki tane rs485 kullan. Göndermeyi ve almayı ayrı hatlarda kullan böylelikle hiçbir sorunlar karşılaşmassın.


Hocam rs485 ile ilgili bilgim tasarımda ve kodlarda olduğu kadar. Ben C4 ve C5 pinlerini sırası ile okuma ve yazma durumları için low ve high yaparak çalıştırabileceğimi düşünmüştüm. Sizin dediğiniz geçiş işlemleri sırasındaki mod geçiş işleminin bu olduğunu sanıyordum.
Kodda ne yazmam gerekiyor?

Saygılarımla..