TIMER1

     El TIMER1 es mucho mas potente y flexible que el sencillo TIMER0. Así el TIMER1 se caracteriza por:

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


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
                BANKSEL PORTA
               
;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


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