Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Buenas a todos.
Estoy probando de nuevo las interrupciones en CCS porque las programillas que he hecho hasta ahora no terminan de ir nunca bien cuando las uso.
Tengo un Prog que lo que hace es a la activacion de la entrada externa (Rb0) incrementa un contados, y cuando activo la entrada RC0 lo que hago es un bucle donde enciendo 3 led las veces que se haya incrementado el contador, es decir que si activo dos veces la entrada Rb0 al activar la Rc0 los led parpadean 2 veces.
Esto funciona bien hasta que durante los parpadeos de los led vuelvo activar la interrupcion, lo que hago en el buecle del encedido de los led es desactivar las interrupciones, y esto funciona bien, el tema es que al salir del bucle y activar las interrupciones el programa salta automaticamenta a la interrupcion y incrementa el contador, es decir, que aunque la interrupcion está deshabilitada cuando se activa la entrada de la interrupcion parece que el bit de interrupcion se activa, pero al estar deshabilitadas las interrupciones no se produce el salto, pero luego al activar la interrupcion de nuevo me da la impresion que el CCS no limpia los bit y por tanto al estar activo de antes hace el salto, la pregunta es ¿como limpio el flag de la interrupcion externa en CCS? lo que quiero hacer es antes de activar la interrupcion limpiar el bit de interrupcion y eso deberia de solucionar el problema ¿no?
Pongo el codigo, aunque este no creo sea el problema, sino lo que he comentado, que el CCS no limpia el flag de la interrupcion antes de habilitar el salto.
#int_ext
VOID imanes() //------INTERRUPCION 2 NIVELACION -------------
{ disable_interrupts(GLOBAL);
iman=PORTB;
piso_actual=piso_actual+1;
//delay_ms(500);
enable_interrupts(GLOBAL);
}
void main(void) // Comienzo de programa, void quiere decir que no se obtendrá ningun valor de esta funcion
{ disable_interrupts(GLOBAL); // deshabilitamos las interrupciones por seguridad
//--------------------------------------------
// CONFIGURAMOS LOS PUERTOS
// CERO=salida, UNO=Entrada
set_tris_a(0b011111); // 6 E/S Puerto a definido como Entrada menos el A5.
set_tris_b(0b11111011); // 8 E/S Puerto b definido como Entrada menos b2
set_tris_c(0b00000001); // 8 E/S Puerto c definido como salida menos c0
set_tris_d(0b00011111); // 8 E/S D0,D1,D2,D3,D4 definido como entrada, D5,D6,D7 definido como salida
set_tris_e(0b100); // 3 E/S E0, E1 definido como Salidas y E2 como entrada
PORTA=0;
PORTB=0;
PORTD=0;
PORTE=0;
PORTC=0;
//disable_interrupts(int_rb);
enable_interrupts(int_ext);
enable_interrupts(GLOBAL);
//delay_ms(1000);
do
{
if (input(pin_c0)==0)
{ //while (input(pin_b6))
//{}
if (puertoa|=0b100000)
{ puertoa=0b100000;
PORTA=puertoa;
}
}
else
{ puertoa=0;
PORTA=0;
if (piso_actual|=0)
{ for (indice=1;indice<=piso_actual;indice++)
{ //delay_ms(1000);
puertod=0b11100000;
disable_interrupts(int_ext);
disable_interrupts(Global);
PORTD=puertod;
//delay_ms(1000);
puertod=0b00000000;
PORTD=puertod;
}
piso_actual=0;
//delay_ms(100);
enable_interrupts(int_ext);
enable_interrupts(Global);
}
}
//ra5 salida
//delay_ms(2000);
}WHILE(TRUE); // Esta es la condicion para repetir el bucle,
} // Fin
bueno, al final ha sido facil, solo he tenido que definir el Flag y luego operar con el por programa
#byte INTCON=0x0B //esta no hace falta pero asi tengo otra forma de acceder usando el canal entero
#bit INTF=0X0B.1
...
INTF=0;
Lo he probado y funciona perfectamente, asi que CONFIRMO que el CCS se comporta de la forma que he comentado anteriormente.
Salu2