Buenas a todos,
tengo un problemilla con un código que estoy haciendo... el programa lee un valor del ADC y lo envía al puerto serie y a un LCD, y a su vez, cuando recibe algo por el puerto serie, se ejecuta la interrupción del puerto serie, lee el valor y lo muestra por el LCD.
pues resulta que todo funciona bien hasta que le envío un carácter por el puerto serie, que se queda colgado al entrar en la interrución...
este es el código, a ver si alguien me puede echar una mano y ve algún fallo
//Incluimos la libretia del PIC
#include "16F877A.h"
#device adc=10
//Configuramos el reloj a 4MHz
#use delay(clock=4000000)
#include "lcd.c"
//Configuramos los parámetros del puerto RS-232
#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7)//,enable=PIN_D5)
#byte porta=0x05
#byte portb=0x06
#byte portc=0x07
#byte portd=0x08
//Configuramos los fuses adecuados
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP,BROWNOUT
#define PULSADOR pin_b6
int keypress=0, dato=0;
void borrar_lcd()
{
lcd_gotoxy(1,1);
printf(lcd_putc," ");
lcd_gotoxy(1,2);
printf(lcd_putc," ");
lcd_gotoxy(1,1);
}
//directiva para interrupción del puerto serie
#int_rda
void rda_isr()
{
dato=1;
}
void config(void)
{
enable_interrupts(INT_RDA); //indicamos que queremos usar la int del serial
enable_interrupts(GLOBAL); //habilitamos las interrupciones
}
//Programa principal
void main(void)
{
int16 valor=0;
float result=0;
set_tris_b(0b01111111); //Configuramos el puerto B de entrada de B0-B6
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
config();
lcd_init();
borrar_lcd();
lcd_gotoxy(1,1);
printf(lcd_putc,"Tension=");
while(TRUE)
{
valor=read_adc();
result=(valor/168.4);
lcd_gotoxy(9,1);
printf(lcd_putc,"%2.2fv \n",result);
delay_ms(100);
printf("%2.2f v \n\r"result);
if(dato==1)
{
keypress=getc();
lcd_gotoxy(1,2);
printf(lcd_putc,"%u",keypress);
dato=0;
}
}
}
supongo que no debo estar configurando bien la interrupción, pero yo no veo el fallo...
espero haberme explicado,
un saludo y gracias...