Según traduzco del manual de CCS:
"enable_interrupts(global) no habilita ninguna interrupción en concreto, pero sí activa las interrupciones que hayan sido previamente habilitadas".
¿En qué se diferencia habilitar de activar?
Imaginen que quiero usar las interrupciones INT_EXT1 e INT_TIMER1, pero que la segunda sólo esté habilitada mientas se mantiene pulsado un botón conectado a la primera. En otras palabras, que el timer1 sólo esté activo mientras el botón esté pulsado.
El código que he usado es el siguiente:
int1 botonPulsado=0;
#INT_EXT1
void int1_handler(){
if(!botonPulsado){
botonPulsado=1;
ciclosTimer1=400;
ext_int_edge(1,L_TO_H);
enable_interrupts(INT_TIMER1);
clear_interrupt(INT_TIMER1);
//1. ¿Debería poner aquí otro enable_interrupts(global)?
}else{
disable_interrupts(INT_TIMER1);
botonPulsado=0;
ext_int_edge(1,H_TO_L);
}
}
#INT_TIMER1
void timer1_handler(){
if(botonPulsado){ //2. Entiendo que esto no sería necesario, pues si el botón no está pulsado la interrupción timer1 estaría deshabilitada ¿no?
if(--ciclosTimer1==0){
write_eeprom(0,read_eeprom(1));
delay_ms(20);
reset_cpu();
}
}
main(){
ext_int_edge(1,H_TO_L);
enable_interrupts(INT_EXT1);
clear_interrupt(INT_EXT1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
enable_interrupts(INT_TIMER1); //3. ¿es necesario habilitarlo si sólo quiero que entre en funcionamiento cuando se produzca INT_EXT1?
clear_interrupt(INT_TIMER1);
enable_interrupts(GLOBAL);
disable_interrupts(INT_TIMER1);//4. la deshabilito porque no quiero que entre en funcionamiento aún
while(true){...};
}
Y una última cosa: si tengo un delay en el programa, ¿las interrupciones no esperan a que termine el delay, verdad?