// En general:
// clock = 4000000 Hz
// Tosc = (1 / clock)
//
// Tiempo = 4 x Tosc x Valor a contar en Timer0 + 1 x Rango del Divisor
// Tiempo = 4 x 0.00000025 x 196 x 256 = 50.17mS // Timer 8 bits a 4MHz
// Valor de inicio para Timer0 = 256 - 196 = 60
#include <18F45K20.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV18
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES NOSTVREN //Stack full/underflow will not cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES NOLPT1OSC //Timer1 configured for higher power operation
#FUSES MCLR //Master Clear pin enabled
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES NODELAYINTOSC
#use delay(clock=4000000)
int1 contando = false, temporizar = false;
int cuentas = 0;
#int_TIMER0
void TIMER0_isr(void)
{
if(temporizar)
{
contando = true;
cuentas ++;
if(cuentas == 100) // 50 mS x 100 = 5 Seg. aprox.
{
contando = false;
temporizar = false;
cuentas = 0;
}
}
set_timer0 (60); //Se recarga el timer0
}
void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_0);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit); // 8bits 65,5 mSeg aprox.
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
while (true)
{
if(!input(PIN_A4)) // Asumiendo que el pin A4 tiene una resistencia pullup ...
{
temporizar = true;
set_timer0 (60); //Carga del timer0
}
if(contando)
output_high(PIN_A0);
else
output_low(PIN_A0);
}
}