Hola a todos!!
Estoy tratando de utilizar el ejemplo de comunicacion ModBus que trae el CCS en la version 4.xxx
Hice un ejemplo para un esclavo, sobre la base de una placa testeada correctamente en comunicaciones pero en la cual al parecer no funciona la comunicacion con fprintf.
Pongo aqui el codigo (muy simple) del archivo que hice:
#include "C:\Archivos de programa\PICC V4\Projects\Modbus.h"
#include <LCD.C>
#ZERO_RAM
#int_RDA
RDA_isr()
{
}
#int_CCP2
CCP2_isr()
{
}
#define MODBUS_BUS SERIAL
#define MODBUS_TYPE SLAVE
#define MODBUS_SERIAL_RX_BUFFER_SIZE 8
#define MODBUS_SERIAL_BAUD 9600
#define MODBUS_OUR_ADDRESS 10
#include "modbus.c"
void main()
{ modbus_init();
fprintf(SLAVE_PC, "\n\rReady...");
while(TRUE)
{
while(!modbus_serial_receive(FALSE));
fprintf(SLAVE_PC, "\n\rBus Active");
if((respond = (modbus_rx.address == MODBUS_OUR_ADDRESS)) ||modbus_rx.address == 0)))
{
fprintf(SLAVE_PC, "\n\rRequest for us");
fprintf(SLAVE_PC, "\n\rFunction: %X", modbus_rx.func);
switch(modbus_rx.func)
{
case 0x01:
if(respond)
{
//read the coils
}
break;
case 0x02:
if(respond)
{
//read discrete inputs
}
break;
case 0x03:
if(respond)
{
//read holding registers
}
break;
case 0x04:
if(respond)
{
//read input registers
}
break;
case 0x05:
break;
case 0x06:
break;
case 0x07:
break;
case 0x08:
if(respond) {diagnostics_rsp(MODBUS_OUR_ADDRESS,
make16(modbus_rx.data[0],modbus_rx.data[1]),
make16(modbus_rx.data[2], modbus_rx.data[3]));}
fprintf(SLAVE_PC, "\n\rResetting...");
reset_cpu();
break;
}
}
}
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_ccp2(CCP_COMPARE_INT);
lcd_init();
enable_interrupts(INT_RDA);
enable_interrupts(INT_CCP2);
enable_interrupts(GLOBAL);
setup_oscillator(False);
// TODO: USER CODE!!
}y el archivo .h aqui:
#include <18F252.h>
#device ICD=TRUE
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOOSCSEN //Oscillator switching is disabled, main oscillator is source
#FUSES BROWNOUT //Reset when brownout detected
#FUSES BORV27 //Brownout reset at 2.7V
#FUSES PUT //Power Up Timer
#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 NOWRTB //Boot block not write protected
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOCPD //No EE protection
#FUSES NOCPB //No Boot Block code protection
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=COMM1,enable=PIN_C5)
Mientras en el driver de CCS (es muy largo para ponerlo todo aqui) la declaracion del prot es asi:
#use rs232(baud=MODBUS_SERIAL_BAUD, xmit=MODBUS_SERIAL_TX_PIN,
rcv=MODBUS_SERIAL_RX_PIN, parity=N, force_sw, stream=MODBUS_SERIAL)Si alguien me puede dar una pista lo agradeceria.
Para informacion les digo que usando printf la comunicacion anda OK, pero no asi con fprintf que todo el driver esta escrito con esa sentencia....
