¿Contando los bordes del reloj interno de PIC18F46K20 utilizando MPLAB C18?

1

Estoy tratando de crear un temporizador de cuenta regresiva utilizando el PIC18F46K20 y mostrar la hora en el OLED. He configurado TIMER0 para crear un retraso de 1 segundo (T0CON = 0b00000001), por lo que la variable intCLKsecs debería aumentar cada segundo.

    Timer0_Init();          //Initialise timer
T0CONbits.TMR0ON = 1;  // start timer

while(INTCONbits.TMR0IF = 1) {

/ * Compruebe los bordes del reloj e incremente los segundos de cuenta en uno en cada flanco descendente.    El temporizador está configurado para emitir pulsos que están separados aproximadamente 1 segundo. * /         INTCONbits.TMR0IF = 0; // Borrar la bandera

    korf_intCLKsecs++; //Should increase by one every second on every falling edge 
    korf_InitSecs = 1800; //Initialised time for a single korfball half
    net_timeLeft = net_InitSecs-net_intCLKsecs; //Time remaining in the half
    displayTime(net_timeLeft);

}

Paso el [timeLeft] a una función que lo formatea y lo muestra como un reloj, es decir, a las 8:56. Aquí está la función de reproducción de tiempo.

int displayTime(int currentTime)
{
    int secs;
    int mins;
    char Buffer[60];
    secs =  currentTime % 60;
    mins = (currentTime / 60) % 60;


    sprintf(Buffer, "\n\t\t %d : %d
    Timer0_Init();          //Initialise timer
T0CONbits.TMR0ON = 1;  // start timer

while(INTCONbits.TMR0IF = 1) {
",mins,secs); oled_puts_1x(Buffer); oled_refresh(); oled_clear(); }

Me disculpo si he cometido algún error en la forma en que estoy publicando, soy muy nuevo en los foros y en la programación de PICKit. ¿Alguien puede ayudarme a averiguar cómo obtener un valor correcto en mi variable intCLKsecs contando los pulsos CLK en cada flanco descendente? ¿Qué escribo en MPLAB IDE para asegurarme de que [intCLKsecs] aumenta en cada flanco descendente?

    
pregunta DixonLamont

1 respuesta

1

El temporizador 0 configurado para un "retraso" de 1 segundo suena inverosímil a menos que esté usando un reloj lento muy .

Por lo general, la forma en que normalmente creo tics de reloj lentos (como 1 segundo) es usar el temporizador 2 con su registro de período incorporado para hacer un tictac de reloj de 1 ms. Eso sigue siendo "lento" en relación con la rapidez con la que se puede ejecutar el PIC. Si el PIC se está ejecutando a una velocidad de instrucción de 10 MHz, entonces la interrupción de 1 ms ocurrirá una vez cada 10.000 instrucciones, lo que significa que toma una pequeña fracción del tiempo total del procesador. Luego cuenta varios periodos de 1 ms en el firmware para realizar otros tics de reloj.

Por ejemplo, puede contar 100 de ellos para hacer un reloj de 100 ms, y 10 de ellos para hacer un reloj de 1 segundo. A menudo, varias velocidades diferentes de tictac de reloj interno son útiles. Si realmente solo necesita 1 segundo, configure el temporizador 2 para el mayor múltiplo de 1 segundo de ciclos de instrucción que pueda administrar, luego cuente el firmware desde allí.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas