INSTITUTO POLITÉCNICO NACIONAL UNIDAD PROFESIONAL INTERDISCIPLINARIA DE INGENIERIA Y TECNOLOGIAS AVANZADAS
Practica 2: Manejo de Interrupción Timer
Microprocesadores, Microcontroladores e Interfaz Profesor: ValorCreativo.blogspot.com Trejo Salazar David Benjamín Equipo B1 Integrantes:
Grande Roldán Carlos Medina Torres Jael Sebastian Sánchez Mata Mario Israel Tovar Jaimes Daphne María Grupo: 2MV4
-Practica 2: Manejo de Interrupción Timer -
Practica 2: Manejo de Interrupción Timer Contenido Objetivo: ........................................................................................................................................ 3 Introducción teórica: ..................................................................................................................... 3 Desarrollo: ..................................................................................................................................... 4 Conclusiones: .............................................................................................................................. 11
2
-Practica 2: Manejo de Interrupción Timer Objetivo: Que el alumno aprenda el funcionamiento y el manejo de la rutina de interrupción Timer .
Introducción teórica: Los timers o temporizadores son características estándar de casi todos los microcontroladores, así que es muy importante aprender su uso. Los microcontrolador AVR tiene temporizadores muy poderosos y multifuncionales, pueden medir tiempo, generar frecuencias, contar eventos externos, hacer comparaciones, sincronizar tareas, generar una onda PWM, etc.
El tema de los timers es un tanto complicado y extenso, en esta serie de post se trata de dar una breve explicación del funcionamiento y programación del timer0 en el ATmega16.
El timer0 del ATmega16 es un contador/temporizador de 8 bits (puede contar hasta 255) síncrono, es decir, que depende del reloj del CPU (sólo su reloj, no el CPU) para funcionar, es un módulo independiente del núcleo del AVR lo que reduce la carga del micro.
Cada timer tiene asociado un reloj que fija el paso que debe marcar y una o más unidades compradoras. El reloj del timer0 es derivado del reloj del CPU y puede tener dos fuentes distintas: si se usa la fuente de reloj interna del CPU, el reloj del CPU pasa primero por un divisor de frecuencia (prescaler) y la salida de este divisor va al timer, si se usa una fuente de reloj externa por el pin T0, primero será sincronizada con el reloj interno antes de pasar al prescaler. Los valores de división (prescaler) ya están establecidos para cada timer, en el caso del timer0 la frecuencia del CPU puede ser dividida por un factor de 1, 8, 64, 256 o 1024, generando así la frecuencia de conteo. Por cada unidad comparadora existe un pin asociado a ella, normalmente marcado como OCx (Output Compare x) que es donde se puede generar una frecuencia de salida por la unidad comparadora del timer.
El timer0 tiene 4 modos de funcionamiento que se pueden configurar programando sus registros asociados:
Modo Normal: El timer cuenta desde 0 a 255 y se desborda reiniciando la cuenta. Puede generar interrupción al desbordarse o cuando la comparación del conteo concuerde con un valor determinado.
3
-Practica 2: Manejo de Interrupción Timer Modo CTC: En este modo el timer0 es reiniciado a 0 cuando una comparación entre el timer y un valor determinado coincide. Opcional mente puede configurarse para que al haber una coincidencia genera una interrupción o cambie el estado de un pin.
Modo Fast PWM: Este modo permite generar una onda PWM de alta frecuencia. El timer cuenta desde 0 a 255 y reinicia la cuenta. Con cada cuenta el valor del timer0 se compara con un valor determinado que cuando coinciden cambia el estado de uno de los pines de salida PWM, y cuando se reinicia el timer este pin vuelve a cambiar su estado.
Modo Phase Correct PWM: Este modo ofrece una onda PWM de alta resolución, a diferencia del modo Fast PWM, el timer cuenta hacia adelante y hacia atrás antes de hacer el cambio de estado del pin PWM, es decir cuenta de 0 a 255 al llegar a 255 cuenta de 255 a 0, o bteniendo una salida PWM más limpia pero de menor frecuencia.
Desarrollo: Realizar un programa que controle un motor a pasos con la ayuda de la interrupción timer overflow (calcular una frecuencia de paso a 240Hz), el control debe de considerar el encendido y apagado, tener en cuenta que no se debe de energizar ninguna bobina cuando este apagado; en el control también se debe considerar el cambio de giro (a favor y en contra a las manecillas del reloj). Antes de conectar el motor se debe de mostrar la secuencia con ayuda de 4 led. Los puertos a utilizar son definidos por el programador.
Fig. 1 Control de un motor a pasas
Como en las prácticas anteriores se procede a realizar los pasos para poder introducir el código en AVRStudio, quedando de la siguiente forma: Paso1.
.include "m328pdef.inc" ;uso de librería .def paso=R17 ;asignación directa a un solo registro .def paso2=R18 ;asignación directa a un solo registro .def sw=R19
4
-Practica 2: Manejo de Interrupción Timer .org 0x0 rjmp inicio; .org 0x020 jmp int_timer_on inicio: ldi R16, low (ramend) ;carga la parte baja del R16 out SPL, R16; spl=set pointer ldi R16, high (ramend) out SPH, R16 clr R16 out TCCR0A, R16 ldi R16, 0x02 out TCCR0B, R16 ldi R16, 0x01 sts TIMSK0, r16 ldi R16, 0x0F ;set register $FF, para hacer el puerto B de salida out DDRB, R16 ldi R16, 0xFC ;asigno ceros a los 2 primeros bits para declararlos como mis entradas (0b 1111 1100) out DDRD, R16 sei ;interrupción global (flag) habilitada /*ldi paso, 0x1 loop: out portb, paso rcall delay lsr paso cpi paso, 0x10 brne loop ldi paso, 0x1 jmp loop*/ ldi paso, 0x01 ;CHECAR SI NO AFECTA ESTA INSTRUCCIÓN (SI NO SE QUEDA PASO SIEMPRE EN ESTE ESTADO DE ASIGNACIÓN 1) ldi paso2, 0x08 loop: in sw,pind ;asignas sw on/off y sw giro al puerto D sbrc sw,1; salta la siguiente linea si el sw giro no está activado ldi sw,2 ; si hay un 1 en mi sw 1 (giro), asigno el valor dos decimal (10) a mi switch sbrc sw,0 ;salta la siguiente linea si el sw on/off no está activado ldi sw, 1 ; si hay un 1 en mi sw 0 (on/off) asigno el valor de uno decimal ldi sw,0 ;out portb, sw ;SE ESTAN HACIENDO PRUEBAS QUITANDO Y PONIENDO ESTA INSTRUCCIÓN ;out portb, paso ;CHECAR SI LA SALIDA DEL PASO RUMBO A LOS LEDS VA AQUI O AL PRINCIPIO DEL LOOP*/ jmp loop int_timer_on: cpi sw,2 ;si el sw giro esta activado, realizo mi secuencia de giro a la der brne comp_2 out portb, paso lsr paso
5
-Practica 2: Manejo de Interrupción Timer cpi paso,0x10 brne final ldi paso,0x01 comp_2: cpi sw,1 ;si el sw de on esta activado (y además ya verifiqué que sw giro no está activado), realizo mi secuencia de giro a la izq brne comp_3 out portb, paso2 lsl paso2 cpi paso,0x00 brne final ldi paso,0x08 comp_3: ldi paso, 0x00 out portb, paso
final: reti ;realiza un retorno desde una interrupción. La direc. de retorno es cargada desde la pila y el flag de interrupción global está a set. ;Note que el registro de estado no se guarda automáticamente al entrar en una rutina de interrupción, y no se restaura al volver de ;una rutina de la interrupción. .org 0x3C20 jmp int_timer_on
Paso 2. Ya
generado el código, se procede a la simulación con el software de apoyo
Proteus:
Fig. 2. Simulación de control del motor a pasos
Con la ayuda del timer/counter 0, en la configuración fast PWM, realizar el control de intensidad de Luz de un Led ultra-brillante, tener en cuenta las siguientes especificaciones para su control. Voltaje Max 4V, Voltaje Minimo, corriente máxima 20 mA. La intensidad se debe de controlar con dos botones (int - y int +). Paso1.
Se introduce el código en AVRStudio, quedando de la siguiente forma:
6
-Practica 2: Manejo de Interrupción Timer .include "m328Pdef.inc" .def temp= r18 .def paso= r17 .org 0x00 rjmp config config: ldi R16, low (ramend) ;carga la parte baja del R16 out SPL, R16; spl=set pointer ldi R16, high (ramend) out SPH, R16 ldi R16, 0b00000000 out ddrb, temp ser R16 out DDRD, R16 ldi R16, 0b10000011 out TCCR0A, R16 ldi r16, 0b00000010 out TCCR0B, R16 ldi R16, 0b00000010 sts TIMSK0, R16 ldi paso, 3 out OCR0A, paso sei loop: rcall mini sbic pinb,0 rjmp decrementa sbic pinb,1 rjmp incrementa rjmp loop incrementa: ldi temp, 0b00000010 out portb, temp inc paso inc paso inc paso inc paso inc paso inc paso out OCR0A,paso rcall mini rjmp loop decrementa: ldi temp, 0b00000001 out portb, temp dec paso dec paso dec paso dec paso dec paso
7
-Practica 2: Manejo de Interrupción Timer dec paso out OCR0A,paso rcall mini rjmp loop mini: ; ============================= ; delay loop generator ; 1000 cycles: ; ----------------------------; delaying 999 cycles: ;ldi R20, $03 ldi R20, $60 WGLOOP00: ldi R21, $6E WGLOOP11: dec R21 brne WGLOOP11 dec R20 brne WGLOOP00 ; ----------------------------; delaying 1 cycle: nop ; ============================= ret Paso2. Ya
generado el código, se procede a la simulación con el software de apoyo
Proteus:
Fig. 3 Simulación del control de la intensidad de un led
Realizar un generador de frecuencias con la ayuda de la interrupción timer CTC. Este generador debe de tener las frecuencias de las notas musicales como se muestra en la figura, de tal manera que se elabore un pequeño teclado. Este teclado cada vez que se presiones un botón, debe de sonar la nota musical 0.5 segundos, mostrar las frecuencias en un osciloscopio.
8
-Practica 2: Manejo de Interrupción Timer -
Paso.1 Se introduce el código: include"m328Pdef.inc" ;se definen los registros universales .def MASK = r17 .cseg .org 0x0000 ;Vector de interrupciones rjmp DELAY_05S ldi out ldi out
r16, SPL, r16, SPH,
LOW (RAMEND) r16 HIGH (RAMEND) r16
ser out clr out ldi out ldi out ldi sts sei
r16 DDRB, r16 DDRD, r16, TCCR0A, r16, TCCR0B, R16, TIMSK0,
r16
;Salida de datos
R16 ;Entrada de fatos 0b10000011 r16 0b00000010 r16 0b00000010 r16
loop:
DO: RE:
sbic jmp sbic jmp sbic jmp sbic jmp sbic jmp sbic jmp sbic jmp jmp
PIND, DO PIND, RE PIND, MI PIND, FA PIND, SOL PIND, LA PIND, SI FINAL
ldi jmp ldi
r16, SONAR r16,
0b0001 0b0010 0b0011 0b0100 0b0101 0b0110 0b111
239 213
9
-Practica 2: Manejo de Interrupción Timer MI: FA: SOL: LA: SI:
jmp ldi jmp ldi jmp ldi jmp ldi jmp ldi jmp
SONAR r16, SONAR r16, SONAR r16, SONAR r16, SONAR R16, SONAR
SONAR: out ldi rcall ldi FINAL: jmp
190 179 159 142 127
OCR0A, r16 MASK, 1 DELAY_05S MASK, 0 loop
DELAY_05S: com r18 mov r19, MASK and r19, r18 out PORTB, r19 reti
Fig. 4 Simulación tercer ejercicio
10
-Practica 2: Manejo de Interrupción Timer Conclusiones: En la segunda practica se estudio el manejo de la interrupción timer , que es muy util cuando se tiene un conjunto de codigo que se tiene que ejecutar cada determinado tiempo , mientras que en el codigo principal puede seguir ejecutando y cuando se llama a la interrupcion regresa al mismo momento que fue llamado.Tambien se hace el uso de PWM para poder variar la intensidad y frecuencia.
Grande Roldán Carlos
Para esta práctica, pude darme cuenta del uso general de las Interrupciones dentro del lenguaje ensamblador mediante la herramienta de utilización Atmel Studio. Mediante la práctica, al trabajar con el uso del timer en sus diferentes configuraciones como lo son OverFlow, fast PWM o CTC, pude darme cuenta de la utilidad que estas tienen dentro de la programación de nuestro integrado 328P. Sin duda considero que el manejo de estas instrucciones es una parte fundamental que debemos manejar para la programación en AVR. Medina Torres Jael Sebastian
Las interrupciones en el mundo de los microcontroladores son extremadamente útiles y comunmente utilizadas en todo tipo de proyectos. Hacen que el chip esté atento a un particular evento y una vez detectado, detiene su ejecución actual para ejecutar un trozo de código específico. Pueden ser utilizadas para un amplio abanico de cosas como para despertar el microcontrolador Sánchez Mata Mario Israel
En esta práctica se vio que las interrupciones son eventos especiales que se generan interna o externamente en el microcontrolador que pausa momentáneamente la ejecución del programa para realizar una tarea breve, y después volver al punto donde se quedó ejecutando el programa. Esto sirve para que el microcontrolador no este siempre trabajando, por ejemplo, en checar el estado de una entrada constantemente, y solo poner atención cuando el evento deseado ocurre. Tovar Jaimes Daphne María
11