Manejo de Timers Atmega-converted

Versión: 1.0 UNIVERSIDAD NACIONAL DE CHIMBORAZO FACULTAD DE INGENIERIA Revisión: 01/10/2018 PÁGINA: 1 DE 18 GUÍA DE P

Views 58 Downloads 68 File size 1023KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Versión: 1.0

UNIVERSIDAD NACIONAL DE CHIMBORAZO FACULTAD DE INGENIERIA

Revisión: 01/10/2018 PÁGINA: 1 DE 18

GUÍA DE PRÁCTICAS PERIODO ACADÉMICO: OCTUBRE 2018-MARZO 2019 DOCENTE: CURSO:

CARRERA: Ing. Electrónica y Telecomunicaciones

Ing. Leonardo Rentería

Sexto

NOMBRE DE LA ASIGNATURA:

LABORATORIO A UTILIZAR:

Microprocesadores

Práctica No.

Tema:

CÓDIGO DE LA ASIGNATURA:

Duración (horas)

No. Grupos

Electrónica

No. Estudiantes (por Grupo)

Manejo de Timers 3 6 3 (1 de 4) atmega Objetivos de la Práctica: Configurar y utilizar el módulo Temporizador del mcu atmega para crear eventos temporizados Equipos, Materiales e Insumos: Osciloscopio, Generador de funciones, multímetro, mcu atmega, arduino , pc Procedimiento: 1

1. Arme el circuito que se muestra en la figura

2. Crear un programa para usar el Timer0 como contador eventos externos (pulsos generados por el botón) y mostrar el resultado en el Puerto D. (Ver TCCR0A – TCCR0B de la hoja de datos). 3.

Crear el siguiente circuito.

4. Crear un programa usando el Timer0 para hacer parpadear el led cada 50ms. Usar el Osciloscopio para comprobar el resultado. (Ver TCCR0B – TCNT0). Verificar el resultado en el osciloscopio. 5. Arme el siguiente circuito

6. Crear un programa que use el Timer0 en modo Output-Compare para hacer parpadear un LED a una frecuencia de 10ms. (ver TCCR0B-OCR0B-TCCR0A). Verificar el resultado en el osciloscopio.

Fundamento teórico

Timer0 AVR temporizador contador

Ilustración 1 Timer0 AVR

En este caso se verá el uso del timer0 AVR como contador, temporizador y en modo comparador, el uso del timer0 AVR en modo PWM se verá en otro apartado, en lo que sigue se comentará para el caso del ATmega88 por lo que es muy importante que se tenga a mano la hoja de datos del atmega88, para el caso de utilizar algún otro microcontrolador AVR el procedimiento será muy similar a lo aquí comentado, la programación se realizará con atmel studio El timer0 AVR es un temporizador contador de 8 bits, el registro donde se guardan los valores del timer0 AVR es el registro temporizador contador representado por TCNT0, cuando es utilizado como temporizador, sus valores aumentaran de uno en uno entre 0 y 255 con cada ciclo de reloj, por ejemplo si el oscilador con el que está funcionando el microcontrolador AVR es de 1MHz, entonces el registro TCNT0 aumentará una unidad en 1 us, si el registro TCNT0 se incrementa en 100 unidades habrán transcurrido 100us; cuando es utilizado como contador el temporizador AVR ya no aumenta su valor de uno en uno en cada ciclo de reloj, sino que lo hará mediante el flanco de subida o el flanco de bajada de alguna señal que llegue a un pin especial del AVR conectado al timer0 AVR, este pin es identificado como T0 que en el ATmega88 es el pin6 o PD4, esto puede variar de acuerdo al microcontrolador avr utilizado, pero siempre se llamará T0. El registro TCNT0 del timer0 AVR puede ser leído y escrito, puede ser prescalado para que el tiempo en su incremento de valor en una unidad sea mayor, el timer0 AVR cuando alcanza su valor máximo de 255 se reinicia, volviendo a incrementar sus valores de 0 a 255, además cuando llega a su valor máximo y se reinicia puede producir una interrupción, lo cual se decide por programa.

Timer0 AVR como contador Para el ATmega88 el registro TCNT0 del timer0 AVR está formado por 8 bits por lo que se puede contar desde 0 hasta 255, al utilizar timer0 AVR como contador este no aumentará sus valores o su cuenta con cada ciclo de programa, en este caso el timer0 estará conectado al pin T0 por donde se le hará llegar una señal, la cual al cambiar de estado hará que el timer0 AVR se incremente en una unidad, estos incrementos en su cuenta pueden ser por cada flanco de subida o cada por flanco de bajada de la señal, el flanco a utilizar se elige por programa, por ejemplo su se elige el flanco de subida quiere decir que cada vez que la señal que llega al pin T0 pase de un bajo a un alto o de 0 a 1, el registro TCNT0 aumentará en una unidad, de esta manera se le puede utilizar como contador, cuando la señal pase

de un alto a un bajo o de 1 a 0 el registro TCNT0 no aumentará su valor o no se incrementará. Para programar el timer0 AVR como contador será necesario colocar todos los bits del registro TCCR0A a cero, esto es TCCR0A=0, en realidad esto no es necesario ya que el registro se inicializa automáticamente a 0, este registro será útil cuando se utilice el timer0 AVR en modo comparación y para la modulación de ancho de pulso PWM.

Ilustración 2 timer0 avr TCCR0A

El registro TCCR0B es el que permitirá utilizar el timer0 avr como contador:

Ilustración 3 temporizador contador avr tccr0b

Según se ve en la hoja de datos del ATmega88 para utilizar el timer0 AVR como contador, del registro TCCR0B hay que manipular sus bits 0, 1 y 2 (CS00, CS01 y CS02) los demás bits se pondrán a 0, se tienen dos posibilidades, para que el conteo se realice cuando la señal que llega al pin T0 pase de 0 a 1 o por flanco de subida estos 3 bits se pondrán a 1 esto es CS00=1, CS01=1 y CS02=1; y si el conteo será cuando la señal que llega al pin T0 pase de 1 a 0 o por flanco de bajada solo se pondrán a 1 los bits 1 y 2, mientras el bit0 se deja a 0 esto es CS00=0, CS01=1 y CS02=1.

Timer0 AVR Como temporizador Para el ATmega88 el registro TCNT0 del timer0 AVR está formado por 8 bits por lo que se sus valores pueden ser desde 0 hasta 255, al utilizar timer0 AVR como temporizador este aumentará sus valores o su cuenta con cada ciclo de reloj, sus valores aumentaran de uno en uno entre 0 y 255, por ejemplo si el oscilador con el que está funcionando el microcontrolador AVR es de 1MHz, entonces el registro TCNT0 aumentará una unidad en 1 us, si el registro TCNT0 se incrementa en 27 unidades habrán transcurrido 27us. Normalmente el registro del timer0 TCNT0 irá aumentando su conteo con cada ciclo de reloj del microcontrolador, si se usa por ejemplo una frecuencia de trabajo (lo que se conoce como FCPU) de 1Mhz entonces el registro TCNT0 aumentará en una unidad cada microsegundo, y como este registro es de 8 bits este aumentará desde 0, o desde algún valor que se le ponga como valor inicial al registro TCNT0, hasta un máximo de 255, por ejemplo si va desde 0 hasta 255 habrán transcurrido 255us luego volverá a 0 pero en esa

vuelta a 0 transcurre 1us mas, por lo cual en ir de 0 y volver a 0 transcurren 256us; no siempre se utiliza una FCPU de 1Mhz esto puede variar, por lo que como consecuencia variará el tiempo que trascurre para que el registro TCNT0 aumente su valor. Para programar el timer0 AVR como temporizador será necesario colocar todos los bits del registro TCCR0A a cero, esto es TCCR0A=0, en realidad esto no es necesario ya que el registro se inicializa automáticamente a 0, este registro será útil cuando se utilice el timer0 AVR en modo comparación y para la modulación de ancho de pulso PWM.

Ilustración 4 timer0 avr TCCR0A

El registro TCCR0B es el que permitirá utilizar el timer0 avr como temporizador: El timer0 AVR cuenta con lo que se conoce como el prescaler esto hace que la frecuencia de trabajo FCPU se divida por este prescaler, con lo que se logra que el timer0 AVR tarde un poco mas en aumentar su valor en una unidad; el prescaler puede tomar el valor de 1, 8, 64, 256 o 1024; estos valores se eligen programando los bits 0, 1 y 2 del registro TCCR0B, los bits 7 a 3 en este caso se pondrán a 0.

Ilustración 5 temporizador contador avr tccr0b

Timer0 AVR en modo comparador modo CTC Al utilizar el timer0 AVR en modo comparador ocurre que el registro TCNT0, que en este caso es de 8 bits, irá aumentando su valor de uno en uno desde 0 hasta que este se haga igual a un valor almacenado en el registro OCR0A (no en el registro OCR0B), en el momento que se hacen iguales los valores de los registros TCNT0 y OCR0A, el registro TCNT0 se pone automáticamente a cero o también se dice se borra, para nuevamente comenzar a aumentar su valor desde 0 hasta que se vuelva hacer igual al valor almacenado en el registro OCR0A. A esto se lo conoce como el modo de trabajo CTC, que quiere decir borrado del timer por comparación. Si se utiliza el modo CTC y se tiene almacenado un valor en el registro OCR0A, eso quiere decir que por el pin 12 (pin OC0A) o el pin 11 (pin OC0B), más adelante se verá cómo elegir el pin a utilizar en este caso para atmega88, cuando el valor del registro TCNT0 se haga igual al valor almacenado en el registro OCR0A ocurrirá algún evento en alguno de estos pines, como por ejemplo que si el pin está a uno se pondrá a cero, o si está a cero se pondrá a uno; es necesario ademas configurar el pin a utilizar como una salida mediante el registro DDRx dependiendo en que

puerto este el pin, que para el atmega88 está en el puerto D. En el modo de trabajo CTC del timer0 se utilizarán los registros TCCR0A y TCCR0B El registro TCCR0A con este registro se elige si el evento a ocurrir como respuesta por comparación a la igualdad entre el registro TCNT0 y el registro OCR0A, será por el pin OC0A u OC0B, en la siguiente imagen se tiene el registro TCCR0A, en el se pueden ver los nombres dados a sus bits.

Ilustración 6 timer0 avr TCCR0A

Los bits 7 y 6 son para elegir que el evento cuando ocurra la comparación sea por el pin OC0A, para elegir el tipo de evento que ocurrirá cuando se iguale el registro TCNT0 con el registro OCR0A, en el caso de utilizar el pin OC0A para las combinaciones de los bits 7 y 6 se tiene la siguiente tabla, si ambos bits son 0 la opción OC0A del pin no está disponible trabajando el pin como una entrada salida digital normal. Timer0 AVR en modo comparador modo CTC el registro OCR0A En el registro OCR0A se cargará el valor hasta el cual se quiere que llegue el registro TCNT0 en el modo CTC, por lo que hay que ver como se puede encontrar el valor adecuado a cargar en el registro OCR0A, se ha visto que para utilizar el timer0 AVR como temporizador hay que cargar el registro TCNT0 con un valor obtenido de la siguiente ecuación: TCNT0=28-Tretardo*(FCPU/prescaler)-1 Para el caso de utilizar el timer0 AVR en modo de comparación o CTC hay que cargar en el registro OCR0A, la cantidad de veces que tiene que contar el registro TCNT0, lo que viene a ser el máximo valor al que el registro TCNT0 puede llegar que es 255 menos lo que sería necesario cargar en el registro TCNT0 para obtener el tiempo buscado, entonces de la ecuación anterior se tendría que cargar el registro OCR0A: OCR0A = 28-TCNT0-1 = Tretardo*(FCPU/prescaler) entonces: OCR0A= Tretardo*(FCPU/prescaler) El registros OCR0A es de 8 bits por lo que el valor obtenido mediante la ecuación anterior tendrá que ser un número entero comprendido entre 0 y 255, de no ser así el valor no será válido. Por ejemplo, para lograr que la comparación ocurra cada 50ms, utilizando un prescaler de 256 será necesario cargar el registro OCR0A con el valor de OCR0A=(50ms)(1Mhz)/256 De donde

OCR0A=195,3125 El valor obtenido está entre 0 y 255 aunque no es un número entero, por lo que hay que redondearlo al entero más cercano en este caso 195, al hacer esto la comparación no ocurrirá exactamente a los 50ms pero si en un momento bastante próximo y aceptable. Para el registro TCNT0 del timer0 AVR, si se carga el registro OCR0A con 195 y se utiliza un prescaler de 256, entonces cuando aumente el valor del registro TCNT0 de 0 a 195 habrán transcurrido 50ms. 195 sería el valor a cargar en el registro OCR0A para que cada 50ms el valor del registro TCNT0 llegue a 195 y por comparación se produzca un evento en el pin OC0A u OC0B, tras lo cual el registro TCNT0 se pondrá automáticamente a 0 para volver a aumentar su valor nuevamente hasta 195 en un lapso de 50ms y se vuelva a repetir el proceso.

Resultados 1. Armado del circuito requerido 1

Ilustración 7 Circuito Armado 1

2. Programa creado para usar el Timer0 como contador #define F_CPU 1000000u1 // declaracion de librerias #include // declaracion de librerias #include // declaracion de librerias void setup() //Configuracion { DDRD=0b11101111; //Habilitamos el pin 4 como entrada al puerto D DDRB=255; // Habilitamos todo el puerto como salida TCCR0A=0; // Registro a 0 TCNT0=0; // Contador a 0 TCCR0B|=(1