1° TMR1 es un contador/temporizador de 16 bits.
2° Leible y escribible.
3° Selección de reloj interno o externo
4° Interrupción opcional por desbordamiento de FFFFh a 0000h.
5° posible reinicializacion desde los modulo CCP.
Estructura interna y funcionamiento
El TMR1 es el único Temporizador/contador ascendente con un tamaño de 16 bits, lo que requiere el uso de dos registros concatenados de 8 bits: TMR1H:TMR1L, que son los encargados de guardar el valor del contage en cada momento. Dicho valor evoluciona desde 0000h hasta ffffh, instante en el que se activa el señalizador TMR1H y se regresa al valor inicial 0000h. Tambien, si se desea, se puede provocar una peticion de interrupcion.
El valor contenido en TMR1H:TMR1L puede ser leido o escrito y los impulsos de reloj que originan el contaje ascendente pueden provenir del exterior o de la frecuencia de funcionamiento del microcontrolador (Fosc/4)
El TMR1 es capaz de funcionar de tres formas:
1° Como temporizador.
2° Como contador sincrono.
3° Como contador asincrono.
En el modo Temporizador el valor concatenado TMR1H:TMR1L se incrementan con cada ciclo de instrucción (Fosc/4). En el modo contador, el incremento se puede producir con los francos ascendentes de un reloj externo, cuya entrada se aplica a las lineas RC0 y RC1 del PUERTOC, o por impulsos aplicados en la linea RC0.
Registro de control del TMR1(T1CON)
El funcionamiento del TMR1 esta gobernado por el valor con el que se programan los bits del registro T1CON, que ocupa la dirección 10h de la memoria RAM y cuya denominación y distribución son las siguientes:
*cuando los impulsos proceden de un reloj externo, es preciso que el bit T1OSCEN tenga valor 1, en cuyo caso las patitas RC0/T1CKI/T1CKO y RC1/T1OSI/CCP2 actúan como entradas del oscilador externo. Si T1OSCEN cale 0 los impulsos vendrán a través de RC=/T1OSO/T1CKI. En ambos casos, el TMR1 funciona como contador de eventos externos y los bit 1 y 0 (utilizados) del registro TRISC carecen de signoficado ya que uno o ambas patitas RC1 y RC0 no pueden actuar al mismo tiempo con entrada de impulso y como lineas de E/S.
El TMR1 puede generar una petición de interrupción cuando se produce el sobrepasamiento del contaje, es decir, cuando se pasa desde FFFFh a 0000h. E n esta situación se pone automáticamente a 1 el flag TMR1F, que es el bit 0 del registro especifico PIR1, que esta ubicado en la dirección 0Ch de la RAM. El permiso o prohibición de la producción de interrupción del TMR1, esta controlada por el bit TMR1IE, que ocupa la posición de menos peso del registro especifico PIE1 (8Ch).
Resumen de los bits de los registros que se utilizan en el manejo y programación del TMR1
precarga = Valor que se le asigna al par de registros TMR1 al comenzar la temporización
PS = Valor del preescalador
Tinstr = 4/ frecuencia de oscilación
TempTMR1 = Temporización dada en segundos
En el programa que se le presenta a continuacion se requiere de un retardo con Timer1, por poleo, a su maximo valor preescaler (1:8), y un valor de TMR1=0, pues de esta manera se obtiene el maximo retardo que este puede generar (524,288ms), dicho programa permiteira encender un led por 2 seg, apagarlo, luego enceder un led2 por 3 seg, apagarlo, luego encender un tercer led por 4 segundos, apagarlo y finalmente encender un cuarto led por 5 segundos, apagarlo y se repite el programa.
BANKSEL PORTA
Acá esta otro programa de TIMER1 como TEMPORIZADOR para simular, con su archivo de proteus y mplab:
https://mega.nz/#!bVF0iJJb!s0MHoX5eRfe3xFkDRiZxsqVDS7mq480ZiGyaZQuq9A0
Resumen de los bits de los registros que se utilizan en el manejo y programación del TMR1
Carga y Temporización
En modo temporizador el Timer 1 incrementa su cuenta en
cada ciclo de instrucción. La temporización que se puede
obtener con este módulo se obtiene de la siguiente relación:
Dónde:
precarga = Valor que se le asigna al par de registros TMR1 al comenzar la temporización
PS = Valor del preescalador
Tinstr = 4/ frecuencia de oscilación
TempTMR1 = Temporización dada en segundos
PROGRAMA TIMER1
Temporizador por polling
En el programa que se le presenta a continuacion se requiere de un retardo con Timer1, por poleo, a su maximo valor preescaler (1:8), y un valor de TMR1=0, pues de esta manera se obtiene el maximo retardo que este puede generar (524,288ms), dicho programa permiteira encender un led por 2 seg, apagarlo, luego enceder un led2 por 3 seg, apagarlo, luego encender un tercer led por 4 segundos, apagarlo y finalmente encender un cuarto led por 5 segundos, apagarlo y se repite el programa.
CODIGO
LIST
p=16F887
INCLUDE
<P16F887.inc>
__CONFIG
_CONFIG1, _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF &
_CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF &
_INTRC_OSC_NOCLKOUT
__CONFIG
_CONFIG2, _WRT_OFF & _BOR21V
CONT1 EQU
0x20
CONT2 EQU
0x21
CONT3 EQU
0x22
CONT4 EQU 0x23
;configuracion de los puertos
ORG 0x00
BANKSEL ANSEL ;nos movemos al banco 3
CLRF ANSEL ; limpiamos los puertos analogicos
CLRF ANSELH
BANKSEL TRISA ;nos movemos al banco 1
CLRF TRISA ; limpiamos el trisb
BANKSEL PORTA ;nos movemos al banco 0
CLRF PORTA ;limpiamos el puertoA
BANKSEL OPTION_REG
MOVLW 0x80 ;Desabilitamos el timer 0
BANKSEL T1CON
MOVLW 0x30 ;selecciono el valor del pereescaler 1:8
(BIT 4 Y BIT4)
MOVWF T1CON
;inicio del programa
INICIO MOVLW D'4' ;bucle para que el led permanezca encendido 2 seg
MOVWF CONT1
MOVLW D'6' ;bucle para que el led permanezca encendido 3 seg
MOVWF CONT2
MOVLW D'7' ;bucle para que el led permanezca encendido 4 seg
MOVWF CONT3
MOVLW D'9' ;bucle para que el led permanezca encendido 5 seg
MOVWF CONT4
LED1 MOVLW 0x01 ;asignamos el valor 1h literalmente a w
MOVWF PORTA ;movemos el valor de w al puertoA para ser
mostrado
CALL RETARDO ;llamamos a la subrutina retardo
DECFSZ CONT1,1 ;decrementamos el contador1 y lo guardamos en 1
GOTO LED1 ;volvemos a led1
CLRF PORTA ;limpiamos el puertoA
LED2 MOVLW 0x02 ;asignamos el valor 2h literalmente a w
MOVWF PORTA ;movemos el valor de w al puertoA para ser
mostrado
CALL RETARDO ;llamamos a la subrutina retardo
DECFSZ CONT2,1 ;decrementamos el contador2 y lo guardamos en 1
GOTO LED2 ;volvemos a led2
CLRF PORTA ;limpiamos el puertoA
LED3 MOVLW 0x04 ;asignamos el valor 4h literalmente a w
MOVWF PORTA ;movemos el valor de w al puertoA para ser
mostrado
CALL RETARDO ;llamamos a la subrutina retardo
DECFSZ CONT3,1 ;decrementamos el contador3 y lo guardamos
en 1
GOTO LED3 ;volvemos a led3
CLRF PORTA ;limpiamos el puertoA
LED4 MOVLW 0x08 ;asignamos el valor 8h literalmente a w
MOVWF PORTA ;movemos el valor de w al puertoA para ser
mostrado
CALL RETARDO ;llamamos a la subrutina retardo
DECFSZ CONT4,1 ;decrementamos el contador4 y lo guardamos
en 1
GOTO LED4 ;volvemos a led4
CLRF PORTA ;limpiamos el puertoA
GOTO INICIO ;volvemos al inicio
;---------SUBRUTINA PARA GENERAR UN RETARDO
EN LOS LED---------------
RETARDO BCF PIR1,0 ;limpia la bandera de TMR1IF, esta indica
el desbordamiento del TMR1
CLRF TMR1L ;pone a cero la parte baja de TMRL1
CLRF TMR1H ;pone a cero la parte alta de TMRL1
BSF T1CON,0 ;activa el TMR1, Bit 0:TMR1ON
ESPERA BTFSS PIR1,0 ;pregunta por el estado de la bandera
TMR1IF
GOTO ESPERA ;volvemos a espera
BCF PIR1,0 ;limpia bandera TMR1IF
RETURN ;retornamos
END
ARCHIVOS PARA SIMULAR EN PROTEUS Y MPLAB, CLIC EN EL SIGUIENTE ENLACE:
https://mega.nz/#F!TB9VDaoY!spzoM59THblgK1WB2msrFA
MONTAJE EN PROTEUS
ARCHIVOS PARA SIMULAR EN PROTEUS Y MPLAB, CLIC EN EL SIGUIENTE ENLACE:
https://mega.nz/#F!TB9VDaoY!spzoM59THblgK1WB2msrFA
Acá esta otro programa de TIMER1 como TEMPORIZADOR para simular, con su archivo de proteus y mplab:
https://mega.nz/#!bVF0iJJb!s0MHoX5eRfe3xFkDRiZxsqVDS7mq480ZiGyaZQuq9A0
No hay comentarios:
Publicar un comentario