Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

16/10/2016 #41


una consulta yo veo que en el programa que enviaste pusiste msg[10] pregunto porque no manejo mucho string no es como un BASIC que podes tu nombre y lo envia C es mas rompe con eso y mucho no lo se, pero en deduccion veo que podes enviar 9 caracteres entiendo, entonces : el programa que envia dice msg[0]='a' ; si quiero enviar dos letras ejemplo a1 pondria msg="a1", y con eso listo error el compilador no me tira calculo que esta bien, y en el caso receptor puse *msg="a1" porque si no coloco asterisco me da error, pero veo que no funciona , el receptor que enviaste pusiste msg[2]='a', pero si recibo dos letras como "a1" no me llega noto
16/10/2016 #42
Moderador

Avatar de D@rkbytes

Por eso te mencioné que la función usa un arreglo pasado cómo puntero.
También dije que para usar un int y no un arreglo, se tendrían que realizar más modificaciones.

Ya tienes la base, sólo te resta modificar la librería.
20/10/2016 #43


Hola aqui intente hacer una respuesta con lo que me enseñaste, con la unica modificacion que hice ahora que fue agregar dos leds en el receptor y cuando envio "L1ON" del master enciende el Led 1, "L2ON" enciende el led dos en el esclavo y "L3OFF" apaga los dos medio que me esta funcionando o quiero entender que la respuesta del esclavo hacia el master llega porque sino no me enviaria el otro dato pero noto que no me encienden los leds como quiero como que por momentos engancha y momentos no algo no me esta engranando ahi.
Siendo que lo que envia el master lo envia bien y en el esclavo estoy viendo como llega por ejemplo el "L1ON"

lo raro que cuando uso el comando switch funciona o tiende a funcionar con el IF no en el esclavo eso.

MASTER
Código:
#include <16F818.h>
#device  *=16
#ignore_warnings  201, 216
#fuses   NOWDT
#use     delay(internal = 8MHz)  // Usar 20 MHz para montaje en físico.
#use     rs232(baud=9600, xmit=PIN_B2, rcv=PIN_B1, stream=PC)

#define  RS485_RX_BUFFER_SIZE 12
#define  RS485_USE_EXT_INT    TRUE


#define RS485_RX_PIN       PIN_B0   // Data receive pin
#define RS485_TX_PIN       PIN_B7   // Data transmit pin
#define RS485_ENABLE_PIN   PIN_B3   // Controls DE pin.  RX low, TX high.
#define RS485_RX_ENABLE    PIN_B2   // Controls RE pin.  Should keep low.



int8 OUR_RS485_ID = 0x10;
#define RS485_ID OUR_RS485_ID

#include <rs485.c>
#include <stdlib.h>

int1 flag_rs485=0;
int8 i;
char msg[10];
char dato[10];

#INT_TIMER1
void timer1_isr()
{
 //  int8 i;

   if(rs485_get_message(msg, FALSE))
   {
      flag_rs485 = 1;
       for(i=0; i < msg[1]; ++i)
         dato[i] = (msg[i+2]);
      //printf("\n\r%d: ", msg[0]);
      /*
      for(i=0; i < msg[1]; ++i)
         putc(msg[i+2]);
         printf("\n\r");
         */
   }
}


void clean_msg (void)
{
   for(i=0;i<sizeof(msg);i++)
   {
      msg[i] = 0x00;
      dato[i] = 0x00;
   }
}

void RS485send(char* s, int8 id)
{
   int8 size;

   for(size=0; s[size]!='\0'; ++size);

   rs485_wait_for_bus(FALSE);

   while(!rs485_send_message(id, size, s))
      delay_ms(OUR_RS485_ID);
           
}

int1 ask()
{
      if(flag_rs485)
      {
         disable_interrupts(INT_TIMER1);
         flag_rs485 = 0;
         
         if(msg[2] == '1')
            output_high(PIN_B4);         
         
         delay_ms(50);
         output_low(PIN_B4); 
         delay_ms(50);
         
         clean_msg();
        // rs485_wait_for_bus(FALSE);
         enable_interrupts(INT_TIMER1);
         delay_ms(100);      
         return true;
      }
}


void main()
{
   //int8 i;
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
   //enable_interrupts(INT_RDA);
//   enable_interrupts(GLOBAL);
   rs485_init();
   enable_interrupts(INT_TIMER1);
   
   while (true)
   {
      //if(!input(PIN_A2))
      //{
      do
      {
         msg = "L1ON";
         RS485send(msg, 0x12);
         delay_ms(150); 
      }
      while(!ask());
      //   while(!input(PIN_A2));
      //}

     
      do
      {
         msg = "L2ON";
         RS485send(msg, 0x12);
         delay_ms(150); 
      }
      while(!ask());
      
      do
      {
         msg = "L3OFF";
         RS485send(msg, 0x12);
         delay_ms(150); 
      }
      while(!ask());
      

   }
}


ESCLAVO
Código:
#include <16F887.h>
#device  *=16
#ignore_warnings  201, 216
#fuses   NOWDT
#use     delay(internal = 8MHz)  // Usar 20 MHz para montaje en físico.

#define  RS485_RX_BUFFER_SIZE 12
#define  RS485_USE_EXT_INT    TRUE

#define RS485_RX_PIN       PIN_B0   // Data receive pin
#define RS485_TX_PIN       PIN_B1   // Data transmit pin
#define RS485_ENABLE_PIN   PIN_B7   // Controls DE pin.  RX low, TX high.
#define RS485_RX_ENABLE    PIN_B6   // Controls RE pin.  Should keep low.


int8 OUR_RS485_ID = 0x12;
#define RS485_ID OUR_RS485_ID


#include <rs485.c>
//#include <string.h>

int1 flag_rs485 = 0;
int8 i;
char msg[10];
char dato[10];

#INT_TIMER1
void timer1_isr()
{ 
   
   if(rs485_get_message(msg, FALSE))
   {
      flag_rs485 = 1;
 
      for(i=0; i < msg[1]; ++i)
         {dato[i] = (msg[i+2]);}

   }
}

void clean_msg (void)
{
   for(i=0;i<sizeof(msg);i++)
   {
      msg[i] = 0x00;
      dato[i] = 0x00;
   }
}

void RS485send(char* s, int8 id)
{
   int8 size;

   for(size=0; s[size]!='\0'; ++size);

   rs485_wait_for_bus(FALSE);

   while(!rs485_send_message(id, size, s))
      delay_ms(OUR_RS485_ID);
}

void main()
{  char* d;
   output_low(PIN_A0);
   
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
//   enable_interrupts(GLOBAL);
   rs485_init();
   enable_interrupts(INT_TIMER1);

   while (true)
   {
      if(flag_rs485)
      {
         disable_interrupts(INT_TIMER1);
         flag_rs485 = 0;

         //if(msg[2] == 'L'){
         //   switch(msg[3]){
         //      case '1': output_high(PIN_A0);
         //               break;
         //      case '2': output_high(PIN_A1); 
          //              break;
         //      case '3': output_low(PIN_A0); 
         //                output_low(PIN_A1); 
         //                break;
         //   }*/
            
            switch(dato){
               case "L1ON" :   output_high(PIN_A0);  break;
               case "L2ON" :   output_high(PIN_A1);   break;
               case "L3OFF" :   output_low(PIN_A0); output_low(PIN_A1);   break;
            }
//           if(dato=="L1ON")
//              output_high(PIN_A0);
//           if(dato=="L2ON")
//              output_high(PIN_A1);
//           if(dato=="L3OFF")
//               {output_low(PIN_A0); output_low(PIN_A1);}
           
           // }
         }
      
            delay_ms(300);
            clean_msg();
            enable_interrupts(INT_TIMER1);
            msg[0] = '1';
            RS485send(msg, 0x10);
   }
 }
la ASK se me ocurrio hacerlo asi y no saldria del DO hasta que no halla una respuesta capaz hay algo mas practico
int1 ask()
{
if(flag_rs485)
{
disable_interrupts(INT_TIMER1);
flag_rs485 = 0;

if(msg[2] == '1')
output_high(PIN_B4);

delay_ms(50);
output_low(PIN_B4);
delay_ms(50);

clean_msg();
// rs485_wait_for_bus(FALSE);
enable_interrupts(INT_TIMER1);
delay_ms(100);
return true;
}
}

do
{
msg = "L1ON";
RS485send(msg, 0x12);
delay_ms(150);
}
while(!ask());
Archivos Adjuntos
Tipo de Archivo: zip master-slave 01.zip (187,0 KB (Kilobytes), 9 visitas)
20/10/2016 #44
Moderador

Avatar de D@rkbytes

Recuerda que es un arreglo, no puedes comparar de esa forma.
El arreglo tendrá lo siguiente:

Entonces es lógico que la comparación falle si haces...
case "L1ON" : output_high(PIN_A0); break;

Para eso tendrás que formatear la cadena usando strcpy y después la comparas con strcmp.
Imágenes Adjuntas
Tipo de Archivo: jpg Arreglo msg.jpg (58,4 KB (Kilobytes), 14 visitas)
20/10/2016 #45


Si observas msg guarda datos de longitud, dirección y dato, lo que hice es utilizar una variable dato donde almaceno el dato puro sin dirección ni longitud, es strcpy no copia string? Entonces la consulta teniendo la variable dato con el dato puro no alcanza? Strcmp compara string pero se puede usar por ejemplo if(strcmp(dato, "L1ON")==0) voy a probar la verdad no lo use eso pero creo que es algo así

Enviado desde mi XT1058 mediante Tapatalk
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.