Hola, he vuelto a los pics despues de un tiempo sin programar, y mas o menos la cosa va bien, aunque hoy me ha surgido un problema y no se si es fallo de mi logica programando o que se me pasa algo de la arquitectura del pic que no me acuerdo. El programa usa un LCD y un pulsador que se conecta a RB0 y que se usa para contar las pulsaciones a traves de la rutina de la interrupcion.
El problema es que cuando inicio el PIC me entra en la rutina de interrupcion sin pulsar una sola vez; uso la protoboard podria ser por rebotes, pero si hago un reset me pasa lo mismo me empieza contando en 1 en lugar de en 0
//Uso lcd y pulsador
#include <18F2550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOUSBDIV,VREGEN
#use delay(clock=4000000)
//Pines para lcd_flex
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#define LCD_RS PIN_C0
#define LCD_RW PIN_C1
#define LCD_E PIN_C2
#include "flex_lcd.c"
int8 interrupcion=0;
///LLAMADA FUNCION INTERRUPCION
#INT_EXT
void IntRB0()
{ interrupcion++;
if(interrupcion>9){ //9?
interrupcion=0;//Resetea
}
lcd_putc('\f'); //borra lcd
lcd_gotoxy(1,1);
printf(lcd_putc
,"Esperando interrupcion \n"); //muestra por pantalla el mensaje delay_ms(10);
printf(lcd_putc
,"Interrupcion:%u",interrupcion
); delay_ms(200);//Evitar rebotes
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
///PROGRAMA
interrupcion=0;
lcd_init(); //inicializa lcd
lcd_putc('\f'); //borra lcd
//Mensaje de inicio y conteo interrupciones
printf(lcd_putc
,"Esperando interrupcion \n"); //muestra por pantalla el mensaje delay_ms(10);
printf(lcd_putc
,"Interrupcion:%u",interrupcion
); delay_ms(1000);//Evitar rebotes
//Activamos interrupciones e interrupcion externa en rb0
//SE hace despues de usar el lcd para evitar rebotes al conectar la corriente
enable_interrupts(int_ext); //activar interrupcion externa
ext_int_edge(H_TO_L); //configuracion:interrupcion cuando señal esta en alta
enable_interrupts(GLOBAL); //todas las interrupciones activadas
while(1)
{
}
}
¿Alguna idea de por que me puede pasar? Para solucionarlo he hecho este otro programa, en el que uso una variable auxiliar, que soluciona el problema, aunque me gustaria saber por que falla
#include <18F2550.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP,NODEBUG,NOUSBDIV,VREGEN
#use delay(clock=4000000)
//Pines para lcd_flex
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#define LCD_RS PIN_C0
#define LCD_RW PIN_C1
#define LCD_E PIN_C2
#include "flex_lcd.c"
int8 interrupcion=0;
int1 primer;
///LLAMADA FUNCION INTERRUPCION
#INT_EXT
void IntRB0()
{ if(primer==0){
primer=1;
}else{
interrupcion++;
if(interrupcion>9){ //9?
interrupcion=0;//Resetea
}
lcd_putc('\f'); //borra lcd
lcd_gotoxy(1,1);
printf(lcd_putc
,"Esperando interrupcion \n"); //muestra por pantalla el mensaje delay_ms(10);
printf(lcd_putc
,"Interrupcion:%u",interrupcion
); delay_ms(200);//Evitar rebotes
}
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
///PROGRAMA
primer=0;
interrupcion=0;
lcd_init(); //inicializa lcd
lcd_putc('\f'); //borra lcd
//Mensaje de inicio y conteo interrupciones
printf(lcd_putc
,"Esperando interrupcion \n"); //muestra por pantalla el mensaje delay_ms(10);
printf(lcd_putc
,"Interrupcion:%u",interrupcion
); delay_ms(1000);//Evitar rebotes
//Activamos interrupciones e interrupcion externa en rb0
//SE hace despues de usar el lcd para evitar rebotes al conectar la corriente
enable_interrupts(int_ext); //activar interrupcion externa
ext_int_edge(H_TO_L); //configuracion:interrupcion cuando señal esta en alta
enable_interrupts(GLOBAL); //todas las interrupciones activadas
while(1)
{
}
}
Y ya aprovecho para preguntar ¿como se puede hacer que un mensaje rote a traves del LCD para que salga entero? lo tipico de los mp3 que el mensaje se desplaza para ver toda la informacion