Hola amigos!!
Estoy programando un sencillo temporizador, con una entrada que establece el tiempo de conteo, y otra que activa el temporizador.
El codigo lo tengo y funciona, pero no consigo "pensar" la forma en que se reinicie el programa, es decir, que si ya a empezado a contar y doy del pulsador de nuevo, empiece la cuenta desde cero.
Existe alguna instruccion que puesta en el codigo de la interrupcion me "resetee" el PIC??? o sino a ver si alguno me puede ayudar a realizarlo con codigo.
Dejo el .c y la simulacion en proteus. Saludos y gracias.
// Control temporizado con PIC 16F88
// Puerto A como salida y B como entrada
// Hay 2 entradas:
// - RB0 o INT que inica y resetea el temporizador
// - RB3 segun su estado cambia el valor de la temporizacion.
// Funcionamiento:
// Al pulsar el pulsador de RB0 segun este RB3 se inicia la temporizacion de 60 o de 30 sg.
// En el primer cuarto de ese tiempo, no se activa ninguna salida.
// En el segundo, tercero y cuarto cuartos, se activa un led en cada uno.
// Despues se activa otro led durante 2sg.
#include <16f88.H>
#fuses INTRC, NOWDT, NOLVP, NOCPD, NOWRT, NODEBUG, NOPROTECT, NOFCMEN, NOIESO, NOMCLR, NOBROWNOUT, CCPB3, INTRC_IO
#use delay(clock=8000000)
#use fast_io(B)
#use fast_io(A)
#byte port_A = 0x05
#byte port_B = 0x06
int Ttotal=0; // Valor del tiempo total
int Band=0; // Variable de bandera
// interrupcion por cambio de B0
#INT_EXT
void INTER (void){
Band=1; //Cambia la variable bandera.
}
void Espera (void) { // Espera un cuarto del tiempo total.
int i;
for(i=0;i<=Ttotal/4;i++){
delay_ms(1000);
}
}
//----------------------------------Funcion Main--------------------------------------
void main(void) { //Funcion principal del microprocesador.
setup_oscillator(OSC_8MHZ);
ext_int_edge(L_TO_H); // Se activa la interrupcion de B0 en el flanco de subida.
enable_interrupts(GLOBAL); // Permite interrupciones.
enable_interrupts(INT_EXT); // Activa la interrupcion externa de B0.
set_tris_A(0x00); // Puerto A como salida.
set_tris_B(0xFF); // Puerto B como entrada.
port_A = 0b00000000; // Salidas todas a cero.
while(TRUE) { // Bucle que se ejecuta siempre.
if (Band==0){ // Si se pulsa el pulsador, sino no hace nada.
if(input(PIN_B3)) { //leemos la entrada y asignamos el valor a Ttotal valor en Sg.
Ttotal=60; // Valor para un minuto.
} else {
Ttotal=30;
}
delay_ms(50); // para no recargar emulacion.
} else { //Si se ha pulsado la interrucion empieza la temporizacion.
//-------------------------------- Primer -------------------------------------------
port_A = 0b00000000;
espera();
//-------------------------------- Segun -------------------------------------------
port_A = 0b00001000;
espera();
//-------------------------------- Tercer -------------------------------------------
port_A = 0b00000100;
espera();
//-------------------------------- Cuarto -------------------------------------------
port_A = 0b00000010;
espera();
//-------------------------------- Final -------------------------------------------
port_A = 0b00000001;
delay_ms(2000);
Band=0;
}
}
}