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
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