Hola a todos. Estoy desarollando un programa el cual envia datos por puerto serie. Resulta que como no me enviaba los datos (por problemas del compilador seguramente) decidí desinstalarlo y volverlo a instalar. Ahora tengo el MPLAB 8.87, con la ultima version de plugins para utilizar ccs y el compilador CCS V4.140.
El programa sigue sin limpiar la interrupcion serie se queda colgado en cuanto envia un primer dato por el puero serie. He probado en utilizar cleaner_interrupt(INT_RDA) pero sigue igual... En otros foros no me dan solucion.
Con ésta version de CCS no debería tener problemas no? Como puedo limpiar manualmente el bit RCIF del PIC16F88 para que el flag del puerto serie vuelva a 0?
El programa sigue sin limpiar la interrupcion serie se queda colgado en cuanto envia un primer dato por el puero serie. He probado en utilizar cleaner_interrupt(INT_RDA) pero sigue igual... En otros foros no me dan solucion.
Con ésta version de CCS no debería tener problemas no? Como puedo limpiar manualmente el bit RCIF del PIC16F88 para que el flag del puerto serie vuelva a 0?
Código:
#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[]=",0000";//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[]="P01";
char tipo_dato[]="$ADQ";
char canal[]="CH0";
//char dato_salida[]="$ADQ,P01,CH0,0000\r\n"; //String para guardar lo que envio por UART
char dato[]="$ADQ,P01,CH0\r";
char midireccion[]="P01";
char micabecera[]="$ADQ";
char miretorno[]="\r";
char misimbolo[]="$";
char micanal0[]="CH0";
char micanal1[]="CH1";
char mitest[]="$TST";
short flag_final=0;
short flag_permiso=0;
short flag_tst=0;
short flag_envio=0;
void lectura(){
for(P_R=0; P_R<91; P_R++){
if(trama_entrada[P_R]==misimbolo[0]){
inicio=P_R;
for(P_R=inicio; P_R<91; P_R++){
if(trama_entrada[P_R]==miretorno[0]){
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++;
}
for(i=0;i<91;i++){
trama_entrada[i]='\0';
}
i=0;
j=0;
return;
}
void procesamiento(){
for(i=0; i<3; i++){
direccion_pic[i]=dato[i+5];
}
direccion_pic[3]='\0';
if(strcmp(direccion_pic, midireccion)==0){
for(i=0; i<4; i++){
tipo_dato[i]=dato[i];
}
tipo_dato[4]='\0';
if(strcmp(tipo_dato, micabecera)==0){
flag_tst=0;
for(i=0; i<3; i++){
canal[i]=dato[i+9];
}
canal[3]='\0';
if(strcmp(canal,micanal0)==0){
set_adc_channel(0);
}
else if(strcmp(canal,micanal1)==0){
set_adc_channel(1);
}
delay_us(20);//retardo para leer ADC
valor_adc=read_adc();//lectura ADC
}
else if(strcmp(tipo_dato, mitest)==0){
flag_tst=1;
}
flag_envio=1;
}
return;
}
void enviar(){
switch(flag_tst){
case 0:
sprintf(string_valor_adc,",%04ld",valor_adc);
output_high(PIN_B0);
printf("$ADQ,P01,%s,%s\r", canal,string_valor_adc); //Envio un solo String con la direccion, canal CHX y el resutado del PIC por UART.
output_high(PIN_B0);
break;
case 1:
output_high(PIN_B0);
printf("$TST,P01\r"); //Envio un solo String con la direccion, canal CHX y el resutado del PIC por UART.
output_high(PIN_B0);
break;
}
return;
}
#INT_RDA
void INT_UART() {
if(kbhit()){
trama_entrada[P_W]=getc();
if(trama_entrada[P_W]=='\r'){
P_W=0;
flag_final=1;
}
else{
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){
if(flag_final==1){
flag_final=0;
lectura();
if(flag_permiso==1){
flag_permiso=0;
escritura();
procesamiento();
if(flag_envio==1){
flag_envio=0;
enviar();
}
}
}
}
}
Última edición: