Академический Документы
Профессиональный Документы
Культура Документы
Temario:
Suma OK
Transmite ¿Dónde?
Suma 1000110
Transmite 1010011
Java
Python
(Palabras)
C, Pascal, Fortran
Tiempo de (Palabras) Tiempo de
ejecución desarrollo
Macro Assembler
(Mnemónicos)
Direct Assembler
(Binario o Hexadecimal)
- Diseñado para ser simple y compacto. - Diseñado para proporcionar ALTA confiabilidad.
- Requiere que el programador sea cuidadoso. - Limita al programador para evitar errores.
- No es fácilmente escalable a sistemas muy complejos. - Eficiente para sistemas de alta complejidad.
Idea
Programa
implementado
Este proceso de construcción se encuentra dividido en etapas, y cada etapa del proceso es
llevada a cabo por una herramienta (software) particular.
- Pre-procesador
- Compilador
- Ensamblador
- Enlazador
Es importante recalcar que el editor de texto, a pesar de ser importante para escribir el código
fuente, no se considera parte de la cadena de herramientas para la construcción de un
programa en C.
Por otro lado, al programar un microcontrolador, además hará falta una herramienta para
transferir el código desde la computadora hacia la memoria de programa del
microcontrolador. Esta herramienta, compuesta por software y hardware, se conoce como el
programador.
Microprocesador
(Sistema Operativo)
modulo.o
Microcontrolador
libreria.o configuración
Depurador
Librerías: AVR-LIBC
Incluido en el
Software programador: AVR-DUDE software de
Arduino
Autocompletar
Resaltar
Archivo(s) fuente
1.5.- Pre-Procesador
Verificación de la sintaxis
for
else
if
while
1.5.- Pre-Procesador
Evaluación de directivas
#include
stdio.h
stdint.h Pre-Procesador
math.h
archivo.c archivo.i
1.6.- Compilador
1.6.- Compilador
C Assembly
LDI R16, 3
STS x, R16
x = 3; LDS R17, y
ADD R16, R17
NO depende del z = x + y; STS z, R16 Depende del
hardware hardware
(Estándar) if(z < 5) CPI R16, 5
z = 5 BRSH SIGUE
LDI R16, 5
STS z, R16
SIGUE:
1.6.- Compilador
Unidad de
Archivo fuente traducción
Pre-Procesador Compilador
archivo.c archivo.i
1.6.- Compilador
Compilador
(Compiler)
Compilador cruzado
(Cross compiler)
1.7.- Ensamblador
Objetos reubicables:
file1.o
file2.o
file3.o
file4.o
Encontrar JTAG
errores (Hardware)
Monitoreo
http://www.nongnu.org/avr-libc/
avr/io.h:
Define los nombres de todos los registros de función específica (puertos de entrada salida y
registros de configuración). Asimismo, define nombres para cada bit de cada registro de
función específica (SFR).
util/delay.h:
Proporciona funciones para la generación de retardos por “software”. Las funciones más
empleadas son _delay_us() y _delay_ms().
avr/interrupt.h:
Proporciona macros para facilitar la implementación de rutinas de interrupción. Asimismo,
proporciona macros para la habilitación y deshabilitación de interrupciones.
B0 RB0
Puerto de salida tratado como
un espacio en memoria.
B1 RB1
B2 RB2
.
uint8_t Puerto_B .
.
B7 RB7
Clock
Ejercicio 01:
Conectar cuatro LEDs (con sus respectivas resistencias) a los pines del puerto F. Luego,
implementar un pograma que cuente segundos desde 0 hasta 15. El valor del contador debe
mostrarse en los LEDs en formato binario. Una vez que el programa funcione correctamente,
implementar una función que convierta un número de formato binario a formato Gray (de 4
bits). Finamente, el valor del contador en formato Gray debe ser mostrado en los LEDs.
Utilizar la función _delay_ms() para la generación de los retardos.
Ejercicio 02:
Empleando la función _delay_us(), escribir una función que permita generar una señal PWM
de, aproximadamente, 10KHz. La función debe recibir el duty cycle como parámetro. Verificar
el correcto funcionamiento de la función, midiendo el pin de salida con un osciloscopio. De
no contar con un osciloscopio, conectar el pin a un LED (con su respectiva resistencia) y
verificar que la intensidad de la luz emitida por el LED cambia al modificar el duty cycle.
Ejercicio 03:
Conectar un display de 7 segmentos (cátodo común) al puerto F. Luego, escribir un programa
que cuente segundos desde 0 hasta 9, y que muestre el valor del contador en el display de 7
segmentos. Se recomienda implementar una función “decodificador” y llamarla desde la
función principal. Utilizar la función _delay_ms() para la generación de los retardos.
Usualmente, los microcontroladores cuentan con instrucciones que nos permiten evaluar o
modificar un bit en particular en un registro.
Por un lado, el ATmega2560 cuenta con las instrucciones SBIS, SBIC, SBRS y SBRC para
evaluar un bit en un registro, ya sea un SFR o un GPR. Por otro lado, cuando deseamos
modificar un bit en particular en un SFR, podemos usar las instrucciones SBI o CBI.
Ejemplo:
Microchip → LATBbits.LATB3 = 0 // Fuerza a ‘0’ el bit 3 de LATB
Atmel → PORTB = _BV(5) // Fuerza ‘1’ el bit 5 de PORTB
La desventaja de estas herramientas es que no son estándar (no generan código portable) y
solo funcionan con su respectivo fabricante. Por esta razón, a nivel profesional, la
manipulación de bits se lleva a cabo mediante un método estándar, conocido como
enmascaramiento de bits (bit masking).
b7b6b5b4b3b2b1b0
b1 b1
b7b6b5b4b3b20b0
Modificar bit en la posicion “p”: Modificar bits en las posiciones “p1”, “p2” y “p3”:
mascara_clear = ~(1 << p) mascara_clear = ~((1 << p1) | (1 << p2) | (1 << p3))
mascara_toggle = (1 << p) mascara_toggle = (1 << p1) | (1 << p2) | (1 << p3)
Ejercicio 04:
Conectar un LED a cada uno de los pines del puerto F. Luego, seguir las indicaciones del
profesor para la implementación de 03 secuencias de encendido de los LEDs. Después,
escribir 03 funciones para implementar las secuencias (una función por cada secuencia).
Ejercicio 05:
Conectar 02 pulsadores a los pines PK0 y PK1. Luego, escribir un programa para generar 03
señales de control de un driver para dos motores: IN1, IN2, ENABLE, correspondientes a los
pines PF1, PF3 y PF5. Si solo PK0 se encuentra pulsado, entonces el motor 1 debe rotar; si
solo PK1 se encuentra pulsado, entonces el motor 2 debe rotar; si ambos botones se
encuentran pulsados, entonces ambos motores deben frenar; si ningún boton se encuentra
pulsado, entonces el driver es deshabilitado (los motores quedan “flotantes”).
Ejercicio 06:
Conectar 04 pulsadores a los pines PK0, PK1, PK2 y PK3. Luego, escribir un programa para
controlar las señales de control de un driver para un motor: IN1, IN2, ENABLE,
correspondientes a los pines PF2, PF4 y PF6. Basta con presionar un botón una vez (no
mantener pulsado) para llevar a cabo cada acción: PK0 rota el motor en sentido horario; PK1
rota el motor en sentido anti-horario; PK2 frena el motor; PK3 deshabilita el driver (el motor
queda “flotante”). Se recomienda el uso de una variable “estado” para resolver este ejercicio.
mascara = (1 << p);
RECOMENDACIÓN:
Utilizar la directiva #define para colocar identificadores al emplear máscaras constantes.
Esto ayudará a hacer el código más fácil de leer y escribir.
Ejercicio 07:
Conectar una resistencia pull-down y un pulsador a uno de los pines del microcontrolador, y
un LED a otro. Luego, escribir un programa que encienda el LED mientas el pulsador se
encuentre presionado. Una vez que el programa funcione correctamente, cambiar la
resistencia pull-down por una resistencia pull-up y modificar el código para que el
comportamiento del sistema se mantenga (el LED debe encender mientras el pulsador se
encuentre presionado).
Ejercicio 08:
Conectar dos pulsadores y un LED al microcontrolador. Luego, escribir un programa que
habilite las resistencias pull-up internas de los pines conectados a los pulsadores, y que
encienda el LED solo si los dos pulsadores se encuentran presionados.
Ejercicio 09:
Conectar un pulsador a uno de los pines del microcontrolador, y conectar un LED a otro pin.
Luego, escribir un programa que haga que el pulsador se comporte como un botón ON/OFF:
Si el LED se encuentra apagado, al presionar el pulsador el LED debe encenderse; si el LED
se encuentra encendido, al presionar el pulsador el LED debe apagarse (ver el diagrama de
flujo proporcionado por el profesor como referencia).
5.- PREGUNTAS