Gracias por las sugerencias y atento a ellas implementé esta función la que anda perfectamente.
Como verás también estoy escribiendo y leyendo de la eeprom.
El tema de la consulta es que al terminar de cargarla al pic se ejecuta la interrupción sin que se haya llamado externamente por ningún pin del puerto B lo que hace que me aparezca un 1 en las variables de conteo. Debe haber una configuración errónea para que esto suceda.
Pasa lo mismo cuando la alimento con una fuente externa. Se ejecutan las interrupciones primero y después entra al main .
Aquí dejo las configuraciones y las funciones. Salvo ese detalle todo lo demás se realiza como dice el programa.
Me es de importancia pues esa primera acción me actualiza los conteos y yo necesito que los guarde ante una eventual corte de energía.
Aquí las funciones de interrupción que se ejecutan por primera vez sin que las llamen cuando se energiza el sistema
#int_ext
PortB_Interrupt() //Nombre de la interrupción.
{
ext_int_edge(1,H_TO_L); //Detecta el cambio de estado de RB0 en el flanco negativo.
for(n=1; n<=5; n++){ //El LED conectado en el puerto D1 titila 5 veces.
output_high(PIN_D1);
delay_ms(500);
output_low(PIN_D1);
delay_ms(500);
}
}
#int_EXT2 High // el high le da prioridad a laint. se
//activa al pulsar rb2
void ext2_isr()
{
tmax++;
delay_ms(200);
if (tmax >40)
tmax=0;
write_eeprom(0,tmax);
}
#int_EXT1 //de menor prioridad se activa con rb1
void EXT1_isr(){
Tmin++;
delay_ms(200);
if (tmin >20)
tmin=0;
write_eeprom(3,tmin);
}
El main de la función
void main(void) //Función principal main.
{
lcd_init(); // Initialize LCD module
bit_set(tris_b,2); //el bit 2 del PtoB como entrada
bit_set(tris_b,1); //el bit 1 del PtoB como entrada
bit_clear(tris_d,1);// bit 1 del PtoD como salida
bit_clear(tris_d,2);// bit 2 del PtoD como salida
enable_interrupts(GLOBAL); //Habilitación de todas(GLOBAL) las interrupciones.
enable_interrupts(int_EXT2);//Habilita int. por RB2con prioridad
enable_interrupts(int_EXT1); //Habilita la interrupción externa RB1.
enable_interrupts(int_EXT);
while(TRUE){ //El LED del PIN D2 titila indefinidamente.
output_high(PIN_D2);
delay_ms(500);
output_low(PIN_D2);
delay_ms(500);
temp0=read_eeprom(0);
temp1=read_eeprom(3);
lcd_gotoxy(1,1); //
printf(lcd_putc,"%u",temp0);//me indica que realmente se grabo en memoria
lcd_gotoxy(1,2); //
printf(lcd_putc,"%u",temp1);//me indica que realmente se grabo en memoria
lcd_gotoxy(1,3);
printf(lcd_putc,"Tmax=%u", tmax);
lcd_gotoxy(1,4); //
printf(lcd_putc,"Tmin=%u", tmin);
} //Fin del bucle infinito.
}
Se esta armando lindo este programita. Gracias por su tiempo.