Vous êtes sur la page 1sur 9

PONTIFICIA UNIVERSIDAD CATLICA DEL PER

FACULTAD DE CIENCIAS E INGENIERA


SECCIN DE ELECTRICIDAD Y ELECTRNICA
Curso de Microcontroladores ATmega8 1












SESIN 04
TEMPORIZADORES





PARTE TERICA

TEMPORIZADORES.
TEMPORIZADOR CONTADOR 0 (TIMER0)
TEMPORIZADOR CONTADOR 1 (TIMER1)



PARTE PRCTICA

PROBLEMA DESARROLLADO 1 (Timer0)
PROBLEMA DESARROLLADO 2 (Timer1 modo CTC)
PONTIFICIA UNIVERSIDAD CATLICA DEL PER
FACULTAD DE CIENCIAS E INGENIERA
SECCIN DE ELECTRICIDAD Y ELECTRNICA
Curso de Microcontroladores ATmega8 2

TEMPORIZADORES


Los temporizadores son mdulos que lo utilizamos para trabajar con periodos de tiempo, ya sea para
generar eventos a perodos de tiempo deseados (generar seales PWM, muestrear una seal a perodos
de tiempo fijo, etc.) o para calcular perodos de tiempo de eventos externos al microcontrolador
(calcular la frecuencia de una onda cuadrada).

El microcontrolador ATmega8 cuenta con tres temporizadores, dos de ellos de 8 bits y uno de 16 bits.
En el presente trabajo se explicar brevemente dos de ellos.



TEMPORIZADOR CONTADOR 0 (TIMER0)


En el manual del microcontrolador pueden observar el siguiente diagrama:



Expliquemos brevemente el funcionamiento de este mdulo:

Para el TIMER0, en el grfico se reemplazan las n por 0, as tenemos TCCR0, TCNT0, T0 y clk
T0
.
El registro TCNT0 es un contador de carrera libre de 8 bits (es decir una vez que llega a $FF vuelve a
$00), cada vez que se produce un desborde el bit TOV0 toma el valor lgico de 1.



TCNT0 se incrementa segn la seal clk
T0
, que puede ser el reloj del sistema, una seal
que venga de un pre escalador o una seal externa la microcontrolador en el pin T0.

Para configurar la fuente de clk
T0
, es decir la frecuencia a la que se va a incrementar
nuestro contador se tiene el registro TCCR0:


PONTIFICIA UNIVERSIDAD CATLICA DEL PER
FACULTAD DE CIENCIAS E INGENIERA
SECCIN DE ELECTRICIDAD Y ELECTRNICA
Curso de Microcontroladores ATmega8 3



CS02 CS01 CS00 Descripcin
0 0 0 No hay fuente de reloj (TCNT0 detenido)
0 0 1 clk
I/O
(Sin pre escalamiento)
0 1 0 clk
I/O
/ 8 (Del pre escalador)
0 1 1 clk
I/O
/ 64 (Del pre escalador)
1 0 0 clk
I/O
/ 256 (Del pre escalador)
1 0 1 clk
I/O
/ 1024 (Del pre escalador)
1 1 0 Reloj externo en el pin T0 (Flanco de bajada)
1 1 1 Reloj externo en el pin T0 (Flanco de subida)


Recordar que en los mdulos del laboratorio, la frecuencia de clk
I/O
por defecto es 1MHz.


La manera de temporizar con este mdulo es fijar el perodo con el que se va a incrementar el
contador y de esta manera se puede saber cada cuanto tiempo se va a producir un desborde
y fijarnos constantemente en TOV0, cuando tome el valor de 1, es que se ha producido el
desborde.

Para obtener una mayor resolucin en la temporizacin podemos escribir, inmediatamente
despus de producido el desborde, un valor ($XX) en el registro TCNT0 de tal manera que la
cuenta no vaya necesariamente de $00 a $FF, sino del valor escrito ($XX) a $FF.



TEMPORIZADOR CONTADOR 1 (TIMER1)


El TIMER1 es un temporizador de 16 bits. Al igual que el TIMER0 tiene un registro contador
de carrera libre, pero este registro es de 16 bits (TCNT1).

La frecuencia de incremento de cuenta del TCNT1 es configurable por los bits de control
CS12, CS11 y CS10 ubicados en el registro TCCR1B.



Para temporizar podemos utilizar el mismo mtodo usado que en el TIMER0, es decir
muestrear el bit TOV1, que toma el valor lgico de 1 cada vez que hay un desborde, es decir
cuando TCNT1 pasa de $FFFF a $0000.




Pero este temporizador cuenta adems con dos unidades de comparacin, cada una de estas
unidades cuenta con un registro de 16 bits (OCR1A y OCR1B). Cuando el contador alcanza a
estos registros se dice que se ha producido una comparacin exitosa, al producirse una
comparacin exitosa un bit toma el valor lgico de uno.

El bit OCF1A se pone a 1 si TCNT1 iguala al registro OCR1A.
PONTIFICIA UNIVERSIDAD CATLICA DEL PER
FACULTAD DE CIENCIAS E INGENIERA
SECCIN DE ELECTRICIDAD Y ELECTRNICA
Curso de Microcontroladores ATmega8 4
El bit OCF1B se pone a 1 si TCNT1 iguala al registro OCR1B.

De esta manera podemos temporizar a una frecuencia deseada. Conociendo la frecuencia de
incremento de TCNT1 (frecuencia configurable) podemos calcular el valor que debemos dar a
OCR1X para que la comparacin exitosa se produzca a la frecuencia deseada.


Modo de trabajo CTC

Cuando usamos las unidades de comparacin del TIMER1 podemos trabajar en lo que se
conoce como modo CTC (Clear Timer on Compare Match), en este modo de trabajo cada vez
que se produce la comparacin exitosa el contador TCNT1 vuelve a $0000; es decir el
contador TCNT1 contar desde $0000 a $XXXX, donde $XXXX es el valor que hemos fijado en
uno de los registros de comparacin (OCF1X). Jugando con el valor de $XXXX y la frecuencia
con la que se incrementa TCNT1 podemos temporizar a una frecuencia deseada.





PONTIFICIA UNIVERSIDAD CATLICA DEL PER
FACULTAD DE CIENCIAS E INGENIERA
SECCIN DE ELECTRICIDAD Y ELECTRNICA
Curso de Microcontroladores ATmega8 5

PARTE PRCTICA
Temporizadores
I. OBJETIVO
Aprender a programar el temporizador que presenta el microcontrolador Atmega8

II. MATERIALES
1 mdulo de entrenamiento AvrPUCP -Mega8.
1 Mdulo de entrada/salida.
1 Cable de programacin
1 computadora personal.
Entorno de desarrollo VMLAB
Cables de conexin

III. PROCEDIMIENTO

Problema 1 (Timer0)

Se va a desarrollar un programa que genere una seal cuadrada con periodo de 20ms. La salida
ser por el pin PB0.
20ms
10ms


Para hacer esto vamos a temporizar cada 10ms para cambiar el valoro lgico de PB0 de 0 a 1
y viceversa.

INICIO
Configuramos puerto de
salida
Configurar temporizador
(preescalamiento 1:64)
Tmr0_sondeo
Desborde ?
NO
TCNT0 100
Cambiamos valor lgico de
PB0
SI


PONTIFICIA UNIVERSIDAD CATLICA DEL PER
FACULTAD DE CIENCIAS E INGENIERA
SECCIN DE ELECTRICIDAD Y ELECTRNICA
Curso de Microcontroladores ATmega8 6


;**********************************************************************
;**********************************************************************
;***** PONTIFICIA UNIVERSIDAD CATOLICA DEL PERU *****
;***** Laboratorio de Sistemas Digitales *****
;***** *****
;***** Nombre: Tmr0Sond.asm *****
;***** Autor: Rolando Snchez *****
;***** Fecha: Diciembre 2006 *****
;***** *****
;***** Descripcin: Se enva al PB0 una seal cuadrada con un *****
;***** periodo de 20ms. Utilizamos el TIMER0 *****
;***** *****
;**********************************************************************
;**********************************************************************

.include "C:\VMLAB\include\m8def.inc"

.DSEG
.ORG $60

.CSEG
.ORG $000
rjmp INICIO

;**********************************************************************
;***** PROGRAMA PRINCIPAL *****
;**********************************************************************

INICIO: LDI R16, HIGH(RAMEND) ; Inicializamos la pila
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16

LDI R16, $FF ; Configuramos PORTB como salida
OUT DDRB, R16
LDI R16, $00
OUT PORTB, R16

LDI R16, $03
OUT TCCR0, R16 ; Preescalamiento del TIMER0 1:64


SONDEA_TOV0: IN R16, TIFR ; Sondeamos TOV0 (bit0 de TIFR)
ANDI R16, $01 ; esperamos que sea 1
CPI R16, $01
BRNE SONDEA_TOV0

LDI R16, $64 ; TCNT0 <- 100
OUT TCNT0, R16 ; (256 - 100)(64)(1us) = 9.9ms

IN R16, TIFR ; Se pone 0 el bit TOV0
ORI R16, $01
OUT TIFR, R16

IN R16, PORTB ; Se cambia el valor lgico del
LDI R17, $01 ; bit menos significativo del
EOR R16, R17 ; del puerto B
OUT PORTB, R16


RJMP SONDEA_TOV0 ; Regresamos al lazo



PONTIFICIA UNIVERSIDAD CATLICA DEL PER
FACULTAD DE CIENCIAS E INGENIERA
SECCIN DE ELECTRICIDAD Y ELECTRNICA
Curso de Microcontroladores ATmega8 7

PROBLEMA 2 (Timer1_modo CTC)


El siguiente ejemplo muestra una cuenta en 8 leds que se incrementa cada 250ms. Vamos a trabajar
con el Timer1 en modo CTC. Cada vez que se produce la comparacin exitosa el bit OCF1A toma el
valor de 1. Se va a sondear el estado de este bit y cada vez que tome el valor lgico de 1
incrementamos la cuenta. Es necesario poner el OCF1A en 0 para volver a sondear (Notar que para
que este bit tome el valor de 0 tenemos que escribir un 1).











El hardware de este problema
est conformado por ocho leds
conectados al puerto B.

Aadir al archivo
Timer1_sondeo.prj las siguientes lneas:

D1 VDD N1
R1 N1 N2 180
X1 ND2 PB0 PB0 N2

D2 VDD N3
R2 N3 N4 180
X2 ND2 PB1 PB1 N4

D3 VDD N5
R3 N5 N6 180
X3 ND2 PB2 PB2 N6

D4 VDD N7
R4 N7 N8 180
X4 ND2 PB3 PB3 N8

D5 VDD N9
R5 N9 N10 180
X5 ND2 PB4 PB4 N10

D6 VDD N11
R6 N11 N12 180
X6 ND2 PB5 PB5 N12

D7 VDD N13
R7 N13 N14 180
X7 ND2 PB6 PB6 N14

D8 VDD N15
R8 N15 N16 180
X8 ND2 PB7 PB7 N14


PONTIFICIA UNIVERSIDAD CATLICA DEL PER
FACULTAD DE CIENCIAS E INGENIERA
SECCIN DE ELECTRICIDAD Y ELECTRNICA
Curso de Microcontroladores ATmega8 8
INICIO
Configurar puertos de
salida para leds
cuenta 0
Se cumpli el
tiempo ?
LEDS cuenta
SI
NO
Tmr1_sondeo
Configurar el
Temporizador
cuenta cuenta + 1



;**********************************************************************
;**********************************************************************
;***** PONTIFICIA UNIVERSIDAD CATOLICA DEL PERU *****
;***** Laboratorio de Sistemas Digitales *****
;***** *****
;***** Nombre: Tmr1Sond.asm *****
;***** Autor: Rolando Snchez *****
;***** Fecha: Mayo 2004 *****
;***** *****
;***** Descripcion: Mostramos en ocho leds, conectados al *****
;***** Puerto B una cuenta que se incrementa cada *****
;***** 250ms. Utilizamos la interrupcin por *****
;***** Comparacin exitosa del TIMER1 en modo CTC A. *****
;***** *****
;**********************************************************************
;**********************************************************************

.include "m8def.inc"

.DSEG
.ORG $60
CUENTA: .byte 1

.CSEG

;**********************************************************************
;***** PROGRAMA PRINCIPAL *****
;**********************************************************************

INICIO: LDI R16, HIGH(RAMEND) ; Inicializamos la pila
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16

LDI R16, $FF ; Configuramos PORTB como salida
OUT DDRB, R16

RCALL CONFIGURA_TMR1
PONTIFICIA UNIVERSIDAD CATLICA DEL PER
FACULTAD DE CIENCIAS E INGENIERA
SECCIN DE ELECTRICIDAD Y ELECTRNICA
Curso de Microcontroladores ATmega8 9

LDI R16, $00 ; Inicializamos CUENTA y PORTB con $00
OUT PORTB, R16
STS CUENTA, R16


SONDEA_OCF1A: IN R16, TIFR ; Sondeamos OCF1A (bit4 de TIFR)
ANDI R16, $10 ; esperamos que sea 1
CPI R16, $10
BRNE SONDEA_OCF1A


IN R16, TIFR ; Se pone 0 el bit OCF1A
ORI R16, $10
OUT TIFR, R16


LDS R16, CUENTA ; Incrementamos el valor de CUENTA
INC R16
STS CUENTA, R16

OUT PORTB, R16 ; Lo visualizamos en el puerto

RJMP SONDEA_OCF1A ; Regresamos al lazo


;**********************************************************************
;***** Subrutina que Configura la Interrupcin TIMER1 COMPA *****
;**********************************************************************

CONFIGURA_TMR1:
; Preescalamiento 1:1024
; Modo CTC

LDI R16, (0<<COM1A1 | 0<<COM1A0 | 0<<WGM11 | 0<<WGM10)
OUT TCCR1A, R16

LDI R16, (0<<WGM13 | 1<<WGM12 | 1<<CS12 | 0<<CS11 | 1<<CS10)
OUT TCCR1B, R16

LDI R17, $00 ; Valor de Registro OCR1A: 244 ($00F4)
LDI R16, $F4
OUT OCR1AH, R17 ; (1us)x(1024)x(244) = 249.8ms
OUT OCR1AL, R16

RET




Ing. Rolando Snchez Ponce
Diciembre 2006