COMPETENCIA
El alumno comprender los principales elementos que conforman la estructura interna del reloj o temporizador TMR0, TMR1 y TMR2 del PIC16F877. Analizar su principio de funcionamiento y la funcin del preescalador.
JUSTIFICACIN
Las operaciones de pausas, sincronizacin de tiempo de ejecucin y lapsos de tiempo son uno de los criterios necesarios al momento de realizar implantaciones sobre los sistemas basados en microcontroladores.
TMR0
Qu tiene de especial?
Es un contador de 8 bits. Se puede leer para saber cual es valor actual de las cuentas o puede ser escrito Reloj Externo Reloj Interno para colocar un valor inicial. terminal RA4/TOCK1 Posee un bloque de preescalamiento que permite ampliar el rango de las cuentas. Contador de interrupcin eventos Genera una seal de cuando se produce un desborde en el registro TMR0 (cuando pasa de 0xFF a 00). Bit T0IF del registro INTCON
Temporizador
1 = Incrementa en flanco de bajada en pin T0CKI 0 = Incrementa en flanco de subida en pin T0CKI
1 = Prescaler apagado 0 = Prescaler es asignado al modulo TMR0 PS2:PS0: Bits selectores relacion de trabajo PSA: Bits de asignacin del preescaler
Ejercicio: Disear un programa en el PIC16F877 para contar eventos con flancos de bajada en RA4/T0CKI y mostrar la cuenta en el puerto B. Solucin: configurar el registro OPTION_REG en funcin al ejercicio propuesto
1 1
Por tanto: OPTION_REG = 1111 1000
;PA entrada ;PB salida OPTION_REG = 1111 1000 ;Valor a escribir en el registro de configuracin ;del TMR0 ;Configuracion del TMRO ;Ir banco 0
BUCLE
movf movwf goto END TMR0,W PORTB BUCLE ;W=TMR0 ;Escribe el valor de TMR0 en PORTB ;Salta a la etiqueta bucle
Ejercicios propuestos: Disear un programa en el PIC16F877 para contar eventos con flancos de subida en RA4/T0CKI con un preescalamiento de 1:2. Mostrar la cuenta en el puerto B. Disear un programa en base al PIC16F877 que rote un bit a la izquierda del puerto B cada vez que ocurra cuatro eventos (flancos de bajada en RA4/T0CKI). Disear un programa en base al PIC16F877 para contar eventos (flancos de bajada en RA4/T0CKI) y mostrar la cuenta en un display de 7 segmentos conectado al puerto B. Cuando las cuentas llegan a 9 pasan de nuevo a 0. Disear un programa en base al PIC16F877 para contar eventos (flancos de bajada en RA4/T0CKI) y mostrar la cuenta en tres displays de 7 segmentos.
Ejercicio: Programar el TMR0 para generar un retardo de un segundo. A partir del cual un LED conectado al PORTC debe apagarse y prenderse indefinidamente. Debe permanecer un segundo en cada estado.
Solucin: configurar el registro OPTION_REG en funcin al ejercicio propuesto y establecer el retardo.
Para generar retardos es necesario usar el modulo TMR0 como temporizador por lo tanto es necesario colocar el bit T0CS a 0 Un ciclo de instruccin = 4*Tosc ( donde Tosc es el inverso de la frecuencia del clock que usa el PIC)
Retardo_T0_Pre= 4*Tosc*TMR0*Preescaler.
Retardo_T0_Pre= 4.0.25us*256*256 =65536 us =65.536 ms No alcanza a un segundo. Pero podramos lograr retardos mayores usando bucles: Retardo=Bucle*Retardo_T0_Pre Retardo=Bucle*65,536ms Como el Retardo debe ser 1seg 1000ms =Bucle*65,536 Bucle=15.25
Por tanto no existe una sino mltiples soluciones considerando este ltimo punto y la frmula :
Retardo= 4*Tosc*TMR0*Preescaler*Bucle
1
Por tanto:
list p=16f877 include "p16f877.inc" CONTA EQU 0x20 org nop _inicio bsf bcf clrf movlw movwf STATUS,RP0 STATUS,RP1 TRISB b'11000110 OPTION_REG 0x00
;Comando que indica el Pic usado ;Etiquetas genricas para el Pic16F877 ;Variable CONTA en direccin 0x20 hexadecimal de ;memoria RAM ;Inicio del programa en la posicin cero de ;memoria ;Libre (uso del debugger) ;Ir banco 1
bcf bcf
clrf _bucle bsf call bcf call goto
STATUS,RP0 STATUS,RP1
PORTB
;Ir banco 0
;PORTB = 0
PORTB,0 _retardo ;Llama la rutina de retardo PORTB,0 _retardo _bucle ;Ir _bucle
Sub-rutina de retardo
Cuando se produce un desborde en el registro TMR0 (cuando pasa de 0xFF a 00) el Bit T0IF del registro INTCON se pone en 1
Ejercicios: Programar el TMR0 para generar un retardo de un segundo. A partir del cual se incrementa un contador cuyo valor se muestra por el PORTC. Programar el TMR0 para generar un retardo de 500 ms. Cada vez que concluya el tiempo se activar el PORTC de forma escalonada.
Programar el TMR0 para generar un la palabra HOLA, letra por letra, con un retardo de 0,25 segundos en un display de 7 segmentos conectado al PORTC
setup_timer_0 (mode)
Parameters: mode may be one or two of the constants defined in the devices .h file. RTCC_INTERNAL, RTCC_EXT_L_TO_H or RTCC_EXT_H_TO_L RTCC_DIV_2, RTCC_DIV_4, RTCC_DIV_8, RTCC_DIV_16, RTCC_DIV_32, RTCC_DIV_64, RTCC_DIV_128, RTCC_DIV_256
Ejemplo: Utilizando la interrupcin del TMR0, generar una seal cuadrada de 1KHz Solucin: 1 KHz tiene un periodo T= 1 ms, por tanto el tiempo alto de la seal cuadrada ser de 0,5 ms o 500us. Si se usa un cristal de 4 MHz y un prescaler de 2 se tiene la siguiente ecuacin de desbordamiento: Retardo_T0_Pre= 4*Tosc*(256-TMR0)*Preescaler 500us=1us *(256-TMR0)*2 TMR0=6
TMR1
TMR1
El TMR1 Tiene 16 bits distribuidos en dos registros, el TMR1L y el TMR1H. Cuenta desde 0000h hasta FFFFh, si desborda se activa el bit TMR1IF en el registro PIR1.
El TMR1 se configura en el
banco 0
usando el registro
T1CON.
T1CON
El bit de desborde del TMR1 es el TMR1IF ubicado en el registro P1RI. Para configurar el TMR1 primero se debe deshabilitar el TMR0 colocando OPTION_REG= 10000000 en el banco 1.
0 0
Retardo= 4*Tosc*TMR1*Preescaler
Ejemplo: si sabemos que el cristal es de 4 MHz, el preescalamiento es de 1 a 8 y usamos el TMR1 completo. Entonces el retardo es: Retardo = 4 * 0.25us *65536*8= 0.524288 s
Ejemplo: realizar una subrutina con retardo de 0.524288 segundos utilizando el TMR1. Solucin: Primero deshabilitamos el TMR0 en el banco 1. movlwb'10000000' movwfOPTION_REG Segundo configuramos el TMR1 en el registro T1CON en el banco 0. movlwb'00110000' movwfT1CON
Tercero y ltimo paso realizamos la rutina de retardo. retardo bcf P1RI,TMR1IF clrf TMR1L clrf TMR1H bsf T1CON,TMR1ON esperar btfssP1RI,TMR1IF goto esperar bcf T1CON,TMR1ON
return
setup_timer_1 (mode)
Parameters: mode values may be: T1_DISABLED, T1_INTERNAL, T1_EXTERNAL, T1_EXTERNAL_SYNC T1_CLK_OUT T1_DIV_BY_1, T1_DIV_BY_2, T1_DIV_BY_4, T1_DIV_BY_8 constants from different groups may be or'ed together with |. setup_timer_1 ( T1_DISABLED ); setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 ); setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );
Ejemplo: Utilizando la interrupcin del TMR1, para generar un retardo de 1 segundo Solucin: Se busca el periodo parcial de 0,5 s y se repite dos veces. Si se usa un cristal de 4 MHz y un prescaler de 8 se tiene la siguiente ecuacin de desbordamiento: Retardo= 4*Tosc*(65536-TMR1)*Preescaler 0,5s=1us *(65536-TMR1)*8 TMR1=3036
TMR2
TMR2 es un temporizador de 8 bits con un prescaler (divisor de frecuencia previo), un registro de periodo (PR2) que marca el valor mximo que puede alcanzar la cuenta de TMR2 y un postscaler (contador de coincidencias entre TMR2 y PR2) El registro TMR2 se puede leer y escribir desde el ncleo del microcontrolador. TMR2 puede trabajar como temporizador pero no como contador de flancos externos El contador TMR2 puede contar desde 0x00 hasta el valor cargado en PR2, en el ciclo siguiente al de esa coincidencia, el contador vuelve a cero El TMR2 tambin se puede utilizar para generar una seal de reloj para transferencias serie sncronas mediante el puerto serie sncrono (SSP)
El TMR2 se emplea adems como base de tiempos para los mdulos CCP cuando se configuran en modo PWM (vanse mdulos CCP).
bit 7 No implementado: Se lee como 0 bit 6:3 TOUTPS3:TOUTPS0: bits de seleccin del postscaler del Timer2 0000= 1:1 Postscale 0001= 1:2 Postscale 1111= 1:16 Postscale bit2TMR2ON: Bitde paro/arranque del TMR2 1 = Timer2 on 0 = Timer2 off bit 1:0 T2CKPS1:T2CKPS0: Bits de seleccin de prescaler del Timer2 00= Prescaler is 1 01= Prescaler is 4 1x= Prescaler is 16
Operacin con Temporizador TMR2 En el caso de TMR0 y TMR1 era necesario precargar un valor de partida en la cuenta y el flag correspondiente se activaba al desbordar el contador, esto obligaba a volver a precargar de nuevo el contador para iniciar una nueva temporizacin. En el caso de TMR2, la cuenta va desde 0x00 hasta el valor de PR2 y en el ciclo siguiente el contador vuelve a cero por hardware, con lo cual no es necesario precargar por software ningn valor peridicamente y las temporizaciones tendrn una duracin fija mientras no se modifique el registro de periodo (PR2). No obstante, tambin sera posible precargar un valor en TMR2 aunque no ser lo habitual ms que en el principio de todo el proceso. El flag TMR2IF se pondr a 1 cuando produzca un nmero de coincidencias entre TMR2 y PR2 igual al valor establecido para el postscaler. Si usamos el prescaler y el postscaler con su valor mximo, el tiempo de rebosamiento mximo del postscaler (overflow) sera: (4/fosc)*(Prescaler mximo)*256* (Postscaler mximo) = (4/fosc) * 16*256*16 = (4/fosc) * 65536 que supondra un valor de temporizacin mximo igual que el que se puede conseguir con el temporizador TMR0 pero inferior al mximo alcanzable con TMR1
EJEMPLO DE CONFIGURACIN DEL TIMER 2 Realizar un retarde de 20ms usando el TMR2 -Calculamos los valores a cargar -Pre=16, PR2=124 y Pos=10 -Retardo=16*(124+1)*10*1us=20ms PASOS -En el banco 1 se carga el valor de PR2 movlw .124 movwf PR2 -En el banco 0 se carga los valores de configuracin el T2CON
-Realizamos la subrutina de retardo: Retardo clrf bcf bsf Espera btfss goto bcf return
setup_timer_2 (mode,period,postscale)
Parameters: mode values may be: T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16 period is a int 0-255 that determines when the clock value is reset, postscale is a number 1-16 that determines how many timer overflows before an interrupt: (1 means once, 2 means twice, and so on). setup_timer_2 ( T2_DIV_BY_4, 0xc0, 2);
Ejemplo: Utilizando la interrupcin del TMR2, generar una seal cuadrada de 1KHz. Solucin: 1 KHz tiene un periodo T= 1 ms, por tanto el tiempo alto de la seal cuadrada ser de 0,5 ms o 500us. Si se usa un cristal de 4 MHz, un prescaler de 4 y postscaler de 1 se tiene la siguiente ecuacin de desbordamiento: Retardo= 4Tosc*Preescaler *(PR2+1)*postscaler 500us=1us *4*(PR2+1)*1 PR2=124