Muy buenas.
Tengo desarrollado un medidor de consumo de combustible para un ultraligero que me muestra los datos en un GLCD 3310 de Nokia con un 18F4520.
Lo he tenido funcionando con todos los menús y el contador ajustado. He tenido que reprogramarlo porque he cambiado el captador que tiene diferencias en cuanto al número de pulsos/litro y varía el cálculo matemático.
El problema que me surge es que "no se qué p**etas he tocado" que ahora no me entra en la interrupción Rb4:7.
He estado mirando por el foro y recuerdo que en su día tuve el mismo problema y estoy viendo los mismos mensajes que me leí entonces. El caso es que llevo varios días intentandolo y no termino de dar con la tecla (nunca mejor dicho). Tampoco recuerdo cómo lo solucioné.
He probado a programar el micro con un programa de prueba para encender un LED con las pulsaciones al entrar en la interrupción y tampoco entra, aunque en Proteus y Mplab si parece que funcione bien.
El código es el siguiente:
**********************************************************************
#include <18F4520.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV25 //Brownout reset at 2.5V
#FUSES PUT //Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOPBADEN //PORTB pins are configured as digital input channels on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES MCLR //Master Clear pin enabled
#FUSES NOXINST //No Extended set extension and Indexed Addressing mode enabled
#use delay(clock=20000000)
#define LOWTOHIGH false
#define HIGHTOLOW true
short int dbutton4, dbutton5, dbutton6, dbutton7;
#int_rb
void detect_rb_change() {
int current;
static int last=0;
set_tris_b(0xF0);
current=input_b();
#if LOWTOHIGH
if ((!bit_test(last,4))&&(bit_test(current,4))) {dbutton4=1;}
if ((!bit_test(last,5))&&(bit_test(current,5))) {dbutton5=1;}
if ((!bit_test(last,6))&&(bit_test(current,6))) {dbutton6=1;}
if ((!bit_test(last,7))&&(bit_test(current,7))) {dbutton7=1;}
#elif HIGHTOLOW
if ((!bit_test(current,4))&&(bit_test(last,4))) {dbutton4=1;}
if ((!bit_test(current,5))&&(bit_test(last,5))) {dbutton5=1;}
if ((!bit_test(current,6))&&(bit_test(last,6))) {dbutton6=1;}
if ((!bit_test(current,7))&&(bit_test(last,7))) {dbutton7=1;}
#endif
last=current;
}
void main() {
dbutton4=0;
dbutton5=0;
dbutton6=0;
dbutton7=0;
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(AN0_TO_AN1_ANALOG);
set_adc_channel(0);
/////////// Prueba para ver que el código pasa por aqui//////////
output_high(PIN_D2);
delay_ms(500);
output_low(PIN_D2);
delay_ms(500);
output_high(PIN_D2);
delay_ms(500);
output_low(PIN_D2);
////////////////////////////////////////////////////////
clear_interrupt(int_rb);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
output_low(PIN_D2);
while (TRUE) {
if(dbutton6){
output_high(PIN_D2);
dbutton6=FALSE;
}
if(dbutton5){
output_low(PIN_d2);
dbutton5=FALSE;
}
}
}
**********************************************************
El caso es que pulsando los botones físicos nunca se llega a encender el led.
También le he probado a encender el led cuando entre en la interrupción y ..... nada.
Uso CCS
Espero que alguien me ayude a hacer memoria. Jeje.
Muchas gracias.