martes, abril 02, 2013

PROGRAMACION DE PIC EN ASSEMBLER - Nº 2

MANEJO DE TIMERS

El PIC16F877A ademas de manejar puertos de entrada y salida, también posee muchos periféricos de ayuda que hace que este dispositivo sea muy potente para muchas aplicaciones embebidas. Entiéndase por periféricos a chips que se encuentran dentro del microcontrolador y que funcionan en forma paralela a la ejecución de las instrucciones del microcontrolador.

Los TIMERs son periféricos de gran uso en las aplicaciones con microcontroladores. Sus características y funcionamiento varían de acuerdo a su estructura interna, en nuestro caso los timers del PIC posee 3 modos de funcionamiento:

- Modo Temporizador
- Modo Contador Asíncrono (Modo contador)
- Modo Contado Sincrono (Modo oscilador)

El PIC16F877A posee tres timers, los cuales tienen estructuras internas diferentes, por consiguiente funcionan de forma diferente, no todos poseen los modos descritos arriba:


EL TIMER 0

El modulo Timer0 puede ser usado para generar periodos de tiempo (si funciona como temporizador) o puede ser usado para registrar eventos (contador). Al igual que en el modulo anterior existen registro que controlan el funcionamiento del modulo TIMER0.


La operación implica la siguiente secuencia:
- Ingresar al banco 1
- Configurar el modulo TIMER= (como contador o temporizador)
- Regresar al banco 0
- Cargar el valor del TMR0 (inicilizarse la cuenta)
Las principales carateristicas del modulo Timer 0 son:
- Puede ejecutar hasta 256 cuentas (0 -255) ya que el registro TMR0 es de 8 bits
- El registro TMR0 puede ser leído para saber cual es el valor actual de las cuentas o puede ser escrito para colocar un valor inicial.
- Posee un bloque de pre-escaler que permite ampliar el rango de las cuentas
- Selector interno para definir si trabaja como temporizador o como contador.
- Genera una señal de interrupción cuando se produce un desborde en el registro TMR0 (cuando pasa de 0xFF a 00). Bit T0IF del registro INTCON.
- Selector para indicar si detecta flanco de subida o bajada cuando opera como contador. Bit T0SE del registro OPTION_REG.

Ahora tenemos el diagrama de bloques del Timer 0:

Como se aprecia en la parte superior derecha esta presente un MUX (Multiplexor). El MUX es controlado por el bit T0CS, si es 0 el modulo opera como temporizador; si es 1 actúa como contador. El bit T0CS pertenece al registro OPTION_REG y es el bit 5. Cuando el modulo actúa como temporizador el registro TMR0 se incrementa en cada ciclo de instrucción (siempre y cuando el pre-escaler este deshabilitado). Cuando el registro TMR0 es escrito el microcontrolador debe esperar 2 ciclos de instrucción para comenzar la cuenta.
Cuando trabajamos como contador el registro TMR0 incrementa su valor cada vez que aparece un flanco en el pin RA4/T0CKI. La selección del tipo de flanco (subida o bajada) dependerá de la programación del bit T0SE (registro OPTION_REG bit4). Si T0SE es 0 trabaja como flanco de subida. pero si trabaja con 1 es flanco de bajada.

El pre-escaler es un modulo compartido por el WATCHDOG (WTD) y el TIMER 0. El pre-escaler es como un divisor de frecuencia programable. Como se aprecia puede conectarse en serie al modulo timer 0 (dependiendo de los valores de T0CS y PSA). Supongamos que el modulo timer 0 funciona como contador y el pre-escaler esta habilitado. El valor de 1:1, eso significa que cada pulso que ingrese incrementara el valor en el registro TMR0 (el valor máximo de cuentas sera 256). Si el pre-escaler esta en 1:8, entonces por cada 8 eventos que sucedan solo aumentara una cuenta en el registro TMR0 (el valor máximo de cuentas sera 8x256). El valor del pre-escaler depende de los bits PS2 (bit2), PS1 (bit1) y PS0 (bit0) del registro OPTION_REG. El bit PSA (bit3) del registro INTCON define si el pre-escaler funciona con el WTD o con el TIMER0.

En el siguiente grafico veremos los detalles del registro OPTION_REG:


bit 7:  RBPU (Pull up)
bit 6:  INTEDG (para habilitar los flancos)
bit 5:  T0CS, Bits selector de fuente para el TMR0
          1 = Clock externo, pin RA4/T0CKI
          0 = Clock interno(CLOCKOUT)
bit 4:  T0SE, Bit selector de flanco
          1 = Incrementa en flanco de bajada en pin T0CKI
          0 = Incrementa en flanco de subida en pin T0CKI
bit3:   PSA Bits de asignacion del pre-escaler
          1 = Pre-escaler es asignado al WATCHDOG
          0 = Pre-escaler es asignado al modulo TIMER0
bit 2-0 PS2-PS0, Bits selectores de trabajo


La gran mayoría de micro poseen al timer 0, por ejemplo el PIC 16F84A, un pic básico  posee entre sus escasos periféricos al timer 0.
El timer 0 posee un registro de 8 bits, este al tener desbordamiento (overflow) puede activar un salto de interrupción habilitando el bit T0IE del registro INTCON.

EL TIMER 1

EL timer 1 es un periférico mas profesional que el timer0, pues posee un registro contador de 16 bits, representado en 2 bytes: TMR1H y TMR1L. Sus mejoras se reflejan en su arquitectura interna que vemos a continuación:
Como ya se menciona antes el Timer1 tiene tres formas de funcionamiento:
a) Temporizador
b) Contador Asíncrono (Modo Contador)
c) Contador Sincrono (Modo Oscilador)

Los bits de control del timer1 se encuentran alojado en el registro T1CON:


Bit 7-6  Bits no implementados. Leido como 0
Bit 5-4 T1CKPS1:T1CKPS0: El pre-escaler es un divisor de la frecuencia de los impulsos que se aplican al      TIMER 1
            11 = 1:8 Valor de Pre-escaler
            10 = 1:4 Valor de Pre-escaler
            01 = 1:2 Valor de Pre-escaler
            00 = 1:1 Valor de Pre-escaler
Bit 3    T1OSCEN: Control de habilitación para el oscilador del TIMER1
            1 = El oscilador el habilitado (RC0 y RC1 = entradas del oscilador externo)
            0 = El oscilador trabaja en otro modo (RC0 = entrada del oscilador externo)
Bit 2    T1SYNC: Determina la posible sincronizacion o no de los impulsos del reloj externo con los del reloj interno
           TMR1CS = 1
           1 = No sincronizacion con un reloj externo
           0 = Sincronizacion con un reloj externo
           TMR1CS = 0
           Este bit es ignorado cuando el TIMER1 usa reloj interno
Bit 1   TMR1CS: Selecciona la fuente de los impulsos del contaje
           1 = Reloj externo desde el pin RC0/T10S0/T1CKI (en el flanco)
           0 = Reloj interno (FOsc/4)
Bit 0   TMR1ON: Gobierna el permiso o la prohibición de funcionamiento del TImer1
           1 = Habilitar el Timer 1
           0 = Detener el Timer 1
No todos los microcontroladores de Microchip poseen el Timer1, por el ejemplo el PIC16F84A no tiene el time1, mientras el PIC16F628A si lo tiene.
El timer 1 posee un registro contador de 16 bits. este al tener desbordamiento (overflow) puede activar un salto de interrupcion habilitando el bit TMR1IE del registro PIE1, mientras su flag TMR1IF se encuentra en el registro PIR1

EL TIMER 2

EL TIMER2 es un timer con un registro contador de 8 bits. Este timer, a diferencia del TIMER0 y TIMER1 no posee un pin para ingresar pulsos externo, esto quiere decir que solo cuenta con pulsos interno del oscilador. Sus características se aprecian en el siguiente gráfico:


Los bits de control del TIMER2 se encuentran alojado en el resgistro T2CON


Bit 7  Bit no implementado. Leído como 0.
Bit 6-3 T0UTPS3:t0UTPS0: EL post-escaler es un divisor de frecuencia de los impulsos que salen del comparador (TMR2 vs PR2_REG)
           0000 = 1:1 Valor de Pos-escaler
           0001 = 1:2 Valor de Post-escaler
           0010 = 1:3 Valor de Post-escaler
           ...
           1111 = 1:16 Valor de Post- escaler
Bit 2  TMR2ON: Gobierna el permiso o la prohibición de funcionamiento del TIMER2
Bit 1-0 T2CKPS1-T2CKPS0: El pre-escaler es un divisor de la frecuencia de los impulsos que se aplican al TIMER1
            00 = Pre-escaler es 1
            01 = Pre-escaler es 4 
            11 = Pre-escaler es 16

El TIMER2 posee un registro contador de 8 bits, este es comparado con el valor alojado en el registro PR2(92H), cada vez que estos registros sean iguales se le dara un pulso al post-escaler, ademas reseteara al contador del TIMER2. Cuando el post-escaler termina de contabilizar el valor configurado puede generar un salto de interuupcion habilitando el bit TMR2IE del registro PIE1(8CH), mientras su flag TMR2IF se encuetra en el registro PIR1(0CH).

©Copyrigth Bach. Ing. Mishell Sanchez Guevara         cell: 985 653 382 

No hay comentarios: