Departamento de Automatización y Control Industrial - DACI
Pines ATMEGA164P
Pines ATMEGA164P
Vector Interrup Interrupiones iones ATMEGA164P ATMEGA164P
Vector Interrup Interrupiones iones ATMEGA164P ATMEGA164P
Timers •
•
Los Timers son módulos que trabajan en paralelo con el procesador, permitiendo que las operaciones de temporización 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 Características •
• • • •
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 atrás, según se programe, impulsado por la señal 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 máximo de 255, continuará después contando desde 0 otra vez, cíclicamente. Esta transición se lo conoce como el Desbordamiento. El desbordamiento del Timer0 activa el bit de flag TOV0. También 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 están 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 comparación se utiliza para la generación de ondas ondas cuadradas o PWM. El reloj del Timer/Contador 0: puede ser interno vía el preescalador o con reloj externo através 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 más bajo cuando llega a 0x00. MAX: el contador alcanza el valor más alto cuando llega a ser 0xFF (255 en decimal). TOP: el contador alcanza el valor tope cuando se iguala al valor más alto de la secuencia de conteo. El valor tope puede ser asignado por un valor fijo máximo de 0xFF o el valor almacenado en el registro OCR0 .
Timer0 – Modo Normal MODOS DE OPERACIÓN MODO NORMAL •
•
•
El modo más simple es el modo normal (WGM02:0 = 0). En este modo la dirección del conteo es siempre ascendente y no se limpia el contador (0-255). El contador simplemente se sobrescribe cuando pasa de su máximo valor de 8 bits (TOP = 0xFF) y entonces se reinicia desde su valor más 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 Comparación de Limpieza del Timer (CTC) •
•
(WGM02:0=2), en este modo el Timer0 (TCNT0) también 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 también activa el flag OCF0A, el cual se puede usar para programar interrupciones. El registro OCR0A también 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 lógico cada vez que exista una igualdad de comparación, simplemente ajustando los bits de modo de comparación de salida a un modo “toggle”( COM01:0=1).
•
•
•
N = representa el factor pre-escalar (1, 8, 64, 256 o 1024). = Frecuencia de la señal de onda cuadrada
Timer0 – Fast PWM Modo Rápido PWM La modulación rápida PWM (pendiente única) o el modo rápido PWM (WGM02:0=3) provee una alta generación 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 también serán constantes. Esa es la limitación 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 resolución de fase correcta de forma de onda en la generación de PWM. El modo de fase correcta de PWM se basa en la operación 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 Generación de formas de Onda
Timmers
El bit FOC0n sólo se activa cuando los bits WGM especifican un modo no PWM.
Timmers
Timmers •
Ejercicio 1: Generar un señal de 2Khz que salga por el puerto 0C0A
Timmers .include "m164pdef.inc" .def tempo=r16 .org 0x0 ldi tempo,0b0000_1000 out DDRB,tempo ldi tempo,249 out OCR0A,tempo ldi tempo,0b0100_0010 out TCCR0A,tempo ldi tempo, 0b0000_00010 out TCCR0B,tempo
Lazo: rjmp lazo
; configuro como salida PB3
; configuro comparación ; toggle y ctc ; prescaler 8
Timer0 - Ejercicios •
Ejercicio 2: Generar un señal 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: Interrupción 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 reti
;toggle
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 ldi tempo,0b0000_0101 out TCCR0B,tempo ldi tempo,0b0000_0001 sts TIMSK0,tempo ldi tempo,128 out TCNT0,tempo sei lazo: nop rjmp lazo TIM0_OVF: sbi PINB,0 ;toggle ldi tempo,128 out TCNT0,tempo reti
;PORTB0 como salida ; PRESCALER TO /1024 ;cargo registro de control ;habilito interrupcion TIMER-OVERFLOW
;habilito interrupciones globales
Timer0 - Ejercicios Ejercicio: Fast PWM, Phase correct, ancho de pulso variable
Timer0 - Ejercicios .include “m164def.inc" .def tempo = R16 .org 0x0 sbi DDRB,3 ldi tempo,0b1000_0011 //ldi tempo,0b1000_0001 out TCCR0A,tempo ldi tempo,0b0000_0101 out TCCR0B,tempo ldi tempo,10 //ldi tempo,202 out OCR0A,tempo lazo: rjmp lazo
;pongo PORTB3 como salida ;pongo FAST PWM MODE 256 ;pongo phase correct 512 ; PRESCALER TO /1024 ;valor a cargar 4% ;valor a cargar 79% ;para comparar
Timer0 - Ejercicios •
Realizar un programa que lea un sensor por el A/D cada 100ms
Bibliografía 1. Muhammad Ali Mazidi (2011). The avr microcontroller and embedded system. 2. Yago Torroja & Jorge Portilla, “Curso de Microcontroladores”, Escuela Técnica
Superior de Ingenieros Industriales, Universidad Politécnica de Madrid