Estimados foreros, este es mi primer mensaje en el foro.
Así que empiezo por presentarme: soy ingeniero de minas y profesor de Universidad (en la rama de Geotecnia).
El caso es que estamos desarrollando un proyecto sobre medida de convergencias en túneles, y hemos decidido utilizar encoders para hacerlo y pics para realizar las medidas proporcionadas por ellos.
El caso es que tengo experiencia en programación C (bastante) y alguna pequeña experiencia previa con pics (pequeña y hace años).
Pues el caso es que tengo bastantes problemas para hacer algo tan sencillo como que el pic se interrumpa cuando recibe un caracter de la puerta serie, establezca un flag para advertirlo y luego procese ese caracter en el programa principal (en el programa de ejemplo simplemente lo vuelve a escribir en el puerto serie).
A ver si ustedes me pueden ayudar, por que la verdad es que ya llevo más de una semana peleando con esto, pensando que era problema del depurador o que el pic estaba estropeado... está claro que soy yo el estropeado
Mi entorno de trabajo es:
Compilador CCS C 4.104
Entorno MPLAB 8.43 con plugin para compilar con CCS
Depurador: ICD-PIC clon compatible con Pickit2
PIC: PIC16F876A
Tarjeta de pruebas: PIC-School
Este es el programa (lo he simplificado al máximo) que no me funciona:
#include <16f876A.h>
//Ajusta los valores de la palabra de configuración durante el ensamblaje:
//Protección de código y datos=OFF, LVP=OFF, WDT=OFF y OSC=XT
#fuses NOPROTECT,NOCPD,NOLVP,NOWDT,XT
// Con estas directivas las funciones "input" y "output_bit" no reprograman
// el pin de la puerta cada vez que son utilizadas. Si no se indica el
// modo fast_io se asume por defecto standard_io el cual reprograma el pin
// siempre antes de ser utilizadas estas funciones.
#use fast_io (B)
#use fast_io (C)
#use delay(clock=4000000)
//Habilita las funciones RS232, velocidad a 9600 baudios
#use rs232(uart1,baud=9600)
int carRecibido;
#int_rda //Vector de interrupción al recibir por el UART
//Función de tratamiento de la interrupción al recibir
tratamiento()
{
carRecibido=1;
}
main()
{
carRecibido=0;
output_b(0x00); //Borra las salidas
set_tris_b(0x00); //Puerta B salida
set_tris_c(0b10111111); //RC7/Rx entrada, RC6/Tx salida
enable_interrupts(INT_RDA); //Activa interrupción en la recepción
enable_interrupts(global); //Habilita interrupciones
while(1)
{
if( carRecibido) {
carRecibido=0;
int dato; //Variable para almacena el dato recibido
dato=getc(); //Lee el dato recibido
output_b(dato); //Lo saca por la puerta B
putc(dato); //Lo transmite vía RS232
}
}
}
En él simplemente establezco un flag en la interrupción de haber recibido un caracter y en el main si el flag está a on, leo el caracter y lo escribo.
Si eso lo hago todo en la interrupción, el programa funciona correctamente ¿a qué se debe?
Muchas gracias por su orientación