Hola a todos
Solicito un poco de su orientación. EStoy trabajando con un
PIC18LF4550 montado en una protoboard con el circuito minimo recomendado: boton de reset, cristal de 20MHz con sus correspondientes capacitores de 22pF y utilizando ICSP.
Usando el cristal a 20Mz y la funcion __delay_ms(500) puedo observar una onda cuadrada con un tiempo en "ON" de 500ms, hasta aquí todo bien.
#include <xc.h>
#pragma config FOSC = HS
#pragma config MCLRE = ON
#pragma config PWRT = ON
#pragma config LVP = OFF
#define _XTAL_FREQ 20000000
void main(void) {
TRISDbits.RD0 = 0;
LATDbits.LATD0 = 0;
while(1){
__delay_ms(500);
LATDbits.LATD0 = !LATDbits.LATD0;
}
}
Ahora el segundo paso, fue utilizar el TIMER0 con una interrupción (desbordamiento de TMR0) cada 1ms, y asi contar 500 veces 1ms para obtener 500ms, el problema es que al visualizar la forma de onda en el osciloscopio, de ningura manera corresponde a 500ms parece de 700ms
#include <xc.h>
#include <stdbool.h>
#pragma config FOSC = HS
#pragma config MCLRE = ON
#pragma config PWRT = ON
#pragma config LVP = OFF
#define SAMPLING_F 500
#define _XTAL_FREQ 20000000
/*
*
*/
int contador = 1;
bool tmrflag = 0;
void __interrupt() myISR(){
if(INTCONbits.TMR0IF){
//El contador se desborda cad 1ms
INTCONbits.TMR0IF = 0;
contador++;
if(contador == SAMPLING_F){
contador = 1;
tmrflag = 1;
}
}
}
void main(void) {
//OSCCON = 0b01110000;
TRISDbits.RD0 = 0;
LATDbits.LATD0 = 0;
//Prescaller 1:32, 8-bit mode
T0CON = 0b11000100;
//Precarga para 0.9984ms aprox 1ms
TMR0 = 0x64;
INTCONbits.TMR0IF = 0;
INTCONbits.TMR0IE = 1;
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
while(1){
if(tmrflag){
LATDbits.LATD0 = !LATDbits.LATD0;
tmrflag = 0;
}
}
}
Ya intente cambiando el prescaler del Timer0 y el valor de precarga en TMR0 y aun asi no funciona.
¿Que creen que podría ser?