Está en la página 1de 28

PALTA_4 PARA PROGRAMAR MICROCONTROLADORES

P.G.F.

Ing. Paul Glvez 2010

Registro de Opciones OPTION_REG: El registro de opciones es un registro que puede ser ledo o escrito y contiene varios bits de control para la configuracin de las asignaciones del prescaler de TMR0 o WDT, la interrupcin externa, el TMR0 y las resistencias de polarizacin del Puerto B.
R/W-1 RBPU bit 7 R/W-1 INTDEG bit 6 R/W-1 T0CS bit 5 R/W-1 T0SE bit 4 R/W-1 PSA bit 3 R/W-1 PS2 bit 2 R/W-1 PS1 bit 1 R/W-1 PS0 bit 0

RBPU: Habilita la conexin de resistencias de Pull-Up (resistencias internas de polarizacin) de Puerta B. Con el valor 1 se Deshabilitan y con 0 se Habilitan. -INTEDG: Selecciona el flanco para la interrupcin externa por RB0/INT. Asignndole el valor 1 se selecciona el flanco ascendente, y asignando el valor 0 se selecciona el flanco descendente. -T0CS: Bit de seleccin de fuente de tiempo para TMR0. Al asignarle el valor 1, los pulsos se introducen a travs del pin RA4/T0CKI. Al asignarle el valor 0, los pulsos seleccionados son los producidos por el reloj interno Fosc/4.

-T0SE: Bit de seleccin de flanco activo para incrementar TMR0 por el pin RA4/T0CKI. Con el valor 1 se incrementa con el flanco descendente y con el valor 0 lo hacen con el flanco ascendente.
-PSA: Con este bis se asigna el prescaler (predivisor). Para asignarlo al WDT se debe poner en 1 y para asignarlo al TMR0 debe estar en 0. -PS2:PS0: Bits de seleccin de la taza de prescaler.

P.G.F.

TABLA PARA ESCALAMIENTO

PS2:PS1:PS0 000 001 010 011 100 101 110 111

Tasa para TMR0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256

Tasa para WDT 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

P.G.F.

Timer 0
El Timer 0 es un modulo temporizador/contador de 8 bits que cuenta con un preescalador programable tambin de 8 bits. Puede funcionar como temporizador o como contador. En modo temporizador el valor del registro TMR0 se incrementa con cada ciclo de instruccin (o cada X ciclos dependiendo del preescalador). En modo contador el valor del registro TMR0 se incrementa en cada flanco (ascendente o descendente) del pin RA4/T0CKI. En ambos casos al desbordarse (pasar de 0xFF a 00) el registro TMR0 la bandera de interrupcin del timer 0 (bit T0IF del registro INTCON) se pone a 1.

P.G.F.

Timer 0 continuacin
El modo temporizador se selecciona poniendo a cero el bit T0CS del registro OPTION. Poniendo a uno ese bit el modulo trabaja en modo contador, en este modo de operacin adems se debe seleccionar si el incremento se producir en cada filo ascendente o descendente, al poner a cero el bit T0SE del registro OPTION se selecciona el filo ascendente.

El preescalador es compartido por el Timer 0 y por el Watchdog. Se asigna a un mdulo o a otro mediante el bit PSA del registro OPTION. Poniendo el bit a 1 el preescalador se asigna al Watchdog y poniendolo a 0 el preescalador se asigna al Timer 0.

P.G.F.

Timer 0 continuacin
El valor del preescalador se selecciona con los bits PS2:PS0 de la siguiente manera:

PS2:P20 000 001 010 011 100 101 110 111

TMR0 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256

WDT 1:1 1:2 1:4 1:8 1:16 1:32 1:64 1:128

P.G.F.

Timer 0 continuacin
Carga y temporizacin

En modo temporizador el Timer 0 incrementa su cuenta en cada ciclo de instruccin. Este modo sirve para generar temporizaciones y bases de tiempo de la misma forma que los retardos por software, sin embargo las temporizaciones con el Timer 0 pueden ser ms exactas y adems se cuenta con la ventaja de que el mdulo puede trabajar mediante interrupciones as que el programa puede ejecutar otras instrucciones mientras se realiza la temporizacin.

P.G.F.

Timer 0 continuacin
La temporizacin que se puede obtener con este mdulo se obtiene de la siguiente relacin:
Temporizacin = [(256 - precarga)*PS+2]*Tinstruccion

Donde:
precarga = Valor que se le asigna al registro TMR0 al comenzar la temporizacin. PS = Preescalador. Si esta asignado al watchdog tomar el valor de 1 Tinstruccin = 4/frecuencia de oscilacin y la temporizacin est dada en segundos.

P.G.F.

Timer 0 continuacin
La temporizacin mxima utilizando el oscilador interno del pic 16f877 es:
Temp.max. = [(256 - 0)*256+2]*1uS = 65528uS

De modo que la temporizacion mxima que se puede tener con el es solamente de 65.538mS.
Si se desea obtener una temporizacion distinta solo se debe escribir en el registro TMR0 el valor de la precarga necesaria. precarga = -[([Temporizacion/(4/fosc)]-2)/PS]+256

Donde, de nuevo, la temporizacin est dada en segundos.

P.G.F.

Timer 0 continuacin
Veamos un ejemplo de aplicacin: Se desea complementar el valor del puerto B cada 50mS. Se estar revisando que se haya cumplido el tiempo de la temporizacin chekeando la bandera T0IF. Utilizando la expresin de la precarga y utilizando el preescalador ms grande (256) obtenemos el valor que necesitamos cargar al registro TMR0 para obtener una temporizacin de 50mS.

precarga = -[([50mS/(4/4Mhz)]-2)/256]+256 = 60.69 60

Ya que no podemos cargar nmeros fraccionarios el valor de precarga necesario es 60.

P.G.F.

Timer 0 continuacin
Teniendo entonces el valor de la precarga el cdigo del programa sera el siguiente:
INICIO bsf clrf movlw movwf bcf clrf bcf movlw .60 btfss goto bcf comf goto STATUS,RP0 TRISB b'00000111' OPTION_REG STATUS,RP0 PORTB INTCON,T0IF movwf TMR0 INTCON,T0IF ESPERA INTCON,T0IF PORTB,f PRECARGA

PRECARGA ESPERA

P.G.F.

Timer 0 continuacin
La configuracin del Timer 0 se realiza mediante las lneas movlw b00000111 y movwf OPTION_REG. Mediante estas lineas se configura el timer en modo temporizador (T0CS = 0), el preescalador se asigna al timer 0 (PSA = 0) y se selecciona el preescalador mximo (PS2:PS0 = 111). Una vez configurado el timer 0 se limpia el puerto B y la bandera T0IF.

Posteriormente serealiza la precarga cargando un 60 al registro TMR0 y en ese momento la temporizacin comienza. Para saber si la temporizacin termin se est revisando la bandera T0IF.
Mientras esta sea 0 la temporizacin an no habr terminado, cuando la bandera es 1 entonces la temporizacin finaliz, se borra la bandera, se complementa el puerto B y se vuelve a realizar la precarga. De este modo el programa est complementado el puerto B cada 50mS.
P.G.F.

Timer 1
El Timer 1 es un mdulo temporizador/contador de 16 bits, que consiste en dos registros de 8 bits (TMR1H y TMR1L) que son de lectura y escritura. Este mdulo incrementa su cuenta desde 0000 hasta 0xFFFF y al desbordarse vuelve a 00000. Al presentarse el desborde la bandera de interrupcin TMR1IF se pone a 1 y, si est habilitada, la interrupcin se presenta. Este mdulo al igual que el Timer 0 puede funcionar en modo temporizador y en modo contador.

En modo temporizador el par de registros TMR1 se incrementa en cada ciclo de instruccin, este modo se selecciona poniendo a 0 el bit TMR1CS del registro T1CON. En modo contador el par de registros TMR1 se incrementa en cada flanco ascendente de una seal de reloj externa, este modo se selecciona poniendo a 1 el bit TMR1CS del registro T1CON.

P.G.F.

Timer 1
El preescalador del Timer 1 tiene un valor mximo de 8 y se selecciona con los bits T1CKPS1:
T1CKPS0 de la siguiente manera: 00 = 1:1 01 = 1:2 10 = 1:4 11 = 1:8

A diferencia del Timer 0, el Timer 1 tiene la posibilidad de activar o detener la cuenta mediante el bit TMR1ON del registro T1CON.

P.G.F.

Timer 1
Carga y Temporizacin

En modo temporizador el Timer 1 incrementa su cuenta en cada ciclo de instruccin. La temporizacin que se puede obtener con este mdulo se obtiene de la siguiente relacin:
TempTMR1 = [(65536 - precarga)*PS]*Tinstr

Donde:

precarga = Valor que se le asigna al par de registros TMR1 al comenzar la temporizacin


PS = Valor del preescalador

Tinstr = 4/frecuencia de oscilacin


TempTMR1 = Temporizacin dada en segundos
P.G.F.

Timer 1
La temporizacin mxima utilizando el oscilador interno del pic 16f877 y el valor ms grande de preescalador es: TempTMR1.Max = [(65536 - 0)*8]*1uS = 524288uS

De modo que la temporizacin mxima que se puede tener con este temporizador, utilizando el oscilador interno de 4Mhz del pic 16f628, es de 524.288mS. Con la misma frecuencia de oscilacin el Timer 0 solamente podia lograr una temporizacin de 65.538mS as que con el Timer 1 se logran temporizaciones de mayor duracin. Si se desea obtener una temporizacin distinta solo se debe escribir en el par de registros TMR1 el valor de la precarga necesaria para la temporizacin deseada.

P.G.F.

Timer 1
precarga = -[([Temporizacion/(4/fosc)])/PS]+65536
Veamos el mismo ejemplo que el del temporizador Timer 0 ahora aplicado al Timer 1: Se desea complementar el valor del puerto B cada 50mS. Se estar revisando que se haya cumplido el tiempo de la temporizacin checando la bandera TMR1IF. Utilizando la expresin de la precarga y utilizando el preescalador ms grande (8) obtenemos el valor que necesitamos cargar al par de registros TMR1 para obtener una temporizacin de 50mS. precarga = -[([50mS/(4/fosc)])/8]+65536 = 59286 = 0xE796

P.G.F.

Timer 1
As que para obtener una temporizacin de 50mS mediante el Timer 1 se debe cargar 0xE7 al registro TMR1h y 096 al registro TMR1L. El cdigo del programa sera el siguiente:
INICIO bsf clrf bcf movlw movwf clrf bcf bcf movlw movwf movlw movwf bsf btfss goto bcf comf goto STATUS,RP0 TRISB STATUS,RP0 b'00110000' T1CON PORTB PIR1,TMR1IF T1CON,TMR1ON 0xE7 TMR1H 0x96 TMR1L T1CON,TMR1ON PIR1,TMR1IF ESPERA PIR1,TMR1IF PORTB,f PRECARGA

PRECARGA

ESPERA

P.G.F.

Timer 1
La configuracin del Timer 1 se realiza mediante las lneas movlw b01100000 y movwf T1CON. Mediante estas lineas se configura el timer en modo temporizador (TMR1CS = 0) y se selecciona el preescalador mximo (T1CKPS1:T1CKPS0 = 11). Una vez configurado el timer 1 se limpia el puerto B y la bandera TMR1IF del registro PIR1. Posteriormente se realiza la precarga cargando un 0xE7 al registro TMR1H y un 096 al registro TMR1L. Ntese que antes de realizar la carga se detuvo el timer poniendo a 0 el bit TMR1ON, esto se hace para evitar errores al momento de cargar el valor a los registros TMR1, despus de realizar la carga se enciende el timer poniendo a 1 el bit TMR1ON y en ese momento la temporizacin comienza.

P.G.F.

Timer 1
Para saber si la temporizacin termin se est revisando continuamente la bandera TMR1IF.
Mientras esta sea 0 la temporizacin an no habr terminado, cuando la bandera es 1 entonces la temporizacin finaliz, entonces se borra la bandera TMR1IF, se complementa el puerto B y se vuelve a realizar la precarga. De este modo el programa est complementado el puerto B cada 50mS.

P.G.F.

Timer 2
El Timer 2 es un temporizador de 8 bits que tiene la particularidad de tener un preescalador y un post-escalador.

Adems este mdulo cuenta con un registro de periodo PR2 que marca el valor mximo que puede alcanzar la cuenta del registro TMR2.

A diferencia de los otros temporizadores, el temporizador Timer 2 no incrementa su cuenta hasta llegar a 0xFF y despus al desborde sino que incrementa su cuenta desde 000 con cada ciclo de instruccin hasta que el valor del registro TMR2 coincide con el del registro PR2 y despus, en el siguiente ciclo reinicia la cuenta desde 000.

P.G.F.

Timer 2
Este mdulo cuenta con un preescalador y un post-escalador. El preescalador tiene la misma funcin que en los otros dos timers y sirve como divisor de frecuencia antes de cada incremento.

El post-escalador funciona como un divisor de frecuencia despus de cada coincidencia entre los registros TMR2 y PR2.
Si el post-escalador es 1:1 la bandera de interrupcin TMR2IF se habilitar en cada coincidencia entre TMR2 y PR2, en cambio si por ejemplo el postescalador es 1:16, la interrupcin se presentar cada 16 coincidencias.

Este temporizador, al igual que el Timer 1, puede habilitarse y deshabilitarse mediante el bit TMR2ON.

P.G.F.

Timer 2
El preescalador se selecciona con los bits T2CKPS1:T2CKPS0 y el post-escalador con los bits T0UTPS3:TOUTPS0 de la siguiente manera: Preescalador
00 = 1:1 01 = 1:4 1x = 1:16

Post-escalador
0000 = 1:1 0001 = 1:2 0010 = 1:3 . . . 1111 = 1:16

P.G.F.

Timer 2
Carga y Temporizacin La temporizacin del Timer 2 est dada por la siguiente expresin:

TempTMR2 = [Preescaler*(PR2+1)*Postscaler]*Tinstr

Donde Preescaler = Valor del preescalador PR2 = Valor cargado al registro PR2 Postscaler = Valor del post-escalador

Tinstr = 4/frecuencia de oscilacin


TempTMR2 = Temporizacin dada en segundos
P.G.F.

Timer 2
La temporizacin mxima que puede alcanzar el Timer 2 es la misma que alcanza el Timer 0.
Utilizando el oscilador interno del pic 16f877 la temporizacin mxima sera de 65536uS. Si se desea otra temporizacin se puede lograr cargando el valor necesario al registro PR2.

PR2 = [([TempTMR2/(4/fosc)])/(Preescaler*Postscaler)]-1

P.G.F.

Timer 2
Veamos el mismo ejemplo de los temporizadores anteriores, ahora aplicado al Timer 2: Se desea complementar el valor del puerto B cada 50ms. Se estar revisando que se haya cumplido el tiempo de la temporizacin chekeando la bandera TMR2IF. Utilizando la expresin de la precarga y utilizando el preescalador y el post-escalador ms grande (16) obtenemos el valor quer que necesitamos cargar al registro PR2 para obtener una temporizacion de 50mS.

PR2 = [([50mS/(4/4Mhz)])/(16*16)]-1 = 194.31

P.G.F.

Timer 2
Ya que no podemos cargar numeros fraccionarios el valor del registro PR2 necesario es 194. El cdigo del programa sera el siguiente:
INICIO bsf clrf bcf movlw movwf clrf bcf bcf bsf movlw movwf bcf bsf btfss goto bcf comf goto STATUS,RP0 TRISB STATUS,RP0 b'01111010' T2CON PORTB PIR1,TMR2IF T2CON,TMR2ON STATUS,RP0 .194 PR2 STATUS,RP0 T2CON,TMR2ON PIR1,TMR2IF ESPERA PIR1,TMR2IF PORTB,f PRECARGA

PRECARGA

ESPERA

P.G.F.

TAREA: DISEAR 3 PROGRAMAS PARA TEMPORIZAR 1 SEGUNDO


UTLIZANDO: EL TMER 0, TMER 1 Y TIMER 2 EN CADA PROGRAMA RESPECTIVAMENTE.

EN ESTOS PROGRAMAS NO DEBE UTILIZAR RETARDOS; ES DECIR DECREMENTOS, SOLO TIMERS


EVALUABLE COMO GUIA.

ATTE. Ing. Paul Glvez

P.G.F.

También podría gustarte