He conseguido programar con el ICD2 pero tengo un problema en el funcionamiento del programa. Cuando realizo la siguientes concatenaciones. El PIC mio se queda como colgado... es como si no le gustara la función STRCAT.
strcat(dato_salida, (char*)"$");
strcat(dato_salida, tipo_dato); //tipo_dato es un string
strcat(dato_salida, (char*)",");
strcat(dato_salida, direccion_pic); // direccion_pic es un string
strcat(dato_salida, (char*)"\r");
strcat(dato_salida, (char*)"\n");
printf("%s", dato_salida);
En cambio cuando pongo solo:
printf("$ADQ,P00,CH0\r);
me lo hace sin problema. A qué puede ser debido? El programa no me da errores ni warnings respecto a ésto. Y compila bien al igual que al programarlo. He añadido también la libreria string.h pero no sé a qué puede ser debido éste fallo en el funcionamiento...
Te adjunto el codigo completo por si quieres hecharle un vistazo:
#include <16f88.h>
#device ADC=10 //INDICO EL NÚMERO DE BITS DEL ADC
#include <stdio.h>
#include <string.h>
#fuses HS, NOWDT, NOLVP, NOBROWNOUT, NOPROTECT, PUT
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=PIN_B5, rcv=PIN_B2) //CONFIGURO PUERTO SERIE
//**VARIABLES PARA GESTIONAR LA TRAMA RECIBIDA Y LA TRAMA A ENVIAR POR PUERTO SERIE**//
long valor_adc=0; //Variable para lectura ADC
int P_W=0; //puntero escritura
int P_R=0; //puntero lectura
int i=0; //puntero bucle for
int j=0;
int inicio=0;
int final=0;
char string_valor_adc[6]={0};//Cadena de caracteres para guardar valor ADC en Carcteres
char trama_entrada[91]={0}; //String para guardar el dato de entrada por UART
char direccion_pic[4]={0};
char tipo_dato[4]={0};
char canal[4]={0};
char dato_salida[19]={0}; //String para guardar lo que envio por UART
char dato[13]={0};
short flag=0;
short flag_permiso=0;
short flag_tst=0;
void lectura(){
for(P_R=0; P_R<91; P_R++){
if(trama_entrada[P_R]==(char*)"$"){
inicio=P_R;
for(P_R=inicio; P_R<91; P_R++){
if(trama_entrada[P_R]==(char*)"\r"){
P_W=0;
final=P_R;
flag_permiso=1;
break;
}
}
break;
}
}
}
void escritura(){
for(i=inicio; i<=final; i++){
dato[j]=trama_entrada[i];
j++;
}
i=0;
j=0;
}
void procesamiento(){
for(i=0; i<3; i++){
direccion_pic[i]=dato[i+5];
}
if((flag=strcmp(direccion_pic, (char*)"P01")==0)){
for(i=0; i<3; i++){
tipo_dato[i]=dato[i+1];
}
if((flag=strcmp(tipo_dato, (char*)"ADQ")==0)){
for(i=0; i<3; i++){
canal[i]=dato[i+9];
}
if((flag=strcmp(canal,(char*)"CH1"))==0){
set_adc_channel(1);
}
else if((flag=strcmp(canal,(char*)"CH2"))==0){
set_adc_channel(2);
}
else if((flag=strcmp(canal,(char*)"CH3"))==0){
set_adc_channel(3);
}
else if((flag=strcmp(canal,(char*)"CH4"))==0){
set_adc_channel(4);
}
else if((flag=strcmp(canal,(char*)"CH5"))==0){
set_adc_channel(5);
}
delay_us(20);//retardo para leer ADC
valor_adc=read_adc();//lectura ADC
}
else if((flag=strcmp(tipo_dato, (char*)"TST")==0)){
flag_tst=1;
}
}
}
void enviar(){
switch(flag_tst){
case 0:
sprintf(string_valor_adc,",%04ld",valor_adc);
strcat(dato_salida, (char*)"$");
strcat(dato_salida, tipo_dato);
strcat(dato_salida, (char*)",");
strcat(dato_salida, direccion_pic); //Concateno DireccionPICrespuesta y el canal "CHX")
strcat(dato_salida, (char*)",");
strcat(dato_salida, canal);
strcat(dato_salida, string_valor_adc);//concateno String anterior y Valor del ADC
strcat(dato_salida, (char*)"\r");
strcat(dato_salida, (char*)"\n");
output_high(PIN_B0);
printf("%s", dato_salida); //Envio un solo String con la direccion, canal CHX y el resutado del PIC por UART.
output_high(PIN_B0);
flag_permiso=0;
break;
case 1:
strcat(dato_salida, (char*)"$");
strcat(dato_salida, tipo_dato);
strcat(dato_salida, (char*)",");
strcat(dato_salida, direccion_pic); //Concateno DireccionPICrespuesta y el canal "CHX")
strcat(dato_salida, (char*)"\r");
strcat(dato_salida, (char*)"\n");
output_high(PIN_B0);
printf("%s", dato_salida); //Envio un solo String con la direccion, canal CHX y el resutado del PIC por UART.
output_high(PIN_B0);
flag_permiso=0;
flag_tst=0;
break;
}
}
#INT_RDA
void INT_UART() {
trama_entrada[P_W]=getc();
P_W++;
}
void main(){
output_low(PIN_B0);
enable_interrupts(GLOBAL); //HABIlLITO TODAS LAS INTERRUPCIONES GLOBALES
enable_interrupts(INT_RDA); //HABILITO LA INTERRUPCIÓN UART
setup_adc_ports(sAN0|sAN1|sAN2|sAN3|sAN4|sAN5); //INDICO EL PIN A0/A1/A2/A3/A4/A5 COMO ENTRADA ANALÓGICA
setup_adc(ADC_CLOCK_INTERNAL); //CLOCK INTERNO PARA CONVERSIÓN ADC
while(1){
lectura();
if(flag_permiso==1){
escritura();
procesamiento();
enviar();
}
}
}