/* Generando Retardos con el timer. 2 Parte
Pedro - PalitroqueZ
*/
#include <18F4550.h>
#fuses XT,NOMCLR,NOWDT,NOPROTECT,NOLVP
#fuses NODEBUG,NOPBADEN,CPUDIV1,NOVREGEN //,PLL1
#use delay(clock=4M)
int8 iBanderas; // variables globales
#bit fIniciar = iBanderas.0
#bit fDurante_Retardo = iBanderas.1
#bit fFin_Retardo = iBanderas.2
//***************************************
// servicio de interrupción
//***************************************
#int_timer0
void tmr0_isr(){
fDurante_Retardo=1;
fFin_Retardo=1;
disable_interrupts(INT_TIMER0);
// deselecciona la fuente de interrupción
// para no ejecutarla a posteriori
}
//***************************************
void vIniciar(){
if(!fDurante_Retardo){
delay_us(10); // simula tiempo de lineas de programas
fDurante_Retardo=1;
set_timer0(21); // retardo de ~ 15ms
enable_interrupts(GLOBAL);
return;
}
if(fFin_Retardo){ //la otra mitad del programa dentro de vIniciar
delay_us(80); // simula tiempo de lineas de programas despues del retardo
fIniciar=0;
disable_interrupts(INT_TIMER0);
}
}
//***************************************
// programa principal
//***************************************
void main(){
int16 t;
// ... aqui va config puertos, modulos, etc.
iBanderas=0b00000001;
//fIniciar = 1;
//fDurante_Retardo = 0;
//fFin_Retardo=0;
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_BIT);
// configura el Timer0 base de tiempo interno, pre-escaler=1:64, contador de 8 bits
enable_interrupts(INT_TIMER0);
// selecciona la fuente de interrupción del timer0
while(1){ // bucle eterno
delay_us(80); // simula tiempo de otros procesos
if(fIniciar){ // pregunta para decidir si entrará o no a vIniciar
vIniciar();
}
for(t=0;t<65000;t++){ // simula tiempo de otros procesos
delay_cycles(1);
}
}
}