Como la finalidad del foro es compartir, os escribo como he dejado el programa de prueba para el timer0 + algo de info que me es util en mis primeras pruebas rogramando pics
////////////////////////////////////////////////////////////////////////////////////
//
// Fuses
//
////////////////////////////////////////////////////////////////////////////////////
/*
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz)
#FUSES NOPROTECT //Code not protected from reading
#FUSES BROWNOUT_NOSL //Brownout enabled during operation, disabled during SLEEP
#FUSES BROWNOUT //Reset when brownout detected
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES PUT //Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will 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 IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
//#FUSES PBADEN //PORTB pins are configured as analog input channels 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 MCLR //Master Clear pin enabled
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
//#FUSES LP //Low power osc < 200 khz
*///////////////////////// FIN FUSES //////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////
//
// INICIALIZACIONES GENERALES
//
////////////////////////////////////////////////////////////////////////////////////
/*
delay_ms(333); // Espero a que todo se estabilice e ...
disable_interrupts(global); // Inicializo el Micro y ...
disable_interrupts(int_timer1); // deshabilitando todo lo no necesario ...
disable_interrupts(int_rda);
disable_interrupts(int_ext);
disable_interrupts(int_ext1);
disable_interrupts(int_ext2);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_0(RTCC_OFF);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(FALSE);
delay_ms(333);
//setup_oscillator(OSC_8MHZ|OSC_TIMER1|OSC_31250|OSC_PLL_OFF); //Creo que no existe en 18f4520
*/
////////////////////////////////////////////////////////////////////////////////////
//
// Funciones básicas
//
////////////////////////////////////////////////////////////////////////////////////
/*
#include <lib_int_eeprom.c> //Manejar eeprom con mas de 8 bits, librería larga, no funciona bien
#include <lib_int_eeprom_basica.c> //Manejar eeprom con mas de 8 bits, librería corta, hay que pegarla el el main.c
write_eeprom_16bits(0x04, valor);
read_eeprom_16bits(0x04)
write_eeprom(0x00, valor); //Librería estandar para manejar 4bits en la eeprom
read_eeprom(0x00);
printf("%f",read_eeprom_16bits(0x04));
set_tris_A(0xFF); //Puerto A como entrada
setup_adc_ports(all_analog); //Configurar los pines RA0, RA1, RA3 como entradas analógicas
setup_adc(ADC_CLOCK_DIV_32); // Configurar el tiempo de lectura para cada dato analógico. Hay que configurarlo en función de los Mhz del micro.
portB = 0; // Limpiamos puertos
LATB=0; // Limpiamos puertos, mejor usar LATx para las salidas ¿?
output_high(PIN_B0);
output_bit(PIN_B2,1);
output_low(PIN_B0);
output_bit(PIN_B2,0);
input(PIN_A0) //Pin a 1
!input(PIN_A0) //Pin a 0
Output_Toggle(PIN_E0); //cambiar estado
lcd_init();
set_adc_channel(0);
delay_ms(2);
valor1 = read_adc();
delay_ms(2);
lcd_putc("Bienvenido");
lcd_gotoxy(1,1);
printf(lcd_putc,"\V RA0: %lu", valor1);
setup_ccp1(CCP_PWM); //ccp1 modo PWM
read_eeprom(address);
write_eeprom(address, byte);
*///////////////////////// FIN FUNCIONES BÁSICAS //////////////////////////////////////////
#include <18F452.h>
#device adc=16
#include <STDIO.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(clock=20000000)
#include "flex_lcd.c"
#byte PORTA=0xF80
#byte PORTB=0xF81
#byte PORTC=0xF82
#byte PORTD=0xF83
#byte PORTE=0xF84
#byte LATA=0xF89
#byte LATB=0xF8A
#byte LATC=0xF8B
#byte LATD=0xF8C
#byte LATE=0xF8D
void write_eeprom_16bits(int address, long* val){
int pLow, pHigh;
pLow = val;
pHigh = val>>8;
write_eeprom(address,pHigh);
delay_ms(12);
++address;
write_eeprom(address,plow);
delay_ms(12);
}
long read_eeprom_16bits(int address){
int pLow, pHigh;
long result;
pHigh = read_eeprom(address);
++address;
pLow = read_eeprom(address);
result=(pHigh<<8);
result+=pLow;
return result;
}
////////////////////////////////////////////////////////////////////////////////////
//
// Interrupción por Externa por Cambio de Flanco en RB0
//
////////////////////////////////////////////////////////////////////////////////////
int16 cont_desbordes_t0 = 0;
#int_rtcc
void handle_rtcc_int()
{cont_desbordes_t0 ++;
Set_timer0(6942);
} // milisegundos = cont_desbordes_t0*3000 + (GET_TIMER0()-6942)*0.0512;
////////////////////////////////////////////////////////////////////////////////////
//
// Main
//
////////////////////////////////////////////////////////////////////////////////////
void main()
{
////////////////////////////////////////// INICIALIZACIONES GENERALES
delay_ms(333); // Espero a que todo se estabilice e ...
disable_interrupts(global); // Inicializo el Micro y ...
disable_interrupts(int_timer1); // deshabilitando todo lo no necesario ...
disable_interrupts(int_rda);
disable_interrupts(int_ext);
disable_interrupts(int_ext1);
disable_interrupts(int_ext2);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_wdt(WDT_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_0(RTCC_OFF);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED);
/////////////////////////////////////////// INICIALIZACIONES PERTINENTES A LA APLICACION
setup_timer_0(RTCC_DIV_256); // Ajusto divisor de TMR0 con una divisor de 256
enable_interrupts(int_rtcc);
enable_interrupts(global); // Habilito las interrupciones necesarias
set_tris_C(0x00);
set_tris_B(0x00);
set_tris_E(0x00);
LATC=0;
LATB=0;
LATE=0;
int16 segundos = 0;
int16 milisegundos = 0;
lcd_init();
lcd_gotoxy(1,1);
SET_RTCC(0);
while (1)
{lcd_gotoxy(1,1);
printf(lcd_putc,"Num desbor.: %lu", cont_desbordes_t0);
lcd_gotoxy(1,2);
segundos = cont_desbordes_t0*3 + (GET_TIMER0()-6942)*0.0000512;
milisegundos = cont_desbordes_t0*3000 + (GET_TIMER0()-6942)*0.0512;
printf(lcd_putc,"Segundos: %lu", milisegundos);
}
}