Sei sulla pagina 1di 41

SISTEMAS MICROPROCESADOS

Departamento de Automatizacin y
Control Industrial - DACI
Pines ATMEGA164P
Vector Interrupiones ATMEGA164P
Vector Interrupiones ATMEGA164P
Timers

Los Timers son mdulos que trabajan en paralelo con el


procesador, permitiendo que las operaciones de
temporizacin y conteo se puedan llevar a cabo de manera
eficiente, mientras el procesador se ocupa de otras tareas.

El Atmega164p cuenta con 3 timers (Timer0, Timer1, Timer2),


de 8bits y 16 bits.
Timer0

8-bit del temporizador / Counter0 con PWM

Caractersticas

Two Independent Output Compare Units: PB3 (OC0A),PB4


(OC0B).
Clear Timer on Compare (CTC) Match (Auto Recargables)
Phase Correct Pulse Width Modulator (PWM)
PWM de Periodo Variable
Tres fuentes de interrupcion (TOV0 (0x24), OCF0A(0x20), and
OCF0B(0x22))
Timer0
Timer0
Timer0

TCNT0: Como es un registro de 8 bits, decimos que el


Timer0 es de 8 bits. El Timer0 puede avanzar hacia adelante
o hacia atrs, segn se programe, impulsado por la seal de
su reloj, el cual puede ser interno o externo. Cuando nos
referirnos al avance del Timer nos referimos al avance de su
contador, el registro TCNT0.

Timer0 (concepto 1): puede contar entre 0 y 255. Cuando el


Timer0 opera solo en modo ascendente y llega a su valor
mximo de 255, continuar despus contando desde 0 otra
vez, cclicamente. Esta transicin se lo conoce como el
Desbordamiento. El desbordamiento del Timer0 activa el
bit de flag TOV0. Tambin es posible hacer que el Timer0
cuente solo hasta un tope establecido por el registro OCR0A
Timer0

Timer0 (concepto 2): tiene dos comparadores que en todo


momento estn comparando el valor del registro TCNT0 con
los registros OCR0A y OCR0B. La coincidencia
entre TCNT0 y OCR0A activa el bit de flag OCF0A y la
coincidencia entre TCNT0 y OCR0B activa el bit de flag OCF0B.
Esta comparacin se utiliza para la generacin de ondas
ondas cuadradas o PWM.

El reloj del Timer/Contador 0: puede ser interno va el pre-


escalador o con reloj externo atravs del pin T0.
Timer0

Podemos controlar el Timer0 con tres tipos de bits:

Clock Select: se encargan de configurar todo lo relacionado


con el reloj y el prescaler del Timer.

Waveform Generator Mode: establecen el modo en que


operar el Timer0, ya sea modo Normal, CTC o PWM.

Compare Output Mode: deciden si las ondas generadas por


los comparadores salen o no por los pines OC0A y OC0B del
uC.
Timer0

BOTTOM: el contador alcanza el nivel ms bajo cuando llega a


0x00.

MAX: el contador alcanza el valor ms alto cuando llega a ser 0xFF


(255 en decimal).

TOP: el contador alcanza el valor tope cuando se iguala al valor


ms alto de la secuencia de conteo. El valor tope puede ser
asignado por un valor fijo mximo de 0xFF o el valor almacenado
en el registro OCR0 .
Timer0 Modo Normal
MODOS DE OPERACIN

MODO NORMAL

El modo ms simple es el modo normal (WGM02:0 = 0). En


este modo la direccin del conteo es siempre ascendente y no
se limpia el contador (0-255).

El contador simplemente se sobrescribe cuando pasa de su


mximo valor de 8 bits (TOP = 0xFF) y entonces se reinicia
desde su valor ms bajo (0x00). En funcionamiento normal, la
bandera de desbordamiento (TOV0) se activara cuanto el
Registro TCNT0 se convierte en cero.

Como el registro TCNT0 es de lectura y escritura podemos en


cualquier momento modificar su valor y as calibrar o ajustar
las temporizaciones.
Timer0 Modo Normal
Timer0 Modo CTC

Modo de Comparacin de Limpieza del Timer (CTC)

(WGM02:0=2), en este modo el Timer0 (TCNT0) tambin


empieza a contar desde 0x00 y se incrementa hasta que su
valor sea igual al del registro OCR0A, en ese momento el
registro TCNT0 se resetea y vuelve a contar desde 0x00.

La coincidencia tambin activa el flag OCF0A, el cual se puede


usar para programar interrupciones. El registro OCR0A tambin
es de lectura y escritura de modo que podemos establecer el
tope hasta donde contar el Timer0.
Timer0 Modo CTC
Timer0 Modo CTC
Para generar una forma de onda de salida en el modo CTC, la
salida OC0n (n:A,B) puede ser invertida toogle de su nivel
lgico cada vez que exista una igualdad de comparacin,
simplemente ajustando los bits de modo de comparacin de
salida a un modo toggle( COM01:0=1).

N = representa el factor pre-escalar (1, 8, 64, 256 o 1024).

= Frecuencia de la seal de onda cuadrada


Timer0 Fast PWM
Modo Rpido PWM

La modulacin rpida PWM (pendiente nica) o el modo rpido


PWM (WGM02:0=3) provee una alta generacin en frecuencia de
forma de onda PWM. El contador se incrementa de BOTTOM a
MAX, entonces se reinicia desde BOTOM.
Timer0 Fast PWM

El Timer0 siempre cuenta en todo su rango de 0 a 255, se


deduce que el periodo, y por ende la frecuencia, de la onda
PWM tambin sern constantes. Esa es la limitacin del modo
PWM de los Timers de 8 bits. Es posible modificar el valor del
registro OCR0A, lo cual nos permitir controlar el duty cycle de
la onda PWM.
Timer0 Fase Correcta
Modo PWM de Fase Correcta
El modo de fase correcta PWM ( WGM01:2=1 ) provee una alta
resolucin de fase correcta de forma de onda en la generacin de
PWM. El modo de fase correcta de PWM se basa en la operacin
de doble pendiente. El contador se incrementa repetidamente
desde BOTTOM a MAX y se decrementa desde MAX a BOTTOM.
Timer0 Fase Correcta
Timer0 - Registros
Registros

Para cuando se configura como modo no-PWM y se quiere sacar


por el pin OC0n, siendo necesario configurar como salida.
Timer0 - Registros
Timmers

Modo de Generacin de formas de Onda


Timmers

El bit FOC0n slo se activa cuando los bits WGM especifican


un modo no PWM.
Timmers
Timmers

Ejercicio 1: Generar un seal de 2Khz que salga por el


puerto 0C0A
Timmers

.include "m164pdef.inc"
.def tempo=r16
.org 0x0
ldi tempo,0b0000_1000 ; configuro como salida PB3
out DDRB,tempo
ldi tempo,249 ; configuro comparacin
out OCR0A,tempo
ldi tempo,0b0100_0010 ; toggle y ctc
out TCCR0A,tempo
ldi tempo, 0b0000_00010 ; prescaler 8
out TCCR0B,tempo

Lazo:
rjmp lazo
Timer0 - Ejercicios

Ejercicio 2: Generar un seal de 100Hz que salga por el


puerto PB0
Timmers
.include "m164pdef.inc"
.def tempo=r16
.def igualdades=r17
.org 0x0
rjmp inicio
.org 0x20
rjmp igualdad

inicio:
ldi tempo,0b000_0001
out DDRB,tempo // configuracion del puerto PB0
ldi tempo,0b0000_0000
out PORTB,tempo // salida a cero
ldi igualdades,5
ldi tempo,high(ramend)
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo
Timer0 - Ejercicios

// configuro timer

ldi tempo,124 // cargo valor para 100Hz


out OCR0A,tempo

ldi tempo,0b0000_0010 ; ctc y desconectado OCRA ojo


out TCCR0A,tempo

ldi tempo,0b0000_0010 ; activo bandera del comparador cero


sts TIMSK0,tempo

ldi tempo,0b0000_0011 ; prescalador 64


out TCCR0B,tempo
sei

lazo: rjmp lazo


Timer0 - Ejercicios

igualdad:

push r16
in r16,sreg
push r16
dec igualdades
brne salir
in tempo,PINB
com tempo
ori tempo,0b1111_1110
out PORTB,tempo
ldi igualdades,5

salir: pop r16


out sreg,r16
pop r16
reti
Timer0 - Ejercicios

Ejercicio 3: Interrupcin por over flow 1

.include m164pdef.inc"
.def tempo = R16
.org 0x0
rjmp inicio ;inicio
.org 0x24
rjmp TIM0_OVF ;Timer0 Overflow
Timer0 - Ejercicios
INICIO:

sbi DDRB,0 ;PORTB0 como salida


ldi tempo,high(ramend)
out sph,tempo
ldi tempo,low(ramend)
out spl,tempo

ldi tempo,0b0000_0101 ; Prescalador 1024


out TCCR0B,tempo ; cargo registro de control
ldi tempo,0b0000_0001 ; habilito interrupcion TIMER-OVERFLOW
sts TIMSK0,tempo
sei ;habilito interrupciones globales

lazo:
nop
rjmp lazo

TIM0_OVF:
sbi PINB,0 ;toggle
reti
Timer0 - Ejercicios

Ejercicio: Interrupcion por over flow 2

.include m164pdef.inc"
.def tempo = R16
.org 0x0
rjmp INICIO ;inicio
.org 0x24
rjmp TIM0_OVF ;Timer0 Overflow
Timer0 - Ejercicios

INICIO:
sbi DDRB,0 ;PORTB0 como salida
ldi tempo,0b0000_0101 ; PRESCALER TO /1024
out TCCR0B,tempo ;cargo registro de control
ldi tempo,0b0000_0001 ;habilito interrupcion TIMER-OVERFLOW
sts TIMSK0,tempo
ldi tempo,128
out TCNT0,tempo
sei ;habilito interrupciones globales

lazo:
nop
rjmp lazo

TIM0_OVF:
sbi PINB,0 ;toggle
ldi tempo,128
out TCNT0,tempo
reti
Timer0 - Ejercicios

Ejercicio: Fast PWM, Phase correct, ancho de pulso variable


Timer0 - Ejercicios

.include m164def.inc"
.def tempo = R16

.org 0x0

sbi DDRB,3 ;pongo PORTB3 como salida


ldi tempo,0b1000_0011 ;pongo FAST PWM MODE 256
//ldi tempo,0b1000_0001 ;pongo phase correct 512
out TCCR0A,tempo
ldi tempo,0b0000_0101 ; PRESCALER TO /1024
out TCCR0B,tempo
ldi tempo,10 ;valor a cargar 4%
//ldi tempo,202 ;valor a cargar 79%
out OCR0A,tempo ;para comparar

lazo: rjmp lazo


Timer0 - Ejercicios

Realizar un programa que lea un sensor por el A/D


cada 100ms
Bibliografa

1. Muhammad Ali Mazidi (2011). The avr


microcontroller and embedded system.

2. Yago Torroja & Jorge Portilla, Curso de


Microcontroladores, Escuela Tcnica
Superior de Ingenieros Industriales,
Universidad Politcnica de Madrid
SISTEMAS MICROPROCESADOS
Departamento de Automatizacin y
Control Industrial - DACI

Marco Herrera
marco.herrera@ieee.org

Potrebbero piacerti anche