TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: alfredoenvalpo en 25 de Octubre de 2006, 15:11:27

Título: Estoy implementando MODBUS en PIC
Publicado por: alfredoenvalpo en 25 de Octubre de 2006, 15:11:27
Hola!  :shock:
Me encuentro implementando el protocolo Modbus en un pic18f452

La idea de este mensaje es compartir experiencia y saber si hay alguien haciendo
lo mismo.

Me encuentro implementando las primeras funciones, read coils y read discrete
inputs las tengo hecha aunque aun no las he probado grabadas en el microcontrolador.

Espero comentarios,.  :-/

Saludos  ALFREDO

Título: Re: Estoy implementando MODBUS en PIC
Publicado por: micro_cadaver en 25 de Octubre de 2006, 17:02:53
hola amigo, lei tu post y me carcome la duda, q es un MODbus?
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: alfredoenvalpo en 25 de Octubre de 2006, 17:21:05
hola micro_cadaver

modbus es un protocolo de comunicacion industrial, utilizado para control y monitoreo
de procesos, suele ser conocido como el standard de facto. Permite comunicacion maestro-esclavo
entre dispositivos, similar a cliente servidor.

En internet, encontrarás mucha información,

Saludos!  :-/
Alfredo
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: micro_cadaver en 25 de Octubre de 2006, 17:55:22
gracias amigo  :-/
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: GustavoT en 26 de Octubre de 2006, 12:27:02
Me gustaria estar al tanto de tu proyecto, me parece muy interesante y util, cada vez que veo un PLC  me carcomen las ganas de conectarlo con un pic usando justamente modbus.

Cuenta conmigo en lo que te haga falta

Suerte

Gustavo T
Tucuman Argentina
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: ALE1973 en 26 de Octubre de 2006, 15:48:19
Yo implemente algunas de las funciones de modbus en un pic F873, dejame buscar el as, y lo posteo para ver... no esta nada optimizado... pero anda...

Saludos.
Alejandro
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: alfredoenvalpo en 26 de Octubre de 2006, 18:28:58
Gracias por el apoyo, me mantendré posteando en este topic conforme vaya avanzando.

ALE1973, estoy programando en C, pero de todas maneras espero tu comentario para echarle un vistazo.


SALUDOS!
Alfredo  :-)
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: alfredoenvalpo en 27 de Octubre de 2006, 23:45:31
GustavoT o quien pueda ayudarme,

necesito ayuda para implementar interrupciones, no deberia ser complicado, pero aun no encuentro
como escribir el codigo en C para implementar varias rutinas de interrupción solo encuentro como
se implementa una de alta prioridad y una de baja prioridad en un mismo programa, pero quiero
implementar varias de baja prioridad por ejemplo recepcion serial y timer 0..

Gracias!!  :-/
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: alfredoenvalpo en 31 de Octubre de 2006, 18:09:02
Hola ya he implementado hasta la funcion read holding registers. (03)...
Eso si estoy haciendo el desarrollo sin "grabar" el codigo en el micro,
tengo pendiente la tarea de crear rutinas de interrupcion que vayan recibiendo
bytes y contando el tiempo.

La duda la puse en el post anterior,..un poco de ayuda por favor  :mrgreen:
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: Zaphyrus en 31 de Octubre de 2006, 18:26:38
Hola Alfredoenvalpo. ¿Que compilador de C estas usando CSS-C, Microchip C18 o Hitech C18?
Quería saber para ver si te puedo dar una mano.

Saludos.

Martín
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: alfredoenvalpo en 31 de Octubre de 2006, 22:43:07
Estoy desarrollando el programa con Microchip C18 (Student)
lo que necesito es un ejemplo sobre como se implementan varias rutinas
de interrupcion, se que deberia ser facil pero no he encntrado como hacerlo.

Saludos  :shock:
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: Zaphyrus en 31 de Octubre de 2006, 23:11:47
Alfredoenvalpo, solo he usado el compilador de Hitech pero he visto el código del PicOS18 en donde encontré el asunto de las interrupciones. Si te interesa te dejo el enlace para que lo bajes y lo mires:

http://www.picos18.com/Download/PICos18_v2_09.zip

(http://www.picos18.com/Download/)

Este es el único lugar donde vi algo de eso.

Saludos.

Martín
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: Zaphyrus en 31 de Octubre de 2006, 23:24:56
Acá está el código que te comentaba del PICOS18:

Código: [Seleccionar]
#include "define.h"

/**********************************************************************
 * Function you want to call when an IT occurs.
 **********************************************************************/
  extern void AddOneTick(void);
/*extern void MyOwnISR(void); */
  void InterruptVectorL(void);
  void InterruptVectorH(void);

/**********************************************************************
 * General interrupt vector. Do not modify.
 **********************************************************************/
#pragma code IT_vector_low=0x18
void Interrupt_low_vec(void)
{
   _asm goto InterruptVectorL  _endasm
}
#pragma code

#pragma code IT_vector_high=0x08
void Interrupt_high_vec(void)
{
   _asm goto InterruptVectorH  _endasm
}
#pragma code

/**********************************************************************
 * General ISR router. Complete the function core with the if or switch
 * case you need to jump to the function dedicated to the occuring IT.
 * .tmpdata and MATH_DATA are saved automaticaly with C18 v3.
 **********************************************************************/
#pragma code _INTERRUPT_VECTORL = 0x003000
#pragma interruptlow InterruptVectorL
void InterruptVectorL(void)
{
  EnterISR();

  if (INTCONbits.TMR0IF == 1)
    AddOneTick();
/*Here is the next interrupts you want to manage */
/*if (INTCONbits.RBIF == 1)                      */
/*  MyOwnISR();                                  */

  LeaveISR();
}
#pragma code

/* BE CARREFULL : ONLY BSR, WREG AND STATUS REGISTERS ARE SAVED  */
/* DO NOT CALL ANY FUNCTION AND USE PLEASE VERY SIMPLE CODE LIKE */
/* VARIABLE OR FLAG SETTINGS. CHECK THE ASM CODE PRODUCED BY C18 */
/* IN THE LST FILE.                                              */
#pragma code _INTERRUPT_VECTORH = 0x003300
#pragma interrupt InterruptVectorH nosave=FSR0, TBLPTRL, TBLPTRH, TBLPTRU, TABLAT, PCLATH, PCLATU, PROD, section(".tmpdata"), section("MATH_DATA")
void InterruptVectorH(void)
{
  if (INTCONbits.INT0IF == 1)
    INTCONbits.INT0IF = 0;
}
#pragma code



extern void _startup (void);
#pragma code _RESET_INTERRUPT_VECTOR = 0x003400
void _reset (void)
{
    _asm goto _startup _endasm
}
#pragma code


/* End of file : int.c */


Saludos.

Martín
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: alfredoenvalpo en 01 de Noviembre de 2006, 15:32:13
Martin:

Muchas gracias por tu respuesta!! es justo lo que estaba buscando
he perdido mucho tiempo tratando de encontrar como hacer eso..

Cuando lo pruebe te avisaré en este topic

Gracias de nuevo  :-/
Saludos!!

Alfredo
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: Zaphyrus en 01 de Noviembre de 2006, 16:32:26
Me alegra que te haya servido y yo haya dado justo con lo que necesitabas :-/ Hace tiempo que quiero aprender el Microchip C18 Students pero no tengo tiempo. Me parece un compilador bastante poderoso porque te permite tocar más a bajo nivel que los otros.

Saludos.

Martín
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: Sasián en 01 de Noviembre de 2006, 17:24:02
buenass:
por si os sirve de ayuda hace un par de años trabaje algo con modbus y pic......

///////////////////////////////////////////////////////////////////////////
////                             pic_modbus.C                          ////
////                         esclavo MODBUS para PIC                   ////
////                  por Félix Sasián WWW.PACALACONCURSO.COM          ////
////                                                                   ////
////  rev0: enero 2004                                                 ////
////  - implementados comandos 0x03, 0x04, 0x06 y 0x10                 ////
////  rev1: febrero 2004                                               ////
////  - solucionado bug en rx gracias a los amigos                     ////
////    de foro www.todopic.foro.st                                    ////
////  -Escritura / lectura desde la eeprom via MODBUS DIR >100         ////
////   esta por terminar, solo usar 32 bytes                           ////
////                                                                   ////
////                                                                   ////
////                                                                   ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////                                                                   ////
////                                                                   ////
////        (C) Copyright 2004 www.pacalaconcurso.com                  ////
//// Este codigo puede ser usado, modificado y distribuido libremente  ////
//// sin eliminar esta cabecera y  sin garantía de ningún tipo.        ////
////                                                                   ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
//// usar de esta forma en la int_rda
////#int_rda
////void serial_isr()
//// {
////   while(kbhit())
////     {
////      analiza(getc());
////     }
//// }
////
///////////////////////////////////////////////////////////////////////////
//VARIABLES
//////////////////
//estructura para los datos modbus

struct _modbus
{
int8 address; //mi direccion modbus
char trama[30]; //espacio para almacenar datos del comando que se esta recibiendo
char datos[16]; //espacio para los datos de recibidos por modbus
char datostx[16]; //espacio para los datos a transmitir  por modbus
int16 CRC ; // para calcular el CRC del paquete recibido
int16 comandos; //comandos mandados desde modbus
int1 nuevo_comando; // hay al menos un comando recibido desde modbus
} modbus;

int1 hay_modbus;


/* tenemos 32 bytes de intercambio con modbus.
dejo la primera word (dos primeros bytes para poder recibir 16 comandos desde
modbus */


//alias y defines para pruebas
int8 puntero; //puntero para la lectura de un nuevo comando modbus
int8 puntdatos; //puntero para los datos del comando 0x10
int16 num_datos; //numero de bytes de datos a guardar del comando 0x10
int1 timeout_error,pausa_rx;
//int1 led;
const int8 timeout_rx=5; //timeout para recepcion de mensaje modbus
///////////////


//rutinas

/************************************************************************************
      Mb_test_crc : verifica si el CRC del paquete recibido es correcto
*************************************************************************************
entrada   :
-------
trame     : packet con el crc incluido
n         : longitud del paquete sin el CRC
salida    : 1 = crc erroneo
--------    0 = crc ok
************************************************************************************/
int1 Mb_test_crc(CHAR trame[],int n)
{
   unsigned int16 crc,i,j,carry_flag,a;
   crc=0xffff;
   for (i=0;i<n;i++)
   {
      crc=crc^trame;
      for (j=0;j<8;j++)
      {
         a=crc;
         carry_flag=a&0x0001;
         crc=crc>>1;
         if (carry_flag==1)
            crc=crc^0xa001;
      }
   }
   if ((trame[n+1]!=(crc>>8)) || (trame[n]!=(crc&255)))
      return 1;
   else
      return 0;
}

/************************************************************************************
      Mb_calcul_crc : calcula el CRC de un paquete
*************************************************************************************
entrada   :
-------
trame     : packet con espacio para el crc
n         : longitud del paquete sin el CRC
salida    : CRC
--------
************************************************************************************/
int16 Mb_calcul_crc(CHAR trame[],int n)
{
   int16 crc,carry_flag,a;
   int8 i,j;
   crc=0xffff;
   for (i=0;i<n;i++)
   {
      crc=crc^trame;
      for (j=0;j<8;j++)
      {
         a=crc;
         carry_flag=a&0x0001;
         crc=crc>>1;
         if (carry_flag==1)
            crc=crc^0xa001;
      }
   }
   trame[n+1]=crc>>8;
   trame[n]=crc&255;
   return crc;
}

/************************************************************************************
      comando : mira si se ha recibido algun comando desde modbus y activa el flag
*************************************************************************************
entrada   :
-------
salida    :
--------
************************************************************************************/
void comando()
{
int16 aux;

aux = (modbus.datos[0]<<8)+modbus.datos[1];
modbus.comandos ^= aux;
//se mantiene los comandos que pudieran estar a la espera de ejecutarse
//printf(lcd_putc, "\n %Lx",aux);

if (modbus.comandos >0) modbus.nuevo_comando = true;
   {
   //borramos el area de comandos
   modbus.datos[0] = 0;
   modbus.datos[1] = 0;
   }
}
/************************************************************************************
      modbus : Interpreta los paquetes válidos y envia ack al master
*************************************************************************************
usa la matrices de definicion global trama[] y datos[]
************************************************************************************/
void int_modbus()
{
int8 direccion;  //direccion incicial del registro
int8 longitud,longitud1;  //longitud en decimal de los datos
int8 i,bytes;
direccion =(int8)(modbus.trama[2]<<8)+modbus.trama[3];
longitud=(int8)(modbus.trama[4]<<8)+modbus.trama[5];
switch (modbus.trama[1])
{
      case 0x03:
      case 0x04:
      for (i=0;i<longitud*2;i++)
      {
      if (direccion<100)
      {
         modbus.trama[3+i]=modbus.datostx[direccion*2+i];
        // modbus.trama[4+i*2]=modbus.datostx[direccion*2+i+1];
      }
      else
      {
       modbus.trama[3+i]=read_ext_eeprom(direccion*2+i);
    //   modbus.trama[4+i*2]=read_ext_eeprom(direccion*2+i+1);

      }
      }
      //calcular el CRC
      modbus.trama[2]=longitud*2;//numero de bytes de datos a transmitir
      Mb_calcul_crc(modbus.trama,longitud*2+3);
      longitud1=longitud*2+5;
      for (i=0;i<longitud1;i++)
      {
         printf("%c",modbus.trama);
      }
      break;
      case 0x06:
//guardamos los registros a partir de la direccion indicada
 for (i=0;i<2;i++)
      {
      if (direccion<100)
      modbus.datos[direccion*2+i]=modbus.trama[4+i];
      else
      write_ext_eeprom(direccion*2+i,modbus.trama[4+i]);
      }
      //respuesta al master
      for (i=0;i<8;i++)
      {
         printf("%c",modbus.trama);
      }
      //mirar si hay algun comando nuevo (en la primera word recibida)
      comando() ;
      break;

      case 0x10:
      bytes=modbus.trama[6];
      //guardamos los registros a partir de la direccion indicada
       for (i=0;i<bytes;i++)
      {
      if (direccion<100)
      modbus.datos[direccion*2+I]=modbus.trama[7+i];
      else
      write_ext_eeprom(direccion*2+I,modbus.trama[7+i]);
      }
      //respuesta al master
      //longitud1=num_datos+7;
      //calcular el CRC para la respuesta
      Mb_calcul_crc(modbus.trama,6);
      //mandar la respuesta
      for (i=0;i<8;i++)
      {
         printf("%c",modbus.trama);
      }
      //mirar si hay algun comando nuevo
      comando() ;
         break;
      default:


}
}
/************************************************************************************
      analiza : analiza los caracteres recibidos para montar un paquete
*************************************************************************************
entrada   :
-------
c         : caracter procedente de la usart
salida    : ---
--------
************************************************************************************/

void analiza(char c)
{
switch (puntero)
{
   case 0:// recibo el esclavo a quien va dirigido
   if (c==modbus.address) //si el comando es para mi
   {
   modbus.trama[0]= c;
   puntero+=1;
   }
   else
   {
   puntero =0;
   pausa_rx=true;
   }
   break;
   case 1:// recibo el comando
   if (c == 0X03 ||c==0x04 ||c==0x06||c==0x10 ) //si es un comando conocido
      {
         modbus.trama[1]= c;
         puntero+=1;
      }
   else
   {
   if (c==modbus.address) //si el comando es para mi
         {
         modbus.trama[0]=c;
         puntero=1;
         set_timer1(0);
         }
      else
         {
         puntero=0;
         }
  }
   break;
   case 2:
   modbus.trama[2]=c; //direccion inicial (H)
   puntero+=1;
   break;
   case 3:
   modbus.trama[3]=c; //direccion inicial (L)
   puntero+=1;
   break;
   case 4:
   modbus.trama[4]=c; //Numero de registros (H)
   puntero+=1;
   break;
   case 5:
   modbus.trama[5]=c; //Numero de registros (L)
   puntero+=1;
   break;
   case 6:
      modbus.trama[6]=c; //CRC (H)
      puntero+=1;
      if  (modbus.trama[1] == 0X10)//si se trata del comando 0x10
      {
       // num_datos = (modbus.trama[4]<<8)+modbus.trama[5];
       // num_datos=num_datos*2+2;//datos que faltan por recibir incluido CRC
       num_datos=(int)modbus.trama[6] + 2;
        puntdatos=0;
      }
   break;
   case 7:
   if (modbus.trama[1] == 0X10)//si se trata del comando 0x10
      {
            modbus.trama[7+puntdatos]=c;
            puntdatos+=1;
         if (puntdatos>= num_datos) // si no se han recibido todos los datos
         {
             if (Mb_test_crc(modbus.trama,5+num_datos)==0)
                {
                 int_modbus(); //rutina para interpretar el comando
                 hay_modbus=1;
                }
              puntero=0;
              puntdatos=0; //
         }
      }
   else  // no se trata del comando 0x10
      {
         modbus.trama[7]=c; //CRC (L)
         if (Mb_test_crc(modbus.trama,6)==0)
            {
             int_modbus(); //rutina para interpretar el comando
             hay_modbus=1;
             puntero=0;
            }
         else
            {
            puntero=0; //el CRC no es correcto
            }
      }
   break;
   default:
   puntero =0;
}
}



saludossss
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: Zaphyrus en 01 de Noviembre de 2006, 18:00:00
Que buen empujón para Alfredo!!!  :)

Sasián excelente página web!!!

Saludos.

Martín
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: XLR en 01 de Noviembre de 2006, 19:19:11

Tomando como base la función de Sasián he comunicado el Pic mediante DASMSerial con InTouch sin demasiados problemas.

Como he empleado el 16F877A me encuentro un limitado con la memoria de datos y aún no he podido comprobar el refresco con bloques de datos mas extensos. Es un buen punto de referencia. Gracias Sasián

Saludos
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: alfredoenvalpo en 02 de Noviembre de 2006, 10:12:58
HOLA!

Gracias por la ayuda y por el codigo enviado, si bien debo decir
que ya lo habia visto hace un tiempo en la pagina web, (www.sasian.es)
me sirvió para tener
una idea de como hacer el programa  :-) y de motivación para seguir.

Ahora me encuentro viendo lo de las interrupciones con la ayuda
que me enviaron anteriormente..

Saludos!
Alfredo
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: Sasián en 02 de Noviembre de 2006, 17:59:31
Me alegro que sea de utilidad. la verdad es que no esta demasiado optimizado pero si que funciona, yo lo use para comunicar con una red de S7-200 sin problemas e incluso con el pc via OPC para el labview.

saludos
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: alfredoenvalpo en 02 de Noviembre de 2006, 19:12:41
Sasian,
Estuve buscando en tu codigo como se hizo el manejo de la recepción de la trama
modbus pero no pude encontrarlo. ¿Consideraste los tiempos de resguardo indicados
en el protocolo?

Saludos
Alfredo

Título: Re: Estoy implementando MODBUS en PIC
Publicado por: MGLSOFT en 03 de Noviembre de 2006, 09:54:50
En CCS, ultimas versiones, ya aparece una rutina probada para manejar el protocolo Modbus.
Encontraras adjunta la rutina como MODBUS.C
Aqui pego un ejemplo de como utilizarla segun un ejemplo hecho con el Wizard incorporado
Código: C
  1. #include "C:\Archivos de programa\PICC V4\Projects\Modbus.h"
  2. #include <LCD.C>
  3.   #ZERO_RAM
  4. #int_RDA
  5. RDA_isr()
  6. {
  7.  
  8. }
  9.  
  10. #int_CCP2
  11. CCP2_isr()
  12. {
  13.  
  14. }
  15.  
  16.  
  17.  
  18. #define MODBUS_BUS SERIAL
  19. #define MODBUS_TYPE SLAVE
  20. #define MODBUS_SERIAL_RX_BUFFER_SIZE 8
  21. #define MODBUS_SERIAL_BAUD 9600
  22. #define MODBUS_OUR_ADDRESS 10
  23. #include "modbus.c"
  24. void main()
  25. {   modbus_init();
  26.    fprintf(SLAVE_PC, "\n\rReady...");
  27.  
  28.    while(TRUE)
  29.    {
  30.       while(!modbus_serial_receive(FALSE));
  31.       fprintf(SLAVE_PC, "\n\rBus Active");
  32.  
  33.       if((respond = (modbus_rx.address == MODBUS_OUR_ADDRESS)) || modbus_rx.address == 0)
  34.       {
  35.          fprintf(SLAVE_PC, "\n\rRequest for us");
  36.          fprintf(SLAVE_PC, "\n\rFunction: %X", modbus_rx.func);
  37.          switch(modbus_rx.func)
  38.          {
  39.             case 0x01:
  40.                if(respond)
  41.                {
  42.                   //read the coils
  43.                }
  44.                break;
  45.             case 0x02:
  46.                if(respond)
  47.                {
  48.                   //read discrete inputs
  49.                }
  50.                break;
  51.             case 0x03:
  52.                if(respond)
  53.                {
  54.                   //read holding registers
  55.                }
  56.                break;
  57.             case 0x04:
  58.                if(respond)
  59.                {
  60.                   //read input registers
  61.                }
  62.                break;
  63.             case 0x05:
  64.                break;
  65.             case 0x06:
  66.                break;
  67.             case 0x07:
  68.                break;
  69.             case 0x08:
  70.                if(respond) {diagnostics_rsp(MODBUS_OUR_ADDRESS,
  71.                               make16(modbus_rx.data[0],modbus_rx.data[1]),
  72.                               make16(modbus_rx.data[2], modbus_rx.data[3]));}
  73.                fprintf(SLAVE_PC, "\n\rResetting...");
  74.                reset_cpu();
  75.                break;
  76.          }
  77.       }
  78.    }
  79.  
  80.  
  81.    setup_adc_ports(NO_ANALOGS);
  82.    setup_adc(ADC_OFF);
  83.    setup_spi(FALSE);
  84.    setup_wdt(WDT_OFF);
  85.    setup_timer_0(RTCC_INTERNAL);
  86.    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  87.    setup_timer_2(T2_DISABLED,0,1);
  88.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  89.    setup_ccp2(CCP_COMPARE_INT);
  90.    lcd_init();
  91.    enable_interrupts(INT_RDA);
  92.    enable_interrupts(INT_CCP2);
  93.    enable_interrupts(GLOBAL);
  94.    setup_oscillator(False);
  95.  
  96.    // TODO: USER CODE!!
  97.  
  98. }

Tambien adjunto el manual en ingles del protocolo, que explica sobre los mensajes y calculo de CRC por tablas.

Suerte !!!
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: Sasián en 03 de Noviembre de 2006, 10:01:13
Como te comente el código no esta optimizado.
lo correcto es recibir la trama completa y luego analizarla.
por la web www.sasian.es creo recordar que hay un ejemplo de como implementar la recepcion de la trama completa en ccs usando un timer, una vez tengas la trama completa la puedes interpretar usando como base el ejemplo anterior.
con un timer adicionar para generar una base de tiempo puedes incluso implementar un timeout para controlar tu protocolo.

saludos
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: alfredoenvalpo en 04 de Diciembre de 2006, 20:52:54
Agradezco la ayuda nuevamente, y disculpen por no responder antes,
estoy ahora utilizando el compilador al ccs en lugar del mcc18, asi
que estoy modificando el programa que estaba haciendo,


Saludos     :shock:
Título: Re: Estoy implementando MODBUS en PIC
Publicado por: rodo38 en 10 de Agosto de 2011, 19:40:38

Tomando como base la función de Sasián he comunicado el Pic mediante DASMSerial con InTouch sin demasiados problemas.

Como he empleado el 16F877A me encuentro un limitado con la memoria de datos y aún no he podido comprobar el refresco con bloques de datos mas extensos. Es un buen punto de referencia. Gracias Sasián

Saludos


me podrias ayudar yo necesito comunicar una pic con intouch y tambien tengo el DAserver



saludos