oK.. después de leer algunos libros ve que para generar este tipo de señales es mejor utilizar interrupciones, por lo tanto me puse en la tarea de realizar esta misma señal pero por medio de interrupciones pero esta vez utilizando una velocidad de 48Mhz.. a partir de un oscilador de cristal de 8Mhz.. Una duda que me genera es que la señal cuadrada no sale exacta, debería ser de 5khz y sale de 4.685khz utilizo el timer0 a 16bits sin prescaler y interrupcion por desbordamiento..
////////////////Calculos:
Ancho_de_pulso = TMR0*TOSC*4*TMR0PRE .....
Ancho de pulso= 100us ya que es una onda cuadrada de 5khz
T0SC= 1/48Mhz
TMR0PRE=1
TMR0=1200.
Eso quiere decir que para obtener esa frecuencia debo de cargar los registro TMR0H y TMR0L con 65536-1200=64336 que es lo mismo FB50 TMR0H=FB y TMR0L=50
Pero el valor esperado no es el que aparece en el osciloscopio. Lo fácil seria cuadrar a prueba y error el valor de los dos registro TMR0H y TMR0L que es lo haría si no encuentro otra forma.. Me gustaría saber si alguien sabe la explicación del porque se genera esto. Algo que se me viene a la cabeza es que el problema se deba algun retador por Latencia en sistema o cuando se genera la atención de la ISR. ¿Esto ocurre con todos los timer?
Anexo codigo
//Configuaracion de bits//////////////////////////
#pragma config PLLDIV = 2 //Cristal de 8Mhz lo dividimos entre 2 para tener los 4Mhz
#pragma config CPUDIV = OSC1_PLL2 //Los 96Mhz de PLL lo dividimos entre 2 para tener los 48Mhz con lo que vamos a trabajar
#pragma config USBDIV = 2 /////Tomar el reloj para USB desde el PLL- 48Mhz
#pragma config FOSC = HSPLL_HS //Configurando oscilador interno
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config BORV = 0
#pragma config VREGEN = OFF
#pragma config WDT = OFF
#pragma config WDTPS = 16384
#pragma config MCLRE = OFF
#pragma config LPT1OSC = OFF
#pragma config PBADEN = ON
#pragma config CCP2MX = OFF
#pragma config STVREN = OFF
#pragma config LVP = OFF
#pragma config ICPRT = OFF
#pragma config XINST = OFF
#pragma config DEBUG = OFF
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF,CP3 = OFF
#pragma config CPB = OFF
#pragma config CPD = OFF
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF,WRT3 = OFF
#pragma config WRTB = OFF
#pragma config WRTC = OFF
#pragma config WRTD = OFF
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF,EBTR2 = OFF,EBTR3 = OFF
///Include////
#include <p18f4550.h>
#include <delays.h>
//Variables globales
int estado=0;
/*Prototipos de funciones*/
void Interrupt_ISR_TMR0(void);
void Change_Estado(void);
///////////////////////////////////////////////
#pragma code High_vector_Interrupt = 0x08
void High_vector(void){
_asm goto Interrupt_ISR_TMR0 _endasm
}
#pragma code
////////////////////////////////////////////
#pragma interrupt Interrupt_ISR_TMR0
void Interrupt_ISR_TMR0 (void)
{
if(INTCONbits.TMR0IF ==1 ){ //Si el timer0 se desbordo 0xFFFF a 0x0000
INTCONbits.TMR0IF =0; //Borramos la bandera
Change_Estado(); //Llamamos la funcion que se realiza cuando esto ocurre.
TMR0H=0XFB;
TMR0L=0X50;
}
}
void main(){
OSCCONbits.SCS1=0; //Configurando como Oscilador primario
OSCCONbits.SCS0=0;
TRISBbits.RB1=0; //Configurando como salida el PinRB1 del puerto B
LATBbits.LATB1=0; //Estableciendo a un nivel bajo el PinRB1
ADCON1=0x0F; //Configurando todos los puerto como Digitales.
T0CONbits.TMR0ON=0; //Timer 0 off
T0CONbits.T08BIT=0; //Configurado a 16bits
T0CONbits.T0CS=0; //Internal
T0CONbits.T0SE=0;
T0CONbits.PSA=1; //Prescaler no asignado
TMR0H=0XFB;
TMR0L=0X50;
RCONbits.IPEN=1; //Enable priority levels on Interrupts
INTCONbits.TMR0IF=0; //Clear TF0
INTCONbits.GIE_GIEH=1; //Enable Global interrupt
INTCONbits.TMR0IE=1; //Enable TMR0 overflow
INTCON2bits.TMR0IP=1; //High priority
T0CONbits.TMR0ON=1; //on Timer 0
while(1){}
}
void Change_Estado(void){
if(estado==0){
LATBbits.LATB1=1;
estado=!estado;
} else if (estado==1){
LATBbits.LATB1=0;
estado=!estado;
}
}