Usando el desbordamiento de Timer0 para bloquear Timer1 en PIC12F1822

7

Estoy tratando de usar TMR1 para contar los desbordamientos de TMR0 . Para hacer esto, estoy usando TMR1 con la puerta habilitada, y estoy usando TMR0 overflow como fuente de la puerta.

Al usar MPLAB SIM, puedo ver que TMR0 está contando y desbordando. El TMROIF bit en INTCON se está configurando correctamente.

TMR1 cuenta correctamente sin la puerta habilitada, y se detiene cuando habilito el control de la puerta, hasta ahora todo bien.

Sin embargo, el desbordamiento de TMR0 no parece estar activando la puerta. El T1GVAL bit de T1GCON nunca se establece.

Estoy ejecutando TMR1 en Fosc y tengo la puerta ejecutando no en modo de conmutación o modo de pulso único ... TMR0 se está ejecutando en instruction clock / 256 , aunque supongo que esto no importa ...

Aquí están mis bits de configuración:

__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF</code>
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF

y aquí están las líneas relevantes donde configuro TMR1

banksel T1CON
movlw   b'01000001' ; source = Fosc, prescale 1:1, LP osc - no, Timer on
movwf   T1CON

banksel T1GCON
movlw   b'11000001' ; gate enabled, active high, toggle no, pulse mode no, source TMR0
movwf   T1GCON
    
pregunta tsiflana

1 respuesta

8

Creo que su problema se basa en la confusión sobre lo que realmente hace la señal de la Puerta TMR1. Por sí solo, hace que el temporizador cuente, simplemente lo habilita para que cuente si hay eventos adecuados en su entrada de reloj.

Es sutil, pero si observa "FIGURA 21-1: DIAGRAMA DE BLOQUEO DEL TEMPORIZADOR1" en la hoja de datos (pág. 179), verá el registro TMR1H / TMR1L en el medio. Toda la lógica anterior está relacionada con el gating, y toda la lógica siguiente está relacionada con la sincronización. Todo se junta en el flip-flop justo a la derecha del registro TMR1, donde la señal de la puerta controla la entrada EN (habilitación) de ese flip-flop, y la señal del reloj controla la entrada D (datos).

Lo que esto significa es que la salida del flip-flop cambiará (y hará que TMR1 se incremente) solo si la señal de la puerta es alta y la señal del reloj está alternando.

Simplemente no hay manera de enrutar eventos de desbordamiento desde TMR0 a la lógica clock de TMR1, ya sea dentro o fuera del chip.

EDICION: OK, profundizando un poco más (como lo indican los comentarios a continuación), observo que tiene el bit T1SYNC en el registro T1CON establecido en cero. Esto hace que la fuente del reloj se sincronice con Fosc. Si esa fuente de reloj es de hecho Fosc, la salida del sincronizador será un nivel constante, siempre alta o siempre baja, pero sin conmutación.

Creo que este es la causa raíz de su problema. Intente configurar T1CON en b'01000101' . Esto debería lograr lo que desea, asumiendo que el pulso de desbordamiento de TMR0 es exactamente de un período Fosc.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas