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), 15 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), 79 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
03/03/2017 #46


aqui subo el Zip con todo el contenido Quiero comunicar como decia varios modulos con un master donde se comunican por RS485, donde si preciono el switch de un modulo que el master sepa que se preciono y se encendio tal salida de ese modulo como tambien el master si quiere apagar una salida de tal modulo lo pueda hacer, me explico? adjunto archivos hay dos carpetas de modulos porque aun estoy indeciso su utilizar un modelo u otro pero hago los dos modelos y despues decidire.
Archivos Adjuntos
Tipo de Archivo: zip smartcenter 002.zip (339,5 KB (Kilobytes), 11 visitas)
08/03/2017 #47


HOLA Gente del foro, solucione una parte del problema pero sigo con inconvenientes!, tengo una central que seria el Master y varios modulos Esclavos, por razones de pruebas solo hice uno en proteus, entonces en el modulo Esclavo preciono el primer Boton, enciende una salida del modulo y le avisa a la central y puse un testigo que me avisa que se encendio una luz del modulo el testigo en el Master esta en PIN_A4 , (mas adelante escribira en un display por ahora solo gice eso para hacerlo mas rapido), pero bueno ahora al reves, preciono un Boton del MASTER o CENTRAL que entra por PIN_B7 (lo hago asi para probar, en realidad tendria que ser por bluetooth), y me tiene que encender o apar el pin_C0 del modulo 1.
la realidad no lo hace, es mas se me traba el modulo 1 y ya no me responde nada porque sucede eso? me podrian ayudar?, para mi se queda esperando o en algun loop o algo porque para que no responda. y cuando preciono en el modulo tampoco envia al master en pocas palabras no funciona mas.

Para probarlo adjunto un zip, haganlo correr y precionen el primer boton del MOdulo 1 y observen que se enciende PIN_C0 del modulo y PIN_A4 del master, pero preciono el boton 1 del Master y no enciende o apaga el PIN_C0 del modulo sino que ya tampoco funciona mas el modulo ni envia al master.
Archivos Adjuntos
Tipo de Archivo: zip smartcenter 003.zip (399,4 KB (Kilobytes), 11 visitas)
Hace 3 Semanas #48


Hola amigos después de haber realizado una comunicación exitosa en CCS compiler con la configuración #use rs232 estoy profundizando en el caso para estar mas claro, les agradezco sus aportes,
Por ejemplo
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,BITS=8,ERRORS, PARITY=N, stream=COM1)

Baud = 9600. De estas instrucción solo se que es la cantidad de bit por segundo que puedo trasmitir.
Le agradezco que me corrijan o que aporten mas a este información.

Xmit,rcv es donde colo los pines de trasmisión Tx y Rx

Bits: entiendo que esto se usa para saber cuantos bits se envían en el bytes, y pueden ser configurados con 8,7,6 y 5.
Entiendo que este tipo de transmisión se da en bytes. Por ende puedo deducir que puedo trasmitir hasta 1200 bytes por segundo ya que tengo definido que se trasmitan 9600 bits por segundo.
Le agradezco que me corrijan o que aporten mas a este información.

PARITY= N *Los bits de paridad se utilizan como la forma más simple de*código para la detección de error.*
Tengo entendido que hay dos tipo de paridad y para este caso yo indico que no utilizo este sistema de detección de errores.
Entiendo que el mismo solo se usa para transmisión.
Le agradezco que me corrijan o que aporten mas a este información.
N = No se utiliza paridad
E = Patidad Par
O = Paridad Impar.

ERRORS: De esta instrucción lo que conozco es que se usa para detectar errores de trasmisión y si en alguna interrupción que se este esperando el dato trasmitido existe por alguna razón un error y se cuelga la comunicación, esta función libera le ataco. Pero a subes esta instrucción nos permite usar una variable RS232_ERRORS de los cuales no conozco casi nada, solo se que se usan para apañar el mensaje de error para poder presentarlo en un lcd o algo así.
#bit ninth_bit = RS232_ERRORS.7
#bit collision = RS232_ERRORS.6
Le agradezco que me corrijan o que aporten mas a este información.

Si puede hacer un ejemplo de como se usan las variables RS232_ERRORS y que significa .7 y .6 se los voy a agradecer.
Hace 3 Semanas #49
Moderador

Avatar de D@rkbytes

En la ayuda del compilador se encuentra todo lo que necesitas saber sobre #USE RS232.
Tan sólo presiona la tecla F1 y aparecerá.
Ahí verás un menú con varias pestañas, selecciona Índice y podrás realizar una búsqueda escrita o deslizante.
También puedes obtener información situando el cursor sobre alguna instrucción y después presionar la tecla F1.
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 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.