18f4520 seri haberlesme detayları

Başlatan mert53, 20 Aralık 2017, 02:23:53

mert53

çok çok uzun bir aradan sonra tekrar selamlar

2 adet 18f4520 arasında haberlesme yapmaya çalışmaktayım. 10 adet okuduğum analog datayı kontrol katından ekranlı karta, set değerlerini ise ekranlı karttan kontrol kartına aktarmaya çalışmaktayım. sıcaklık kontrolleri ve set menuleri hepsi hali hazırda sorunsuz çalışıyor. tek takıldığım nokta karşılıklı olarak bu dataların transferi. kartlar yurt dışı tasarım ve yazılım sorunlu olduğundan yeniden yazıyorum. Daha önce rs232 çalışmadığım için baya bir forumlarda dolaştım örnekleri denedim pek anlaşılır bir sonuç elde edemedim. fikrim var pratiğim malesef yok. haberleşme detayları dikkat edilmesi noktalar hakkında bilgi alacağım ve 2 yünlü haberleşme için doğru bir örnek için yorumlarınızı beklemekteyim teşekkürler.
5388110116 [email]mertsubasili@hotmail.com[/email] / ABB Control Builder AC500. ABB HMI Scada. Siemens Wincc Scada. Zenon Scada. OPC Haberlesme. Picbasic. Ares - Isis

makine_terbiyecisi

#1
Alıntı yapılan: mert53 - 20 Aralık 2017, 02:23:53
çok çok uzun bir aradan sonra tekrar selamlar

2 adet 18f4520 arasında haberlesme yapmaya çalışmaktayım. 10 adet okuduğum analog datayı kontrol katından ekranlı karta, set değerlerini ise ekranlı karttan kontrol kartına aktarmaya çalışmaktayım. sıcaklık kontrolleri ve set menuleri hepsi hali hazırda sorunsuz çalışıyor. tek takıldığım nokta karşılıklı olarak bu dataların transferi. kartlar yurt dışı tasarım ve yazılım sorunlu olduğundan yeniden yazıyorum. Daha önce rs232 çalışmadığım için baya bir forumlarda dolaştım örnekleri denedim pek anlaşılır bir sonuç elde edemedim. fikrim var pratiğim malesef yok. haberleşme detayları dikkat edilmesi noktalar hakkında bilgi alacağım ve 2 yünlü haberleşme için doğru bir örnek için yorumlarınızı beklemekteyim teşekkürler.

Yaptığın araştırmalar doğrultusunda yanlış dahi olsa bir kod çalışması yaptıktan sonra kodu buraya atarsan daha çok yardımcı olunur.
Örneğin şu kodu ne işe yarar bu parametre ne işe yarar diye sormanı bekliyorum.

- rs232 8 bitlik data gönderebilir tek seferde.
- rs232 haberleşme hızını 9600 baud hızında yaparsan daha sağlıklı olur. Çok hızlı çalışmada sıkıntılar doğurabilir.
- rs232 kullanırken receiver ucundan data alımını interrupt ile yap.

iyi çalışmalar.
# ÖĞRENELİM, ÖĞRETELİM #

mert53

#2
selamlar
char olarak data gönderip alabiliyorum. bunu ardı ardına byte transferinde nasıl böleceğimi bulamadım aslında. desimal okumakta zorlanıyorum.


TX Demo:
#include <18F4520.h> 
#device adc=10 
#include <stdio.h> 
#include <math.h> 
#include <kbd.c> 

#FUSES NOWDT                    //No Watch Dog Timer 
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale 
#FUSES INTRC_IO//XT                       //High speed Osc (> 4mhz) 
#FUSES NOPROTECT                //Code not protected from reading 
#FUSES NOBROWNOUT               //No brownout reset 
#FUSES BORV21                   //Brownout reset at 2.5V 
#FUSES NOPUT                    //No Power Up Timer 
#FUSES NOCPD                    //No EE protection 
#FUSES STVREN                   //Stack full/underflow will cause reset 
#FUSES NODEBUG                  //No Debug mode for ICD 
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O 
#FUSES NOWRT                    //Program memory not write protected 
#FUSES NOWRTD                   //Data EEPROM not write protected 
#FUSES IESO                     //Internal External Switch Over mode enabled 
#FUSES FCMEN                    //Fail-safe clock monitor enabled 
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET 
#FUSES NOWRTC                   //configuration not registers write protected 
#FUSES NOWRTB                   //Boot block not write protected 
#FUSES NOEBTR                   //Memory not protected from table reads 
#FUSES NOEBTRB                  //Boot block not protected from table reads 
#FUSES NOCPB                    //No Boot Block code protection 
#FUSES LPT1OSC                  //Timer1 configured for low-power operation 
#FUSES MCLR                     //Master Clear pin enabled 
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled 



#define setup_oscillator( OSC_8MHZ );
#define setup_timer_0 (RTCC_INTERNAL | RTCC_8_BIT);

#use delay(clock=8000000,RESTART_WDT)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8, stop=1,RESTART_WDT,ERRORS) 

#define use_portb_kbd TRUE

#define LCD_ENABLE_PIN  PIN_E0                                    ////
#define LCD_RS_PIN      PIN_E1                                    ////
#define LCD_RW_PIN      PIN_E2                                    ////
#define LCD_DATA4       PIN_D4                                    ////
#define LCD_DATA5       PIN_D5                                    ////
#define LCD_DATA6       PIN_D6                                    ////
#define LCD_DATA7       PIN_D7 
#define LCD_LINE_LENGTH 20
#include <lcd.c> 
byte x=0;


#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1,stream=USART1) 
#define BUFFER_SIZE 80
BYTE  buffer[BUFFER_SIZE];

#byte INTCON =0X80//
#byte PIE1 = 0X10

char data;
int1 string_alindi=0;
int8 index;

#int_rda
void seri_kesme(void)
{
data=getc();
if(index<BUFFER_SIZE)
{
buffer[index]=data;
index++;
}
output_toggle(pin_c5);
if(data==13)
{
index=0;
string_alindi=1;
}}

void main(void)
{
byte c;
port_b_pullups(TRUE);

   enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver
   
   lcd_init();
   while(TRUE){
   enable_interrupts(int_rda); // int_rda kesmesi aktif 
   output_toggle(pin_a0);
   delay_ms(1500);
   x=x+1;
      if (x>13)
      {
      x=0;
      }
   
   lcd_gotoxy(1,2);
   printf(lcd_putc, "gonder %2u ",x);
      c++;
   lcd_gotoxy(21,1);
   printf(lcd_putc, "icdongu %2u   ",c);
   
   putc(0b01010101);
   putc('X');
   putc('A');
   delay_ms(50);

if (string_alindi==1)
{
lcd_gotoxy(21,2);
printf(lcd_putc," %s", buffer); //temizle, yaz
string_alindi=0;
buffer[0]=0;buffer[1]=0;buffer[2]=0;buffer[3]=0;buffer[4]=0;buffer[5]=0;buffer[6]=0;//temizle//burada buffer temizlenebilir
}             
}}
5388110116 [email]mertsubasili@hotmail.com[/email] / ABB Control Builder AC500. ABB HMI Scada. Siemens Wincc Scada. Zenon Scada. OPC Haberlesme. Picbasic. Ares - Isis

fide

Merhaba. Öncelikle aynı şekilde 2 pic mcuyu haberleştirmeye çalıştım. Yaşadığım sıkıntı pic mculardan birini programlarken diğerinin kitlenmesi idi. Bu normal kullanımda da karşına çıkar. Makinayı açarsın, pic mcunun biri diğerinden önce açılır. Diğeri genüz açılmamıştır. Tx ucu high seviyede değildir. İlk açılan pic mcu seri port kesmesi geldi diye rda rutine gidip okuma yapmaya çalışır. Gelen veri yoksa kitlenir. Devre çizerken bu aklıma gelmedi.
Başka bir çözüm buldum. Ana mcu diğer mcunun birer pinini birbirine bağlayıp pulldown yaptım. Ana mcu açılıp veri almaya hazır hale gelince bu pini high yapıyor. Diğer mcuya bağlı pin de giriş olarak tanımlı. Pin high olunca rda interrupt kesmeyi aktif ediyor. Pin low ise kesmeyi padif yapıyor.
Muhtemelen kod geliştirirken aynı sıkıntıyla karşılaşırsın.
Tam test etmedim ama en azından açılıştaki gecikmeyi bu yöntemle bypass edersin.
Kartlar arası mesafe varsa sn75179 yada max485 gibi bir düzenekle rs485 çevrimi, karşıda da tersini yaparsan mesafe ve gürültü olayını asgariye indirebilirsin.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

mert53

seri haberleşme hakkında basit ama etkili yorumda bulunabilecek hiç kimse yoksa gerçekten şaşırmış durumdayım.
5388110116 [email]mertsubasili@hotmail.com[/email] / ABB Control Builder AC500. ABB HMI Scada. Siemens Wincc Scada. Zenon Scada. OPC Haberlesme. Picbasic. Ares - Isis

RaMu


Alıntı yapılan: RaMu
CcsC de değişken tipleri:


int1              bir_bit;                     //        0         yada       1
int8              isaretli_tams=-128;         //     -128         dan     +127
unsigned int8     isaretsiz_tams=255;         //        0         dan     255
int16             isaretli_uzun_tams=-32768;  //   -32768         den     +32767
unsigned int16    isaretsiz_uzun_tams=65535;  //        0         dan     65535
float32           kesirli=-12345678.08;                 //-1.5 x 10üzeri45  den     3.4 x 10üzeri38 *21474833.92|-21474836.48*
int32             isaretli_cok_uzun_tams=-2147483648;     //   -2 147 483 648    den     2 147 483 647
unsigned int32    isaretsiz_cok_uzun_tams=4294967295;    //        0         dan     4 294 967 295
char              karakter;
//float32 printf ile -21474836.48 > 21474833.92

[/size]



Tanımladığın buffer dizisi ve bazı değişkenlerin tanımından problem kaynaklanıyor olabilir,
#byte aslında başka bir iş için kullanılıyor.
http://www.ccsinfo.com/content.php?page=syntax-functions
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

mert53

#6
uğraşmalara karşın aşağıdaki kodlar ile çalışır bir şeyler elde ettim. çok doğrudur harikadır diyemem hataları var yeni yeni ccs c ile çalışıyorum. datalar bir kaç cevrimde ulaşıyor. bu benim için sorun değil geç ama doğru ulaşması gerekiyor. bunun için analog datalarımın arasında yazdığım A B C v.b. karakterlerin hepsi doğru ise datayı işleme aldım o mantıkla çalışacağını düşünüyorum.


TX
#include <18F4520.h> 
#device adc=10 
#include <stdio.h> 
#include <math.h> 
#include <kbd.c> 


#FUSES NOWDT                    //No Watch Dog Timer 
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale 
#FUSES INTRC_IO//XT                       //High speed Osc (> 4mhz) 
#FUSES NOPROTECT                //Code not protected from reading 
#FUSES NOBROWNOUT               //No brownout reset 
#FUSES BORV21                   //Brownout reset at 2.5V 
#FUSES NOPUT                    //No Power Up Timer 
#FUSES NOCPD                    //No EE protection 
#FUSES STVREN                   //Stack full/underflow will cause reset 
#FUSES NODEBUG                  //No Debug mode for ICD 
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O 
#FUSES NOWRT                    //Program memory not write protected 
#FUSES NOWRTD                   //Data EEPROM not write protected 
#FUSES IESO                     //Internal External Switch Over mode enabled 
#FUSES FCMEN                    //Fail-safe clock monitor enabled 
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET 
#FUSES NOWRTC                   //configuration not registers write protected 
#FUSES NOWRTB                   //Boot block not write protected 
#FUSES NOEBTR                   //Memory not protected from table reads 
#FUSES NOEBTRB                  //Boot block not protected from table reads 
#FUSES NOCPB                    //No Boot Block code protection 
#FUSES LPT1OSC                  //Timer1 configured for low-power operation 
#FUSES MCLR                     //Master Clear pin enabled 
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled 






#define setup_oscillator( OSC_8MHZ );
#define setup_timer_0 (RTCC_INTERNAL | RTCC_8_BIT);


#use delay(clock=8000000,RESTART_WDT)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8, stop=1,RESTART_WDT,ERRORS) 


#define use_portb_kbd TRUE


#define LCD_ENABLE_PIN  PIN_E0                                    ////
#define LCD_RS_PIN      PIN_E1                                    ////
#define LCD_RW_PIN      PIN_E2                                    ////
#define LCD_DATA4       PIN_D4                                    ////
#define LCD_DATA5       PIN_D5                                    ////
#define LCD_DATA6       PIN_D6                                    ////
#define LCD_DATA7       PIN_D7 
#define LCD_LINE_LENGTH 20
#include <lcd.c> 


int8 x=0;
int8 f=0;
int8 i=0;


#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1,stream=USART1) 
#define BUFFER_SIZE 96
BYTE  buffer[BUFFER_SIZE];


#byte INTCON =0X80//
#byte PIE1 = 0X10


char data;
int1 string_alindi=0;
int8 index;


#int_rda
void seri_kesme(void)
{
data=getc();
if(index<BUFFER_SIZE)
{
buffer[index]=data;
delay_us(50);
index++;
}
output_toggle(pin_c5);


if(data==13)
{
index=0;
x=x+1;
string_alindi=1;
}


}


void main() {
lcd_init();
set_tris_b(0b00001111);// butonlar
enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver
enable_interrupts(GLOBAL);
lcd_putc("\f");
   while(1)   // sonsuz döngü
   {
   enable_interrupts(int_rda); // int_rda kesmesi aktif 
   output_toggle(pin_a0);
   
   if (input(pin_b0) == 1) 
   {
        f=1;
   }
   else
   {
        f=0;
   } 
 
   x++;
   delay_ms(1500);
   printf("A%cB%cC%cX\n\r",(char)x,(char)i,(char)f);
   
if (string_alindi==1)
{
   if(((char)buffer[0]=='A') && ((char)buffer[2]=='B') && ((char)buffer[4]=='C'))
   {
   lcd_gotoxy(21,2);
   printf(lcd_putc,"\f");
   lcd_gotoxy(21,2);
   printf(lcd_putc,"%c,%u,%c,%u,%c,%u,%c"buffer[0],(int)buffer[1],buffer[2],(int) buffer[3], buffer[4],(int)buffer[5],buffer[6]); //temizle, yaz
   }
   string_alindi=0;
   buffer[0]=0;buffer[1]=0;buffer[2]=0;buffer[3]=0;buffer[4]=0;buffer[5]=0;buffer[6]=0;//temizle//burada buffer temizlenebilir


}


}


}



RX
#include <18F4520.h> 
#device adc=10 
#include <stdio.h> 
#include <math.h> 
#include <kbd.c> 

#FUSES NOWDT                    //No Watch Dog Timer 
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale 
#FUSES INTRC_IO//XT                       //High speed Osc (> 4mhz) 
#FUSES NOPROTECT                //Code not protected from reading 
#FUSES NOBROWNOUT               //No brownout reset 
#FUSES BORV21                   //Brownout reset at 2.5V 
#FUSES NOPUT                    //No Power Up Timer 
#FUSES NOCPD                    //No EE protection 
#FUSES STVREN                   //Stack full/underflow will cause reset 
#FUSES NODEBUG                  //No Debug mode for ICD 
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O 
#FUSES NOWRT                    //Program memory not write protected 
#FUSES NOWRTD                   //Data EEPROM not write protected 
#FUSES IESO                     //Internal External Switch Over mode enabled 
#FUSES FCMEN                    //Fail-safe clock monitor enabled 
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET 
#FUSES NOWRTC                   //configuration not registers write protected 
#FUSES NOWRTB                   //Boot block not write protected 
#FUSES NOEBTR                   //Memory not protected from table reads 
#FUSES NOEBTRB                  //Boot block not protected from table reads 
#FUSES NOCPB                    //No Boot Block code protection 
#FUSES LPT1OSC                  //Timer1 configured for low-power operation 
#FUSES MCLR                     //Master Clear pin enabled 
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled 



#define setup_oscillator( OSC_8MHZ );
#define setup_timer_0 (RTCC_INTERNAL | RTCC_8_BIT);

#use delay(clock=8000000,RESTART_WDT)
//#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8, stop=1,RESTART_WDT,ERRORS) 

#define use_portb_kbd TRUE

#define LCD_ENABLE_PIN  PIN_E0                                    ////
#define LCD_RS_PIN      PIN_E1                                    ////
#define LCD_RW_PIN      PIN_E2                                    ////
#define LCD_DATA4       PIN_D4                                    ////
#define LCD_DATA5       PIN_D5                                    ////
#define LCD_DATA6       PIN_D6                                    ////
#define LCD_DATA7       PIN_D7 
#define LCD_LINE_LENGTH 20
#include <lcd.c> 

#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1,stream=USART1) 
#define BUFFER_SIZE 96
BYTE  buffer[BUFFER_SIZE];

#byte INTCON =0X80//
#byte PIE1 = 0X10

char data;
int1 string_alindi=0;
int8 index;
int8  x=255;

#int_rda
void seri_kesme(void)
{
data=getc();
if(index<BUFFER_SIZE)
{
buffer[index]=data;
delay_us(50);
index++;
}
output_toggle(pin_c5);
if(data==13)
{
index=0;
x=x-1;
string_alindi=1;
}}

void main(void)
{
lcd_init();
byte c;
port_b_pullups(TRUE);
enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver
   
   
   while(TRUE){
   enable_interrupts(int_rda); // int_rda kesmesi aktif 
   output_toggle(pin_a0);   
   if (x<1)
      {
      x=255;
      }
  delay_ms(5);
  lcd_gotoxy(1,2);
  printf(lcd_putc,"gonder %2u ",x);
  c++;
  lcd_gotoxy(21,1);
  printf(lcd_putc,"icdongu %2u   ",c);
  delay_ms(500);
  printf("A%cB%cC%cX\n\r",(char)x,(char)x,(char)x);  

if (string_alindi==1)
{
if(((char)buffer[0]=='A') && ((char)buffer[2]=='B') && ((char)buffer[4]=='C'))
{
lcd_gotoxy(21,2);
printf(lcd_putc,"\f");
lcd_gotoxy(21,2);
printf(lcd_putc,"%c,%u,%c,%u,%c,%u,%c"buffer[0],(int)buffer[1],buffer[2],(int) buffer[3], buffer[4],(int)buffer[5],buffer[6]); //temizle, yaz
}
string_alindi=0;
buffer[0]=0;buffer[1]=0;buffer[2]=0;buffer[3]=0;buffer[4]=0;buffer[5]=0;buffer[6]=0;//temizle//burada buffer temizlenebilir

}  

}

}


Şema https://ibb.co/hLmBQR
5388110116 [email]mertsubasili@hotmail.com[/email] / ABB Control Builder AC500. ABB HMI Scada. Siemens Wincc Scada. Zenon Scada. OPC Haberlesme. Picbasic. Ares - Isis