Académique Documents
Professionnel Documents
Culture Documents
Temario:
– Ciclo de instrucción
– Señal de reloj del sistema
– Duración de un segmento de programa
– Definición de retardo
– Implementación manual de rutinas de retardo
– Generación automática de rutinas de retardo
– Aplicación: Comunicación serial
En la primera parte de nuestro curso, vimos que el ciclo de una instrucción está compuesto
por diferentes pasos, los cuales pueden agruparse en dos etapas generales: búsqueda y
ejecución. Estas etapas requieren de tiempo para poder completarse. El tiempo requerido
para que el ciclo de una instrucción se complete puede expresarse en ciclos máquina o en
ciclos de reloj. Lo más común es expresar el ciclo de instrucción en ciclos de reloj.
Una computadora es un sistema digital síncrono y, por lo tanto, requiere de una señal de reloj
que sincronice el funcionamiento de todo el sistema.
Para obtener esta señal de reloj, el método más directo es emplear una señal de reloj
externa: leer la señal cuadrada generada por un circuito integrado, el cual está especialmente
diseñado para funcionar como fuente de reloj.
(a) (b)
Resonador
pasivo
Esto quiere decir que la frecuencia de reloj para nuestro microcontrolador es de 16 MHz y,
por lo tanto, un ciclo de reloj tiene una duración de 62.5 ns.
Con esta nueva información puede saberse, con aceptable precisión, el ttiempo que le tomará
a nuestro microcontrolador ejecutar una instrucción.
Ejemplo 01:
Con ayuda de la hoja de epecificaciones (datasheet) del Atmega2560, calcular el tiempo que
le tomará al microcontrolador ejecutar todas las instrucciones de la sub-rutina mostrada.
Ejemplo 02:
Con ayuda de la hoja de epecificaciones (datasheet) del Atmega2560, calcular el tiempo que
le tomará al microcontrolador ejecutar todas las instrucciones de la sub-rutina mostrada.
RET → 5 c.i.
TIEMPO: 15.66 ms
El término retardo (delay en Inglés) es usado para referirnos a un periodo de tiempo que una
computadora espera antes iniciar o continuar un procedimiento.
Los retardos son muy importantes en diversas aplicaciones de la vida cotidiana. Por ejemplo:
un semáforo aplica un retardo de varios segundos antes de cambiar de color; un motor
trifásico, al momento del arranque, requiere de un retardo para hacer un cambio de conexión
delta/estrella; al transmitir una señal serial, es necesario que cada bit de información se
mantenga en ‘1’ ó ‘0’ durante el tiempo correspondiente al ancho del bit.
Por otro lado, en el ámbito educativo, es muy común implementar los retardos mediante sub-
rutinas (también conocidos como retardos por software). Estas sub-rutinas (o funciones) se
encargan de “gastar tiempo” hasta que transcurra el periodo deseado.
Para implementar estos retardos con una precisión aceptable, es necesario escribir las sub-
rutinas de manera sistemática.
De los ejemplos vistos anteriormente, podemos deducir que una sub-rutina de retardo está
compuesta por 02 partes: inicialización de contadores y bucles anidados
DELAY:
LDI R16, CONTA1 ; 1
BUCLE_1: LDI R17, CONTA2 ; 1
BUCLE_2: NOP ; 1
.
. → El BUCLE_2 incluye “n” instrucciones NOP
.
NOP ; 1
DEC R17 ; 1
BRNE BUCLE_2 ; 1 ó 2
DEC R16 ; 1
BRNE BUCLE_1 ; 1 ó 2
RET ; 5
De la descripción anterior, se concluye que lo que debe calcularse es el valor inicial de los
registros contadores CONTA1 y CONTA2. Adicionalmente, debe calcularse la cantidad n de
instrucciones NOP que se incluirán.
T1 = (n + 3)CONTA2 – 1
Donde:
Ejemplo 03:
Emplear las ecuaciones descritas anteriormente para implementar una sub-rutina de retardo
de 500 us.
T1 + 4 = 7995 / CONTA1
529 = (n + 3)CONTA2 – 1
DELAY_500US:
LDI R16, 15
BUCLE_1: LDI R17, 106
BUCLE_2: NOP
NOP
DEC R17
BRNE BUCLE_2
DEC R16
BRNE BUCLE_1
RET
Ejercicio 01:
Escribir un programa para generar una señal cuadrada de frecuencia 1 Khz, a través de uno
de los pines del PUERTO F del microcontrolador. Implementar una sub-rutina de retardo de
500us para llevar a cabo esta tarea. Medir con un osciloscopio la salida generada, para
verificar el correcto funcionamiento del programa.
Ejercicio 02:
Escribir un programa que encienda, de manera permanente, el LED conectado a PB7. Luego,
modificar el programa para transmitir una señal cuadrada de 10KHz a través de PB7.
Implementar una sub-rutina de retardo de 50us para llevar a cabo esta tarea ¿Se nota algún
cambio en la intensidad del brillo del LED?. Medir con un osciloscopio la salida generada.
Ejercicio 03:
Modificar el programa del ejercicio anterior: Implementar sub-rutinas de retardo de 20us,
40us, 60us y 80us. Luego, emular una señal PWM de frecuencia 10KHz (periodo 100us) a
través de PB7. Probar diferentes ciclos de trabajo: 20%, 40%, 60% y 80% ¿Se nota algún
cambio en la intensidad del brillo del LED? Medir con un osciloscopio la salida generada.
Ejercicio 04:
Conectar 08 LEDs al PUERTO F del microcontrolador. Luego, escribir un programa que
cuente segundos desde 0 hasta 15 y que muestre el valor de la cuenta (en formato binario)
en los LEDs. Una vez que se hayan contado 15 segundos, el contador debe volver a 0 y
empezar la cuenta nuevamente.
Ejercicio 05:
Conectar 08 LEDs al PUERTO F. Luego, escribir un programa que encienda los LEDs, uno a
la vez, empezando por el LED en la posición 0 hasta el LED en la posición 7. Después de
haber encendido el LED en la posición 7, volver a iniciar con el LED en la posición 0. El
intervalo de tiempo entre el encendido de un LED y otro debe ser de 500ms.
Ejercicio 06:
Conectar 08 LEDs al PUERTO F. Luego, escribir un programa que haga que los LEDs en las
posiciones 0, 1, 2 y 3 parpadeen cada medio segundo, y que los LEDs en las posiciones 4, 5,
6 y 7 parpadeen cada segundo.
Hace 15 años:
En la actualidad:
3.6.- Bit-banging
100us
3.6.- Bit-banging
Ejercicio 07:
Escribir un programa que transmita la señal correspondiente al caracter ‘U’, en formato RS-
232 (con niveles 0V y 5V), con una tasa de transferencia de 9600 bps (bits por segundo).
Transmitir el caracter cada 10ms, mediante uno de los pines del PUERTO F y medir la salida
con un osciloscopio.
Ejercicio 08:
Modificar el programa anterior para transmitir la señal por el pin 1 del PUERTO E. Asimismo,
modificar el programa para transmitir el caracter ‘U’ cada segundo. Luego, ingresar al IDE de
Arduino y activar la terminal serial (no olvide configurar la tasa de transferencia a 9600 bps).
Verifique que la computadora recibe el caracter ‘U’ cada segundo.
Ejercicio 09:
Escribir un programa que almacene un caracter cualquiera en la memoria SRAM, y que llame
a una sub-rutina TX_BYTE que permita transmitir este caracter en formato RS-232. Transmitir
el caracter cada segundo. Verificar su funcionamiento en la terminal serial.
NOTA: Antes de utilizar el pin PE1 como salida, asegúrese de almacenar (con STS) el valor 0
en el registro UCSR0B al inicio del código (el Arduino Mega 2560 requiere hacer esto).
4.- PREGUNTAS