Timer 1

Timer 1 Es un módulo del microcontrolador que es semejante al TMR0, que a diferencia con este último este nuevo es un re

Views 111 Downloads 0 File size 518KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Timer 1 Es un módulo del microcontrolador que es semejante al TMR0, que a diferencia con este último este nuevo es un registro de 16 bits. Pero si nuestros códigos solamente nos permiten manipulación de 8 bits, como funciona con 16? La respuesta es que este registro se divide en 2 subregistros, donde en uno de ellos se almacenan los 8 bits menos significativos (LSB) y en el otro los 8 más significativos (MSB).

Entonces para poder cargar un valor al TMR1 hay que cargar los MSB y LSB en esos dos registros que se encuentran en el Banco 0 del microcontrolador. según su datasheet.

Modos de trabajo

El módulo TMR1 tiene dos modos de trabajo principales. Como TEMPORIZADOR o CONTADOR. Su configuración y selección dependerá del registro T1CON. COMO TEMPORIZADOR : El incremento del timer se da por los pulsos brindados del oscilador de cristal. Para nuestro pic es de 20MHZ. Se usa esta forma para generación de retardos y tiempos de utilidad. COMO CONTADOR : Es un contador de 16 bits, El cual su fuente de incremento de cuenta son los pines RC0 y RC1. Sin embargo esta configuración presenta una característica adicional. • Contador Síncrono : Es el modo normal del timer 1, por cada pulso de entrada en el

puerto RC0 o RC1 el valor del registro TMR1L incrementará en una unidad. Se dice que es síncrono; debido a que, el pulso es detectado en un proceso perteneciente a la oscilación del cristal de nuestro microcontrolador. Por lo que si mandamos nuestro microcontrolador al modo de bajo consumo ("sleep") ya no podremos incrementar la cuenta hasta que despertemos al pic. • Contador Asíncrono: Es un modo del timer 1, que tiene la ventaja de funcionar aún cuando el microcontrolador haya entrado al modo de bajo consumo ("sleep"). Estando en ese modo por cada pulso que se le brinde a los pines de entrada el registro TMR1L seguirá incrementando su cuenta. Podremos ver el valor actual o realizar acciones si despertamos al pic mediante una interrupción. Entrando en este modo existe una aplicación muy usada cuando se requiere trabajar con tiempos precisos y relojes digitales. Pues basta con conectar en los pines RC0 y RC1 un cristal de 32.768KHz con algunas configuraciones para generar un retardo exacto de 1 segundo.

Configuración del TMR1 Para realizar las configuraciones con los registros involucrados, es necesario observar el diagrama de bloques.

Timer 1: Diagrama de bloques. Fuente: Datasheet Timer1bloques.JPG (39.49 KiB) Visto 1731 veces Se puede observar que el bit "TMR1CS" me seleccionará la fuente de pulsos para incrementar el timer. Con eso se podrá configurar como contador o temporizador. Para continuar la línea viene el preescalador que puede ser de utilidad si deseamos valores más grandes. También hay que ver que el bit "T1SYNC" está en modo negado. Este habilitador permitirá seleccionar si se va a trabajar en modo síncrono o asíncrono. Y para finalizar nos encontramos con una compuerta lógica AND. El cual está controlada en su otro bit por "TMR1ON" este último pin me permitirá habilitar el incremento al TIMER1. En caso se haya desbordado el Timer1 (el objetivo es ese) se activará la bandera TMR1IF El circuito es muy sencillo. Los bits de configuración pertenecen al registro T1CON mostrado a continuación:

Entonces para configurar el Timer1 es necesario brindar valores a cada bit del registro.

• T1CKPS1 : T1CKPS1 -> Son bits de selección del preescalador de los pulsos de incrementos del TIMER. Hay que seleccionar uno dando valores binarios. Lo que significa que máximo tendremos 4 escalas.

• T1OSCEN -> Si deseamos conectar un cristal para el trabajo en bajo consumo y la generación de tiempo preciso. Se puede hablitiar este bit. 1=  El oscilador estará activado 0=  El oscilador estará apagado • T1SYNC* -> Permite seleccionar el modo de cuenta Síncrono o Asíncrono. Este bit está negado. Y solamente funciona cuando el bit (TMR1CS =1) de lo contrario el valor de este pin no se tomará en cuenta. 1=  Modo asíncrono (ya negado) 0=  Modo síncrono (ya negado) • TMR1CS -> Selecciona la fuente de reloj para el incremento del TMR1. En pocas palabras este bit me permite escoger entre temporizador o contador. 1=  Timer 1 como contador 0=Timer 1 como temporizador • TMR1ON -> Habilitador del incremento del timer 1. 1=  Activa el incremento del timer1 0=  Detiene el incremento del timer1 Existen más registros involucrados con el TMR1, que en esta sesión por el momento no las tocaremos. Sin embargo el faltante en nuestra lista es el. • TMR1IF-> Es la bandera del timer1 que indica cuando se haya desbordado. Lo que significa que ha pasado del valor TMR1H d'255' TMR1L d'255' = 65535 a 0. Si ha ocurrido es necesario borrar el valor por software. 1=  Se ha desbordado el Timer1 0=  No se ha desbordado el Timer1

TIMER 1 COMO CONTADOR

El timer1 puede incrementar su cuenta por cualquiera de los pines RC0 o RC1. Este contador detectará los flancos de subida. Sin embargo hay que saber que para que la cuenta empiece el pin RC1 requiere detectar un "Flanco de Bajada". Una vez que se haya producido este entonces el TMR1 incrementará en 1 con cada flanco de subida realizado.

Encender un led despues de haber presionado 5 veces sobre un pulsador. Usando Timer1 Antes de desarrollar el ejercicio vamos a tener algunas consideraciones. El pulsador vamos a configurarlo en Pull-Down. Por lo cual el Timer1 nos quitará un pulso. Para ello lo configuraremos entonces con 4 pulsos requeridos. Calcularemos el valor del preescaler en la fórmula y además el valor del TMR1

Ya con los valores solamente nos queda configurar el registro T1CON que se encuentra en el banco 0.

Configuracion timer1. Fuente:Propia configuracionT1CON.jpg (73.62 KiB) Visto 1730 veces Hemos configurado con ese valor en el registro T1CON para que nuestro timer1 trabaje como contador síncrono. Lo que queda es realizar el programa que detecte el bit TMR1IF del registro PIR1. CODIGO

;Vamos a encender un led despues de 5 pulsos. Usando el Timer 1 INCLUDE ;Incluimos los comandos del PIC LIST P=16F877A ;Incluimos el microprocesador INCLUDE ;Incluimos la macro __config 0x3f32 ; Este es un comando de fusibles, lo estudiaremos más adelante. ORG 0; ;Empieza la dirección 0 del programa ; T1CON -> | X | X | T1CKPS1 | T1CKPS2 | T10SCEN | T1SYNC | TMR1CS | TMR1ON | banco 1 ;Nos dirigimos al banco 1. BCF TRISD,4 ;Declaramos el pin 4 del puerto D como salida banco 0 ; Nos dirigimos al banco 0 CLRF PORTD ;Limpiamos todo el puerto D MOVLW b'00000011' ;Cargamos el valor de la configuración MOVWF T1CON ;En el registro T1CON. MOVLW 0XFF ;Cargamos los bits más significativos (MSB) del timer1 MOVWF TMR1H ;En el registro TMR1H MOVLW 0XFC ;Cargamos los bits menos significativos (LSB) del timer1 MOVWF TMR1L ;En el registro TMR1L PROGRAMA ;Título del programa para bucle BTFSS PIR1,TMR1IF ;Detectamos si se ha desbordado el Timer 1 GOTO PROGRAMA ;Caso falso: Seguimos testeando apagar TMR1IF,PIR1 ;Caso verdadero. Limpiamos la bandera de desbordamiento del TMR1 encender 4,puertod ; Encendemos el pin 4 del puerto D (led) GOTO $ ;Realizamos el bucle sobre si mismo END ; Finaliza el programa

TIMER 1 COMO TEMPORIZADOR Mostramos la fórmula para realizar una temporización en el TMR1. Como se da cuenta es tan similar al TMR0

 Para entender su utilización vamos a resolver un ejemplo sencillo.

Generar un pin intermitente con un retardo de 100ms usando el TMR1 1: Configuramos el TMR1 como temporizador. TMR1CS=0 2: Calculamos el valor del TMR1 • En caso el valor este fuera de los límites 0 a 65535 tendremos que usar el preescalador • Seleccionamos el mejor Preescalador posible que lleve el valor del TMR1 dentro del rango de 0 a 65535 3: Apagamos momentaneamente el timer1. TMR1ON = 0 4: Cuando se calcula el valor queda cargar ese resultado a los registros TMR1H y TMR1L. 5: Encendemos el timer1. TMR1ON = 1 desde ese instante el TMR1 empezará su cuenta (temporización) 6: Se Testea el bit TMR1IF del registro PIR1 para averiguar si hubo desbordamiento. 7: No olvidar limpiar el bit para realizar el proceso repetidamente. Realizando el cálculo para obtener los valores de TMR1 y Preescaler

Como ya tenemos de respuesta que usando un preescalador de 8. El timer1 toma un valor 3036 que está dentro del rango de 0 a 65535 por lo tanto es válido.

Lo que queda es convertir ese resultado a hexadecimal. 3036 = 0BDC (hexadecimal) Ahora con todos los valores, vamos a cargar la configuración al registro T1CON perteneciente al TMR1

Con las configuraciones hechas TMR1 como temporizador y preescalador de 8. para poder llegar a 100ms de retardo con un TMR1=3036 nos queda programar.

CODIGO

;Como queremos un retardo de 100ms ; ; TMR1 = 65536 -( 100 /((4/20000)*pre) ;..................................................................... ...... ;Con.. ; ; Pre = 8 ; TMR1= 3036 --> Convertido a hexadecimal "0BDC" INCLUDE LIST P=16F877A INCLUDE ;Incluimos la macro __config 0x3f32 ; Este es un comando de fusibles, lo estudiaremos más adelante. ORG 0; CBLOCK 0x20 ;Como las librerías usan direcciones de memoria es necesario adjuntar ENDC ;Estos dos comandos en nuestro código banco 1 ;Nos vamos al banco 1 BCF TRISB,5 ;Declaramos el pin 5 del puerto B como salida banco 0 ;Nos vamos al banco 0 CLRF PORTB ;Limpiamos todo el puerto B ; T1CON : | X | X | T1CKPS1 | T1CKPS0 | T1OSCEN | T1SYNC* | TMR1CS | TMR1ON | MOVLW b'00110000' ;Cargamos la configuración como temporizador, preescaler 8 MOVWF T1CON ;al registro de configuración del TMR1

PROGRAMA ;Título del programa encender 5,puertob ; Encendemos el pin 5 del puerto B CALL RETARDO100 ; Llamamos a la subrutina de retardo generado por el TMR1 apagar 5,puertob ; Apagamos el pin 5 del puerto B CALL RETARDO100 ; Llamamos a la subrutina de retardo generado por el TMR1 GOTO PROGRAMA ; Vamos al Título (Hacemos el bucle)

RETARDO100 ;Título de la subrutina de retardo apagar 0,T1CON ;Apagamos el pin T1CON para desactivar el Timer1 MOVLW 0X0B ;Cargamos el primer valor

MOVWF TMR1H ;En el registro de los 8 bits más significativos MOVLW 0XDC ;Cargamos el segundo valor MOVWF TMR1L ;En el registro de los 8 bits menos significativos encender 0,T1CON ;Activamos el TIMER1, empieza la cuenta (temporización) COMPROBAR ;Título de subrutina de comprobación BTFSS PIR1,TMR1IF ; ¿el pin TMR1IF es 1? GOTO COMPROBAR ; Respuesta falsa, me voy a seguir testeando. apagar TMR1IF,PIR1 ;Respuesta verdadera, apaga el TMR1 RETURN ;Regreso a donde llamaron. END