Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Myslide - Es - 133092028 Manejo de Temporizadores Avr PDF
Myslide - Es - 133092028 Manejo de Temporizadores Avr PDF
TEMPORIZADORES
DE AVRs
PROGRAMACION EN
C
OBJECTIVOS
.
FOC0 : es D7 Force compare match: Esto es de sólo escritura, puede utilizarse mientras
se genera una onda. Escribirle un 1 causa que al generar la onda actué como si un
match de comparación se ha producido.
WGMO0, WGMO1
D6 D3 bits de selección del modo del Timer0
0 0 normal
0 1 CTC (Borrar contador en comparación Match)
1 0 PWM, fase correcta
1 1 PWM rápido
COM01:COM00 DS D4 Comparar Modo de salida: Estos bits controlan el generador de
forma de onda.
CS02: CS00
D2 DI D0 Selector fuente de reloj del Timer 0
0 0 0 Ninguna fuente (Timer / Contador parado)
0 0 1 CLK (Sin preescalar)
0 1 0 CLK / 8
0 1 1 CLK 1/64
1 0 0 CLK / 256
1 0 1 CLK / 1024
1 1 0 fuente de reloj externa en el pin T0 con flanco descendente.
1 1 1 fuente de reloj externa en el pin T0 con flanco ascendente.
Ejemplo 2:
Encuentra la frecuencia del reloj del temporizador y su periodo para varios sistemas
basados en AVR, con las siguientes frecuencias de cristales. Supongamos que no se
utiliza preescalar.
(a) 10 MHz
(b) 8 MHz
(c) 1 MHz
Solución:
(a) F = 10 MHz y T = 1/10 MHz = 0,1 uS
(b) F = 8 MHz y T = 1/8 MHz = 0,125 uS
(c) F = 1 MHz y T= 1/1 MHz = 1 uS
Si CS02:CS00 tienen un valor igual a 110 o 111, se utiliza una fuente de reloj externa y
actúa como un contador.
Registro TIFR (Timer/counter Interrupt Flag Register)
Suponiendo que XTAL = 8 MHz, modificar el programa anterior para generar una onda
cuadrada de frecuencia de 16 kHz en el pin 4 de PORTB.
Solución:
Mira los siguientes pasos.
(a) T = 1 / f = 1/16 kHz = 62.5 uS es el periodo de la onda cuadrada.
(b) 1/2 del periodo para las partes alta y baja del pulso es de 31.25 uS.
(e) 31.25 uS / 0.125 uS=250 y 256 - 250 = 6, que en hexadecimal es 0x06.
(d) TCNT0 = 0x06.
Como se ha visto en los ejemplos hasta el momento, el tamaño del retardo de tiempo
depende de dos factores, (a) la frecuencia del cristal, y (b) registro del temporizador de
8-bits. Ambos factores están fuera del control del programador.
El retraso más grande de tiempo se consigue haciendo TCNT0 igual a cero. Pero ¿ es
eso suficiente?. Podemos utilizar la opción de pre-escalador en el registro TCCR0 para
aumentar el retraso al reducir el periodo. La opción preescalar de TCCR0 nos permite
dividir el reloj por un factor de 8 a 1024 como se muestra en la Figura anterior. El
preescalar del temporizador/contador 0 se muestra en esa figura.
Como hemos visto hasta ahora, sin preescalar habilitado, la frecuencia del cristal
oscilador se alimenta directamente al Timer 0, Si nosotros habilitamos el bit preescalar
en el registro TCCR0, sin embargo, podemos dividir el pulso antes de que se alimente al
Timer 0 . Los 3 bits más bajos del registro TCCR0 dan las opciones del número por el
que se puede dividir. Como se muestra en la Figura, este número puede ser de 8,
64.256, y 1024. Observe que el número más bajo es de 8 y el número más alto es 1024.
Ejemplo
(a) 1/64 x 8 MHz= 125 kHz debido a 1:64 preesealar y T = 1/125 kHz = 8 uS
(b) 1/64 x 16 MHz = 250 kHz debido a preescalar y T = 1/250 kHz = 4 uS
(e) 1/64 x 10 = 156.2 MHz kHz debido a preesealar y T = 1/156 kHz = 6.4 uS
Ejemplo
Programación Temporizador 2
FOC2 : es D7 Force compare match: Esto es de sólo escritura, puede utilizarse mientras
se genera una onda. Escribirle un 1 causa que al generar la onda actué como si un
match de comparación se ha producido.
WGM20, WGM21
D6 D3 bits de selección del modo del Timer2
0 0 normal
0 1 CTC (Borrar contador en comparación Match)
1 0 PWM, fase correcta
1 1 PWM rápido
Ejemplo
Encuentra el valor de TCCR2 si queremos programar Timer2 en modo normal con un
preescalar de 64, utiliza una base interna de la fuente de reloj.
Solución:
En la figura tenemos TCCR2 = 0000 0100; fuente de reloj XTAL. preescalar de 64 .
AS2 Cuando es cero, el Timer2 obtiene el reloj desde clkI/o. Cuando se establece a
uno, el Timer2 actúa como RTC
Examinando la figura anterior, una vez más, vemos el registro OCR2. El registro OCR2
se utiliza con el modo CTC. Como con el modo normal, en el modo CTC, el
temporizador se incrementa con un pulso. Pero cuenta hacia arriba hasta que el
contenido del registro TCNT2 se hace igual al contenido de OCR (se produce un
match de comparacion), y luego, el temporizador es borrado (0x00) y la bandera
OCF2 se establece a uno cuando se produce el siguiente pulso. La bandera OCF2 se
encuentra en el registro TIFR.
Ejemplo
En el siguiente programa, estamos creando una onda cuadrada con ciclo de trabajo
de 50% (con partes iguales de alta y baja) en el bit 4 de PORTB. Timer 2 se utiliza para
generar el tiempo de retardo. Analizar el programa
#include "avr/io.h"
void retardo ( );
int main ( ) {
DDRB = 0xFF; //PORTB como salida
while (1) {
retardo ();
PORTB ^= _BV(PB4);
}//repite por siempre
}
void retardo ( ) {
TCNT2 = 0; //carga de TCNT2
OCR2 = 0x9;
TCCR2 = 0x9; //Timer 2, CTC mode,reloj interno
while ((TIFR&(1<<OCF2))==0);//espera desbordamiento
TCCR2 = 0;
TIFR |=(1<<OCF2); //Borra el indicador
}
Solución:
El programa de arriba cuenta de los siguientes pasos:
1. Se carga 0x9 en OCR2.
2. Se carga TCCR2 y el Timer 2 inicia su conteo.
3. El Timer 2 cuenta hacia arriba con el paso de cada pulso de reloj, que es
proporcionado por el oscilador de cristal. A medida que el temporizador cuenta hacia
arriba, pasa por los estados de 00, 01, 02, 03, y así sucesivamente hasta que alcanzar
0x9. Un pulso más que lo lleva a cero, el Timer 2 coloca a uno la bandera de match de
comparación (OCF2 = 1).
4. El Timer 2 se detiene.
5. La bandera OCF2 se borra.
El registro TIFR contiene las banderas TOV1, OCF1A y OCF1B, ver Figura .
WGM13: 10
El WGM13, WGMI2, WGM11, y los bits WGM10 definen el modo del Timer 1, como
se muestra en la figura de arriba. El Timer 1 dispone de 16 modos diferentes. Uno de
ellos (modo 13) se reserva (no implementado). Tratremos modo normal y el modo
CTC.
Modos de operación del Timer 1
El modo Normal (WGM13:10 = 0000)
En este modo, el temporizador cuenta hacia arriba hasta que alcanza 0xFFFF (que es
el valor máximo) y luego pasa por encima de 0xFFFF a 0000. Cuando esto ocurre, la
bandera TOV1 se establecerá a uno.
En este modo, el temporizador cuenta hacia arriba hasta que el contenido del
registro TCNT1 se hace igual al contenido de OCR1A (se produce un match de
comparación), a continuación, el temporizador se borra cuando se produce el
siguiente pulso de reloj. La bandera OCF1 se establece a uno como resultado de
coincidir la comparación.
Ejemplo
Ejemplo
Escriba un programa C para alternar el bit 4 de PORTB continuamente cada 2 ms.
Utilice Timer 1, el modo Normal, y no preescalar para crear el retardo. Supongamos
XTAL = 8 MHz.
Solución:
XTAL = 8 MHz -> Tciclo maquina = 1/8 MHz = 0.125 uS
preescalador = 1:1 TClock = 0.125 uS
2 mS/0.125uS = 16.000 = 0x3E80 pulsos
1 + 0xFFFF - 0x3E80 = 0xC180
#include "avr/io.h"
void retardo ( );
int main ( ) {
DDRB = 0xFF; //PORTB como salida
while (1) {
retardo ();
PORTB ^= _BV(PB4);
}//repite por siempre
}
void retardo ( ) {
TCNT1H = 0xC1;
TCNT1L = 0x80; //carga de TCNT2
TCCR1A = 0; //Modo Normal
TCCR1B = 0x1; //Timer 1, modo normal,Sin preescalar
while ((TIFR&(1<<TOV1))==0);//espera desbordamiento
TCCR1B = 0;
TIFR |=(1<<TOV1); //Borra el indicador
}
Como se ha visto en los ejemplos hasta el momento, el tamaño del retardo de tiempo
depende de dos factores: (a) la frecuencia del cristal, y (b) el registro del
temporizador de 16-bit. Ambos de estos factores están fuera del control del
programador. Podemos utilizar la opción de pre-escalador en registro TCCR1B para
aumentar el retraso o tamaño del periodo. La opción preescalar de TCCR1B nos
permite dividir el reloj en un factor de 8 a 1024.
Como hemos visto hasta ahora, sin preescalar habilitado, la frecuencia del oscilado se
alimenta directamente al Timer 1. Si nosotros habilitamos el bit preescalar en el
registro TCCR1B, entonces podemos dividir el reloj antes de que se alimente al Timer
1. Los 3 bits menos significativos del registro TCCR1B dará el número de opciones en
que podemos dividir el reloj antes de que se alimente al temporizador. Como se
muestra en la figura anterior, este número puede ser 8, 64, 256, o 1024. Tenga en
cuenta que el número más bajo es de 8, y el número más alto es 1024.
Ejemplo
Escribe programa para cambiar sólo el bit 4 de PORTB continuamente cada segundo.
Utilice el modo Timer 1, modo Normal y preescalar 1:256 para crear el retardo.
Supongamos XTAL = 8 MHz.
Solución:
XTAL = 8 MHz -> Tciclomaquina = 1/8 MHz = 0.125 uS = Treloj
Preescalador = 1:256 -> Treloj = 256 x 0.125 = 32uS
1S/32uS = 31,250 = 0x7A12 pulsos de relojes -> = 1 + 0xFFFF - 0x7A12 = 0x85EE
#include "avr/io.h"
void retardo ( );
int main ( ) {
DDRB = 0xFF; //PORTB como salida
while (1) {
retardo ();
PORTB ^= _BV(PB4);
}//repite por siempre
}
void retardo ( ) {
TCNT1H = 0x85;
TCNT1L = 0xEE; //carga de TCNT2
TCCR1A = 0; //Modo Normal
TCCR1B = 0x4; //Timer 1, modo normal,1:256 preescalar
while ((TIFR&(1<<TOV1))==0);//espera desbordamiento
TCCR1B = 0;
TIFR |=(1<<TOV1); //Borra el indicador
}