Hola muy buenas.
Estoy migrando parte de mi codigo desde ccs a c18 y para entender bien el funcionamiento del dispositivo. Estoy haciendo prueba en base a un temporizador y un led en RC6 y un cristal de 20Mhz.
La configuracion es la siguiente
/*Configuracion del pic*/
#pragma config PWRT=ON, BOR=OFF, BORV=0
#pragma config WDT=OFF, WDTPS=32768
#pragma config MCLRE=ON, LPT1OSC=OFF, PBADEN=OFF, CCP2MX=OFF
#pragma config STVREN=OFF, LVP=OFF, XINST=OFF /*DEBUG=OFF*/
#pragma config CP0=OFF, CP1=OFF, CP2=OFF, CPB=OFF, CPD=OFF
#pragma config WRT0=OFF, WRT1=OFF, WRT2=OFF
#pragma config WRTB=OFF, WRTC=OFF, WRTD=OFF
#pragma config EBTR0=OFF, EBTR1=OFF, EBTR2=OFF, EBTRB=OFF
#pragma config FOSC=HSPLL_HS, FCMEN=OFF, IESO=OFF
#pragma config USBDIV=1, PLLDIV=5, CPUDIV=OSC1_PLL2
#pragma config VREGEN=ON
y la configuracion del timer0 es la siguiente
/* 4*Prescaler*(65535-Valor)
Tp=--------------------------
cristal(hz) */
OpenTimer0(T0_16BIT||T0_SOURCE_INT||T0_EDGE_RISE||
T0_PS_1_8||TIMER_INT_ON);
WriteTimer0(0x0bdb);
INTCONbits.TMR0IE=1;
INTCONbits.GIEL = 1;
INTCONbits.GIEH = 1; /*Habilitamos interrupciones*/
Segun la formula tenemos un Tiempo de desborde = 4*8*65535/20.000.000 = 0,104856s=104.86 ms
Como quiero contar intervalos de 100ms, cargo en el registro del Timer0 el valor 3035 (0x0bdb) y asi cuenta de 100 en 100.
Bueno la duda reside en lo siguiente: en la interrupcion del timer0 tengo un contador que incremento hasta 10 (1 segundo) donde los 5 primeros esta encendido y los 5 segundos esta apagado, pues cuando lo hecho a correr, va sensiblemente mas rapido de lo que debiera.
os pego el codigo completo
#include <p18f2550.h>
#include <timers.h>
#include <delays.h>
#include "config_lib.h"
/*Configuracion del pic*/
#pragma config PWRT=ON, BOR=OFF, BORV=0
#pragma config WDT=OFF, WDTPS=32768
#pragma config MCLRE=ON, LPT1OSC=OFF, PBADEN=OFF, CCP2MX=OFF
#pragma config STVREN=OFF, LVP=OFF, XINST=OFF /*DEBUG=OFF*/
#pragma config CP0=OFF, CP1=OFF, CP2=OFF, CPB=OFF, CPD=OFF
#pragma config WRT0=OFF, WRT1=OFF, WRT2=OFF
#pragma config WRTB=OFF, WRTC=OFF, WRTD=OFF
#pragma config EBTR0=OFF, EBTR1=OFF, EBTR2=OFF, EBTRB=OFF
#pragma config FOSC=HSPLL_HS, FCMEN=OFF, IESO=OFF
#pragma config USBDIV=1, PLLDIV=5, CPUDIV=OSC1_PLL2
#pragma config VREGEN=ON
#define TRUE 1
void low_isr(void);
#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
_asm GOTO low_isr _endasm
}
#pragma code
volatile int cnt=0;
volatile int flag=0;
void main(void)
{
GpioSetup(); /*Configuracion pines*/
/* 4*Prescaler*(65535-Valor)
Tp=--------------------------
cristal(hz) */
OpenTimer0(T0_16BIT||T0_SOURCE_INT||T0_EDGE_RISE||
T0_PS_1_8||TIMER_INT_ON);
WriteTimer0(0x0bdb);
INTCONbits.TMR0IE=1;
INTCONbits.GIEL = 1;
INTCONbits.GIEH = 1; /*Habilitamos interrupciones*/
while(TRUE)
{
if(cnt<=5)
{
LATCbits.LATC6=1;
}else if(cnt>5&&cnt<=10)
{
LATCbits.LATC6=0;
}
}
}
#pragma interruptlow low_isr
void low_isr (void)
{
if(INTCONbits.TMR0IF==1)
{ /*Interrupcion del timer0*//*Se da cada 100ms*/
cnt++;
if(cnt>10)
{
cnt=0;
}
/*Reiniciamos la cuenta*/
WriteTimer0(3035);
/*Limpiamos la bandera*/
INTCONbits.TMR0IF=0;
}
}
Saludos