¿Cómo configurar el oscilador interno en un PIC16F616?

5

Quiero usar el oscilador interno en PIC16F616 en una configuración de 8 MHz y tengo el I Función / O en RA4 y RA5 . He leído la hoja de datos y no encuentro lo que estoy haciendo mal.

Por lo que entiendo de la siguiente información, TMR0 debería aumentar cada 500 ns, y debería crear una interrupción cuando se desborda de "0xFF" a "0x00". Sin embargo, RA4 pin alterna cada 20 usuarios.

De la hoja de datos:

  

5.1.1

     

MODO TEMPORIZADOR DE 8 BITS

     

Cuando se usa como temporizador, el módulo Timer0   incrementar cada ciclo de instrucción (sin precalificación).

     

El modo de temporizador se selecciona borrando el bit T0CS de la   OPCION registrarse en ‘0’.

También;

  

Nota: el valor escrito en el registro TMR0 puede   ajustarse, para tener en cuenta las dos   instrucción ciclo de retraso cuando TMR0 es   escrito.

Aquí está mi código, mi compilador es MPLAB XC8. :

#include <xc.h>
__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF & IOSCFS_8MHZ & BOREN_ON);

void interrupt myInterrupt(void)
{
    if (T0IE && T0IF)
    {
        RA4 = ~RA4;
        TMR0 = 254;
        T0IF = 0;
    }
}

void main()
{
    TRISA = 0;
    ANSEL = 0;

    PSA = 1; // Prescaler Assignment bit : 1 = Prescaler is assigned to the WDT, 0 = Prescaler is assigned to the Timer0 module
    T0CS = 0; // T0CS: TMR0 Clock Source Select bit : 0 = Internal instruction cycle clock (FOSC/4), 1 = Transition on T0CKI pin
    T0IE = 1; //T0IE: Timer0 Overflow Interrupt Enable bit
    GIE = 1; //GIE: Global Interrupt Enable bit

    while (1);
}
    

2 respuestas

2

Configurar TMR0 en un valor fijo en la rutina de interrupción es una mala idea si desea una interrupción periódica confiable. Lo está configurando en 254. Eso crea 2 ciclos muertos y luego necesita 2 ciclos más para desbordarse. La condición de interrupción se establecerá mucho antes de que el procesador pueda volver y meter otros 254 en el temporizador. Está utilizando un compilador (no lo haga al mirar instrucciones individuales), por lo que no sabe cuántas instrucciones hay para salir de la rutina de interrupción y cuántas hay en la entrada. 20 µs implica 40 ciclos de instrucción. Eso suena alto, pero una vez más, estás usando un compilador , así que ya dijiste que no te importa la eficiencia y que has renunciado al derecho de contar ciclos.

Si desea verificar que el PIC se está ejecutando a la velocidad de reloj correcta, deje que el temporizador 0 se ejecute sin tocarlo. Eso debería interrumpir cada 256 ciclos de instrucción, o cada 128 µs.

Si desea una interrupción periódica confiable, la primera reacción debe ser usar el temporizador 2. Para eso está el motivo y por qué tiene un registro de período incorporado. Si necesita el temporizador 2 para otra cosa, aún puede usar el temporizador 0 pero agregar en cada interrupción, no restablecer su valor. De esa manera, el tiempo transcurrido desde que el temporizador finaliza hasta que se vuelve a escribir no se pierde. Además, no espere un período tan corto como 4 ciclos de instrucción. El PIC no puede entrar y salir de una interrupción tan rápido, incluso sin guardar el estado.

    
respondido por el Olin Lathrop
-1

Lugar de cambio simple para void interrupt myInterrupt (void) después de main function.

    
respondido por el JekaKey

Lea otras preguntas en las etiquetas