22,99 €
Descubra el poder de los microcontroladores AVR Si desea saber por qué los AVR son microcontroladores amigables en la programación y disfrutar de sus ventajas, ha llegado al libro indicado. En él, se adentrará de forma paulatina en los fundamentos y aplicaciones avanzadas de estos potentes dispositivos. Aprenderá a programar en lenguaje ensamblador usando el programa AVR Studio 4, explorando un amplio rango de voltajes de operación y frecuencias de oscilación, junto con una variedad de registros de usuario que facilitan la programación y la experimentación. Además, la lectura de este libro no requiere experiencia previa, ya que cada concepto y procedimiento se desglosa en una guía paso a paso clara y accesible, complementada con circuitos prácticos, secciones de código y tips esenciales para dominar la programación de los AVR. APRENDA: • A programar un microcontrolador AVR. • A usar comandos, operandos, macros y demás cualidades del AVR. CONOZCA: • Algunos circuitos eléctricos empleados en la programación del AVR. • Un diagrama eléctrico de una base multi-AVR para programar varios microcontroladores de Atmel en un mismo módulo-programador. No espere más para desarrollar sus habilidades y poner en práctica proyectos reales, incluyendo códigos y diagramas eléctricos.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 274
Veröffentlichungsjahr: 2024
Curso práctico para programación de AVR. Proyectos completos, código y explicación
Ernesto Paredes Martínez
Derechos reservados © Alfaomega Grupo Editor, S.A. de C.V., México
Primera edición: 2018
ISBN: 978-607-538-095-7
Primera edición: MARCOMBO, S.L. 2024
© 2024 MARCOMBO, S.L.
www.marcombo.com
Cualquier forma de reproducción, distribución, comunicación pública o transformación de esta obra solo puede ser realizada con la autorización de sus titulares, salvo excepción prevista por la ley. Diríjase a CEDRO (Centro Español de Derechos Reprográficos, www.cedro.org) si necesita fotocopiar o escanear algún fragmento de esta obra
ISBN del libro en papel: 978-84-267-3858-5
ISBN del libro electrónico: 978-84-267-3900-1
Producción del ePub: booqlab
Ernesto Paredes Martínez
El autor es doctorado en ciencias, ejerce como catedrático en el Centro de Estudios Superiores Navales (CESNAV) y cuenta con una condecoración militar al Mérito Docente. Fue oficial militar de la misma institución y actualmente imparte cátedras como civil. Ha sido profesor de la asignatura de Microcontroladores AVR durante más de 10 años en diferentes instituciones, por lo que ha impartido otras cátedras de la electrónica como Potencia, Electrónica Digital y Analógica, y Control.
Su principal objetivo al haber elaborado este libro es compartir su experiencia docente y hacer llegar a los estudiantes de todos los niveles, y de varias disciplinas (tanto médicas como tecnológicas), el conocimiento detallado de la programación de AVR con la ayuda de prácticas y proyectos. Con la experiencia docente del doctorado en ciencias Ernesto Paredes, se ha facilitado la comprensión de la programación de AVR, que actualmente está considerada como un gran apoyo tecnológico en el diseño de circuitos electrónicos para proyectos de alto nivel.
Deseo agradecer el apoyo al equipo de Atmel, quienes a través del soporte técnico respondieron dudas sobre la aplicación de algunas funciones usadas en este libro, gracias por los emails y el apoyo incondicional. Especialmente a Y.C. Wang y Vinod PV por la autorización del uso de figuras y cuadros de los manuales PDF de los AVR expuestos en este trabajo, y las capturas del programa AVR Studio 4.15. También un especial agradecimiento a K. Ravi Kiran, Kristian Saxrud Bekken, Prachi Joshi, Sivashankari S., Manoraj Gnanadhas, del equipo de soporte de Atmel, por haberme ayudado con los enlaces y ejemplos de código para el correcto entendimiento de algunas funciones del AVR.
Gracias a Cadence Design Systems, Inc. y a EMA Design Automation, especialmente a Eric Ubiera, por su apoyo y soporte en la edición y autorización de los diagramas eléctricos y figuras presentados en este libro. Sin tu ayuda, Eric, no sería posible la adquisición de la licencia para la elaboración de los diagramas eléctricos. Gracias por la facilidad para adquirir la licencia original del programa OrCAD versión 17.2.
Gracias a Jonathan Westhues por su autorización para usar su programa LDmicro, explicado en este libro en el capítulo 45 “Crear un PLC con AVR”. Jonathan, felicidades por tu estupendo programa.
Gracias a Emerson Williams, de la compañía Hilgraeve, Inc. (www.hilgraeve.com), por el permiso para disponer del programa Hyperterminal, usado en el capítulo 33 “Comunicación entre un AVR y un ordenador”. Excelente programa.
Gracias a Gerhard Schmidt, quien elaboró la “subrutina de división” usada en este trabajo en algunos proyectos; esto facilitó la elaboración de dichas subrutinas. Gracias por conceder el derecho y el privilegio de usar tu subrutina en este libro.
Felicidades a la empresa Arduino por la extraordinaria aportación al mundo AVR con sus tarjetas de desarrollo.
Un agradecimiento a la casa Alfaomega Grupo Editor S.A de C.V., que abrazó este proyecto, en especial al Ing. Francisco Soto Velazco, Lic. Luis Martínez G., doctorado en ciencia Francisco Javier Rodríguez C. y Lic. Minerva Juárez Ibarra.
Agradezco principalmente a Hashem por haber hecho posible crear este sueño y anhelo que implicó tanto esfuerzo.
Una de las convicciones fundamentales de Marcombo y de Alfaomega es que los conocimientos son esenciales en el desempeño profesional, ya que sin ellos es imposible adquirir las habilidades para competir laboralmente. El avance de la ciencia y de la técnica hace necesario actualizar continuamente esos conocimientos, y de acuerdo con esto Marcombo y Alfaomega publican obras actualizadas, con alto rigor científico y técnico, y escritas por los especialistas del área respectiva más destacados.
Consciente del alto nivel competitivo que debe de adquirir el estudiante durante su formación profesional, Marcombo y Alfaomega aportan un fondo editorial que destaca por sus lineamientos pedagógicos, que coadyuvan a desarrollar las competencias requeridas en cada profesión específica.
Además de la estructura pedagógica con la que están diseñados nuestros libros, Marcombo y Alfaomega hacen uso de los medios impresos tradicionales en combinación con las Tecnologías de la Información y la Comunicación (las TIC) para facilitar el aprendizaje. Correspondiente a este concepto de edición, todas nuestras obras tienen su complemento en una página web. En esta edición el lector podrá encontrar las figuras, los diagramas y las tablas a color incluidas en este libro.
Los libros de Marcombo y Alfaomega están diseñados para ser utilizados en los procesos de enseñanza y aprendizaje, y pueden ser usados como textos en diversos cursos o como apoyo para reforzar el desarrollo profesional; de esta forma, Marcomnbo y Alfaomega esperan contribuir a la formación y al desarrollo de profesionales exitosos para el beneficio de la sociedad, y esperan ser su compañera profesional en este viaje de por vida por el mundo del conocimiento.
Para tener acceso al material de la plataforma con contenidos interactivos de este libro siga los siguientes pasos:
1. Ir a la página: http://marcombo.info/
2. Introducir el código AVR24 y sus datos
Tendrá acceso a las imágenes a color que se incluyen en este libro.
NOTA: Se recomienda hacer una copia de seguridad los archivos descargados de la página web en un soporte físico.
Relación de figuras, tablas, registros y diagramas
Introducción
Parte 1
Capítulo 1
Programando
Capítulo 2
Primer programa en AVR (encender un LED)
Capítulo 3
Encabezado
3.1. Directiva .ORG: indica el origen o inicio del programa
3.2. Directiva .CSEG: Code Segment
3.3. Directiva .ESEG: EEPROM Segment
3.4. Directiva .DSEG: Data Segment
3.4.1. Problema en el segmento .DSEG
Capítulo 4
Configuración
4.1. Stack Pointer
Capítulo 5
Cuerpo del programa
5.1. Subrutinas
5.2. Puertos
Capítulo 6
Pull-up y pull-down
Capítulo 7
Ciclo While
Capítulo 8
Programa 2 (botón enciende LED)
Capítulo 9
Programa 3 (puerto bidireccional)
Capítulo 10
Programa 4 (máscara)
Capítulo 11
Programa 5 (subrutina de un segundo)
Capítulo 12
Ciclo For
12.1. Programa 6 (retraso de 1 minuto usando el ciclo For)
Capítulo 13
Debouncer (función antirrebote)
13.1. Programa 7 (Delay_Debouncer)
Capítulo 14
Programa 8 (control de un motor de pasos unipolar)
Capítulo 15
Programa 9 (control de velocidad de un motor CD)
Capítulo 16
Direccionamientos
16.1. Direccionamiento directo de un solo registro
16.2. Direccionamiento directo de dos registros
16.3. Direccionamiento directo de I/O
16.4. Direccionamiento directo de datos
16.5. Direccionamiento indirecto de datos con desplazamiento
16.6. Direccionamiento indirecto de datos
16.7. Direccionamiento indirecto de datos con predecremento
16.8. Direccionamiento indirecto de datos con postincremento
16.9. Direccionamiento a la memoria del programa
16.10. Direccionamiento indirecto a la memoria del programa, IJMP e ICALL
16.11. Direccionamiento relativo a la memoria del programa
Capítulo 17
Instrucciones orientadas al bit
Capítulo 18
Interrupciones
18.1. Programa 10 (encender un LED con una interrupción INT0)
Capítulo 19
Reset entre los AVR
Capítulo 20
Instrucciones del control del MCU
Capítulo 21
Error de Branch out of range
21.1. Branch: saltos a las subrutinas
Capítulo 22
Uso del teclado y display LCD
22.1. Programa 11 (desplegar mensajes en el display LCD)
22.2. Programa 12 (desplegar los caracteres del teclado en el display)
Capítulo 23
Álgebra booleana con AVR
23.1. Programa 13 (ecuación booleana a través de programación AVR)
Capítulo 24
Flip-Flops con AVR
24.1. Programa 14 (Flip-Flop con AVR)
Capítulo 25
Lectura/escritura en EEPROM
25.1. Programa 15 (memorización de un teclado matricial en la EEPROM)
Capítulo 26
Instrucciones Push y Pop
26.1. Push: salvar el valor de un registro en el Stack
26.2. Pop: recuperar el valor de un registro del Stack
26.3. Error en el uso del Stack Pointer con interrupciones
26.4. Error en el uso del Stack Pointer con saltos RCALL
Capítulo 27
Instrucciones ST/STD/STS - LD/LDS
Capítulo 28
PWM
28.1. Control del servomotor
Capítulo 29
Contador de 24 y 32 bits (ascendente y descendente)
Capítulo 30
Expresiones (Expressions)
30.1. Operandos (Operands)
30.2. Operadores (Operators)
30.3. Funciones (Functions)
Capítulo 31
Macros
Capítulo 32
Directivas
32.1. Directiva #DEFINE
32.2. Directiva DEF: establecer una etiqueta en un registro
32.3. Directiva UNDEF: indefinir o “desnombrar” el nombre simbólico de un registro (quitar la etiqueta a un registro)
32.4. Directiva EQU: hacer un símbolo igual que una expresión (asignar un valor a una etiqueta)
32.5. Directiva SET: establece que un símbolo sea igual a una expresión
32.6. Directiva DEVICE
32.7. Directiva CSEGSIZE: tamaño de la memoria del programa (Program Memory Size)
32.8. Directivas IF, ELSE, ENDIF: condicionales (conditional assembly)
32.9. Directivas IFDEF, IFNDEF: condicionales (conditional assembly)
32.10. Directiva ELIF: condicionales (conditional assembly)
32.11. Directiva ERROR: saca la palabra “ERROR” con una cadena de caracteres (string)
32.12. Directiva WARNING: saca la palabra “WARNING” con una cadena de caracteres (string)
32.13. Directiva MESSAGE: saca la palabra “MESSAGE” con una cadena de caracteres (string)
32.14. Directiva EXIT: salirse del archivo
32.15. Directivas LIST – NOLIST: genera un archivo “listfile .lst”
32.16. Directiva LISTMAC: expansión del contenido de una macro
Parte 2
Capítulo 33
Comunicación entre un AVR y un ordenador
Capítulo 34
Comunicación entre los AVR
34.1. Comunicación entre los AVR usando SPI-USI
34.2. Comunicación USI 3-hilos (3-Wire)
34.3. Comunicación entre los AVR usando una comunicación híbrida síncrona
Capítulo 35
Comunicación entre los AVR a distancia
35.1. Comunicación a distancia con una interfaz RS-485
35.2. Comunicación a distancia usando XBEE
Capítulo 36
Generador de un pulso de reloj para una sincronía (Clock Recovery)
36.1. Codificador Manchester
Capítulo 37
Lectura de un convertidor ADC0804 en un display LCD
37.1. Convertidor ADC del ATtiny13
Capítulo 38
Voltímetro digital de 8 bits
Capítulo 39
Sensor de temperatura PT100
39.1. Instrucción de multiplicación MUL
Capítulo 40
Generador de funciones usando un convertidor DAC0800
40.1. Trazador de figuras de dos dimensiones
Capítulo 41
Sensor de proximidad ultrasónico HC-SR04
41.1. Multiplicación de un número de 24 bits por uno de 16 bits
Capítulo 42
Puente de Wheatstone
42.1. Potenciómetro digital
Capítulo 43
Circuito de cruce por cero para un Dimmer 120 VCA
Capítulo 44
Resolución de ecuaciones con AVR
44.1. Raíz cuadrada en AVR
Capítulo 45
Crear un PLC con AVR
Capítulo 46
Tarjeta Programadora Universal
Capítulo 47
Cómo hacer una tarjeta tipo Arduino
47.1. ¿Qué es el Bootloader?
47.2. Partes de la tarjeta Arduino
47.3. Montando nuestra tarjeta tipo Arduino
Palabras finales
Índice analítico
El siguiente listado ha sido tomado de manuales AVR de Atmel y software AVR Studio versión 4.15.
Figuras:
2.1 Seleccionando el nombre y tipo de proyecto
2.2 Escribiendo el nombre del proyecto y la localidad del nuevo programa
2.3 Seleccionando la plataforma y el AVR
2.4 Ventana de programación de AVR Studio 4.0
2.5 Ventana de Processor
2.6 Ventana de Disassembler
2.7 Menú emergente de la sección 4
2.8 Breakpoints en el programa
2.9 Editando el programa en AVR Studio 4.0
2.10 Ventana de ayuda en el uso de AVR Studio, módulos-programadores y conexiones
3.2 Mensaje en la Program Memory sin el uso de la directiva .ORG
3.3 Final de la Program Memory para visualizar el mensaje
3.4 Leyenda de OVER en la ventana de Build
3.5 El valor 0X00 agregado en la memoria del programa
3.6 Ventana de la memoria del programa con los datos de la tabla “MENSAJE”
3.7 Ventana de memoria EEPROM después de editar la tabla “MENSAJE_EEPROM”
3.8 En la sección de mensajes aparece un porcentaje de segmento de EEPROM
3.9 Ventana para cargar los datos EEPROM del archivo .EPP de vuelta a la ventana de EE PROM en el simulador
3.10 En la sección de mensajes aparece un porcentaje de segmento de EEPROM
3.11 Ventana de programación para Flash y EEPROM usando un módulo-programador
3.12 Este es el dato en la dirección 0x70
3.13 Visualización de la dirección 0x150
3.14 Mensaje de UNDER debido al mal uso de la dirección de inicialización del .DSEG
4.1 Vista del Stack Pointer y su configuración el AVR Studio
4.2 Visualización del Stack Pointer en Memory I/O
4.3 Vista del Stack Pointer y su configuración en el AVR Studio. Vista del Data Memory donde aparece el último espacio en memoria correspondiente a $025F
11.1 Ventana del módulo-programador para cambiar la frecuencia de operación del AVR (esta ventana es para Mega8515 pero existe una parecida para el Tiny2313)
11.2 Ventana de simulación para un_segundo
11.3 Ventana emergente para Stop Watch
11.4 Stop Watch en ceros
11.5 Tiempo consumido en Stop Watch
18.2 Pinning donde se muestran las terminales de interrupción externa del ATmega8515
18.3 Bit-I del registro SREG del simulador
18.4 Ventana de estado de interrupción INT0
19.1 Función de Brown-out detection activando Boden (Brown-out entable)
20.1 Activación del Fuse S8515C para el preescalamiento del Watchdog
22.4 Ejemplo de cómo se usa el Bloc de Notas para adjuntar una subrutina grande
26.1 Bloque de memoria de datos donde se observan los caracteres ASCII debido a los cuatro Push
26.2 Sección de monitoreo (Watch) donde se observan los datos ASCII debido a los cuatro Pop
26.3 Submenú para visualizar a “Value”
26.4 Mensaje de error en la ventana de “Message” debido al SP
26.5 Error en el simulador del AVR al ejecutarse “RCALL LEER_TECLADO”
28.1 Salidas OC0, OC1A Y OC1B
32.1 Ventana de Build donde aparece la directiva .ERROR
32.2 Ventana de Build donde aparece la directiva .WARNING
32.3 Ventana de Build donde aparece la directiva .MESSAGE
32.4 El cursor se encuentra en “UNKNOWN OPCODE”
32.5 Ventana para activar la generación del “LIST FILE”Nota: Ventana de solicitud para reensamblar el proyecto cuando se ha escrito algo en el programa mientras se está simulando (p. 266)
36.4 Ventana de configuración de oscilación interna del AVRISP para el ATtiny13
47.1 Secciones de la memoria Flash
47.2 Activación de “Erase device before flash programming y Verify device after programming”
47.3 Activación del fusible BOOTRST
47.4 Pinout del ATmega328p
47.8 Lectura delos fusibles del ATmega328p residente en la tarjeta Arduino UNO Nota: Figuras de los mapeos de memoria (pp. 203 y 204)
Tablas:
18.1 Tabla de los vectores de interrupción del AVR Mega8515
20.1 Instrucciones del control del MCU
20.2 Selector del modo Sleep
20.3 Tiempos de selección el Watchdog
28.1 Configuración para el generador de forma de onda
28.2 Configuración para el modo de salida de OC0
28.3 Configuración para el preescalamiento
30.1 Operadores para AVR
34.1 Relación entre SCK y la frecuencia de oscilación
34.2 Modo de comunicación a 2 o 3-hilos
34.3 Generación del reloj para la comunicación USI
35.1 Tamaño de la palabra para la comunicación UART
35.2 Velocidad de transmisión (BAUD) para 4 MHz y U2X=0
43.1 Preescalamiento para el contador-1
Registros:
Generador de forma de onda (Waverform Generation) (p. 213)
Compare Output Mode, modo rápido PWM (FAST PWM Mode) (p. 214)
Compare Output Mode, modo corrección de fase PWM (Phase Correct PWM Mode) (p. 214)
Selector de Clock Bit (p. 214)
Diagramas:
34.1 Diagrama de bloques de la comunicación SPI del ATmega8515
34.3 Diagrama de bloques de la comunicación entre los AVR
Este libro pretende ayudar al estudiante a iniciarse en la programación de un AVR explicando de forma muy sencilla los pasos a seguir para la configuración y puesta en marcha de este microcontrolador. Se presentarán algunos circuitos prácticos y secciones de código del programa de cada circuito, así como recomendaciones para su correcta programación. Este curso, aunque es práctico, se apoya en las instrucciones más usadas del AVR, así como una matriz de programación avanzada. Quien sea que se guíe con este libro podrá programar un AVR de forma sencilla para una aplicación potente; cabe aclarar que para leer este libro no se necesita experiencia en la programación de un AVR, ya que este trabajo pretende que la información contenida aquí sea accesible para cualquier nivel, para ello se detallarán los pasos a seguir para la correcta programación. La destreza en la programación dependerá del tiempo que el diseñador dedique a la información escrita aquí, así como del tiempo que dedique a la práctica del simulador de AVR Studio.
En el contexto de trabajo, si a un grupo de personas se les solicita solucionar un problema de ingeniería con este microcontrolador, seguramente habrá más de dos formas “lógicas” de resolverlo, ya que cada cual diseñará el código del programa según la forma mental en que visualice la solución; dicho esto, los códigos de programa presentados en este trabajo seguramente se puedan resolver de otra manera, pero no se pretende mostrar al lector una única forma de programación, sino el uso de las instrucciones, comandos, operandos, macros y demás cualidades del AVR. La destreza del programador1, la eficiencia del código, el número de líneas usadas, etcétera, dependerá de la experiencia que vaya adquiriendo el diseñador con la práctica.
Para la elaboración de este libro se usaron principalmente el AVR ATtiny2313 y el AT-mega8515, y el programa gratuito AVR Studio 4.0, el cual puede ser descargado de la página del fabricante (Atmel), así como los diferentes documentos necesarios para su programación. También se anexará, en la parte penúltima del libro, un diagrama eléctrico de una base multi-AVR para programar varios microcontroladores de Atmel en un mismo módulo-programador (MP). Esta base se conecta al MP y puede ser muy práctico al usar programadores AVRISP. Además, se anexan en cada ejemplo y proyecto los diagramas eléctricos editados con el programa Orcad.
¿Por qué AVR?
Dentro de la experiencia docente y de campo, nos hemos encontrado con otros ingenieros que ya han manejado otro tipo de microcontroladores; nosotros tuvimos la oportunidad de utilizar otras marcas diferentes al AVR, y nos encontramos con que este microcontrolador ofrece muchas ventajas: un rango de voltaje de operación amplio, un rango de frecuencia de oscilación (tanto interna como externa) amplio y varios registros de usuario (registros conocidos como de propósito general o de trabajo)2, entre muchas otras cualidades, lo que a nuestro parecer hacen de un AVR un microcontrolador muy agradable en la programación y muy potente en la aplicación. Con esto no pretendemos decir que otras marcas son mejores o peores que la familia de Atmel, cada marca tiene sus bondades, pero en nuestra experiencia sí hemos encontrado un gran beneficio en el AVR; por supuesto, hay colegas que dominan el uso de otra marca de microcontroladores y son expertos y han desarrollado aplicaciones muy importantes y potentes, pero para quienes en todo el mundo ya han usado este microcontrolador coincidirán con nosotros en que es una herramienta potente.
AVR tiene la bondad de ser programado en lenguaje ensamblador y lenguaje C; sin embargo, para este libro se usará solamente lenguaje ensamblador a través del programa AVR Studio 4. Este libro se divide en dos partes, la primera es la explicación de cómo programar un AVR, estructuras y ejemplos; y la segunda parte mostrará la aplicación práctica de un AVR en proyectos reales, incluyendo códigos y diagramas eléctricos.
1 La palabra “programador” que uso en este libro la vinculo a usted, apreciado lector.
2 Aunque en este libro se denominará a los registros como de “usuario” (para facilitar su descripción) distribuidos en dos bancos (registros R0 al R15, y R16 al R31), en los manuales de AVR aparecen como registros de propósito general o registros de trabajo.
Antes de entrar en la sintaxis del programa, es necesario explicar cómo se puede dividir la estructura del programa en un AVR. Dependiendo de la destreza del programador, algunas partes de la estructura podrán tener una posición diferente. La estructura se puede dividir básicamente en cuatro partes (figura 1.1): encabezado, configuración, cuerpo y subrutinas auxiliares (esta estructura tiene una variante que veremos más adelante para introducir otros bloques).
Figura 1.1 Secciones recomendadas para programar un AVR
AVR se configura, se programa y se trabaja con base en registros de 8 bits cada uno (la arquitectura de los AVR que usaremos en este libro es de 8 bits. Ya con los conocimientos adquiridos, podrá migrar a otros AVR). Con los registros de propósito general de 8 bits se pueden hacer arreglos para trabajar datos a 16, 32, 64 y 128 bits.
Primero explicaremos el uso de los registros de propósito general, y después el uso de los registros de configuración. En el manual de cada AVR, en el simulador y en el momento de hacer operaciones, el programador debe visualizar 8 casillas, como se observan a continuación (figura 1.2), con ponderación de derecha a izquierda:
Figura 1.2 Registro de propósito general de 8 bits
Figura 1.3 Registro cargado con $3ª
Los datos se pueden almacenar (cargar) en varias nomenclaturas en los registros de AVR (decimal, hexadecimal, octal, binario, signado, caracteres ASCII). En el siguiente ejemplo se muestra la instrucción LDI(Load immediate)usando el registro R16 (la “coma” siempre se usará en AVR). Existen 32 registros de propósito general o de trabajo (también llamados registros de usuario) divididos en dos bancos, del R0 al R15 y del R16 al R31:
Más adelante se explicarán las diferentes modalidades para cargar un registro AVR y las formas de personalizar los registros. Los dos bancos de registros (del R0 al R15 y del R16 al R31) tienen reglas de uso y restricciones, asimismo, ciertas instrucciones no pueden ser usadas en ambos bancos. La tecla de ayuda F1 del programa AVR Studio indica en la pestaña de Contenido: AVR assembler-instructions todo el SET de instrucciones del AVR (también existen ciertas instrucciones que unos modelos de AVR pueden usar y otros no, como la instrucción de multiplicación MUL).
Aparentemente hablar de limitaciones y restricciones cuando se está empezando a programar AVR parece motivo de preocupación, pero en realidad no lo es, en el momento de editar el código en el AVR Studio, el mismo debugger mostrará si existe un error (ya sea en la sintaxis, o en el uso de alguna instrucción que el modelo de AVR en cuestión no permita), que el usuario podrá corregir. Sugiero empezar a programar con una versión sencilla, como un ATtiny2313, y ya con un poco más de práctica usar una versión Mega como el ATmega8515, y posteriormente el ATmega8535 (en este punto habrá programadores que opinen que es posible usar otro modelo de AVR para empezar a entrenar, sin embargo, estamos seguros de que muchos coincidirán en el uso de estos modelos que proponemos).
Un programador primerizo podrá pensar que usar un AVR cuyos registros son de 8 bits es limitado, sin embargo, esto no es cierto, un AVR de 8 bits es muy potente. El AVR tiene la facilidad de “concatenar” registros para operaciones con más bits (palabras mayores de 8 bits); de hecho, un AVR posee tres registros concatenados diseñados para operaciones con 16 bits, a tales registros se les conoce como registros X, Y y Z. El registro X está formado por los registros R26 y R27, el registro Y por los R28 y R29, y el registro Z por los R30 y R31. A estos registros también se les conoce como registros de apuntador (Pointer-registers), y al ser de 16 bits poseen un byte alto y un byte bajo; así el registro X está compuesto por XL y XH, el registro Y por YL e YH, y el registro Z por ZL y ZH.
Se sugiere que el programador novel empiece por trabajar los registros del R16 al R31. Posteriormente, ya con el desarrollo de este libro, podrá usar los registros del R0 al R15. Para el uso de las instrucciones, el programador podrá hacer uso de la ayuda F1 para revisar ejemplos en su uso y su sintaxis (de las instrucciones) y su interacción con los registros (por ejemplo, cómo usar el registro Z o el R0). Parece que 32 registros de trabajo son más que suficientes para hacer programas complejos; sin embargo, cuando falta práctica en el uso de los registros, en ocasiones el programador novel puede llegar a ocupar todos los registros y le faltará alguno para continuar su aplicación. Si esto llega a ocurrir, existe una solución: se debe analizar el programa para usar registros “redundantes”, es decir, un solo registro puede ser usado en múltiples líneas de código sin que afecte a la aplicación, pero esto se logra a través de la práctica y la observación.
En ocasiones se puede caer en el error de usar registros en retrasos (retardos, delay) que ya fueron usados previamente en otra línea de código, lo que afecta a la correcta operación del retraso. En estos casos, se sugiere reservar registros que serán usados solo para los retrasos, y reservar otros registros para otras líneas de código. En ocasiones, también podemos llegar a tener un error al que llamaremos de “tiempo real”, en donde el programador en su mente, y en el simulador aparentemente, observa que el programa realiza las funciones deseadas; sin embargo, en el momento de descargar el programa en el AVR, las funciones no se ejecutan correctamente o simplemente no funcionan, esto se debe a que el programador debe considerar la frecuencia de operación del AVR y debe sincronizar el tiempo de ejecución del AVR (dependerá de la frecuencia de reloj seleccionada) con el tiempo real. Por ejemplo, si el AVR trabaja a 4 MHz, en el simulador el programador no puede observar las operaciones a esa frecuencia porque está analizando línea por línea, pero en la aplicación el programador debe considerar el “universo” alrededor del AVR en esa frecuencia.
Un caso simple es encender un LED, el cual el programador desea que se encienda y apague a cierta frecuencia (esta sería una frecuencia de operación de AVR), pero debe considerar la frecuencia del ojo humano para poder observar que el LED se prenda y apague (esto sería el tiempo real), si no lo hace, el LED aparentemente estará siempre apagado, cuando en realidad la salida del pin de puerto sí está realizando la función que el programador quiere, y lo puede comprobar conectando un osciloscopio, pero es tan rápido el encendido-apagado que el LED no alcanza a excitarse o el ojo humano no puede percibir cierta frecuencia.
Otro error de tiempo real es cuando en el simulador el programa realiza las funciones deseadas, pero en la aplicación real no, esto es también debido a que el programador debe considerar todos los fenómenos involucrados en el entorno del AVR, dicho de otro modo, debe “pensar” como si fuera el AVR. Aunado a lo anterior, otro error muy común es cuando se programan puertos de salida. El programador debe considerar que debe activar las conexiones internas con el registro DDRX (esto se explicará en la sección de Puertos) para inyectar la corriente necesaria para la salida de un(os) pin(es) de puerto. Al programador novel en ocasiones se le olvida este paso y en el momento de conectar al AVR en la aplicación, simplemente, el pin de puerto programado como salida no excita a la etapa siguiente (aunque en el simulador sí esté operando de forma deseada).
En los ejemplos usados en este libro, el programador podrá observar sugerencias para hacer un “mapeo de registros”, cuáles registros usar para usar los contadores, qué registros utilizar para configurar al AVR, qué registros usar de forma dinámica, etcétera. Recuerde que este libro es una guía para empezar a programar en AVR de forma básica y avanzada, pero dependiendo de la destreza del programador, el uso de registros será a conveniencia de la aplicación. Las sugerencias mostradas en este libro no son casos absolutos, sino simplemente sugerencias.
El programa AVR Studio se puede descargar gratuitamente de la página de Atmel (en la sección de Studio Archive) en la dirección http://www.atmel.com/tools/studioarchive.aspx, donde se puede acceder a versiones anteriores y a la última versión del programa. Para ayuda de otros programadores a nivel mundial, también se puede acceder a foros de discusión y aportación como el de AVR Freaks en la dirección http://www.avrfreaks.net/.
Antes de continuar describiendo las partes que componen un programa para AVR, lo más práctico es escribir uno muy sencillo, y a partir de ahí continuar explicando cada sección para que el lector se familiarice con las explicaciones de forma directa en el programa.
El programa más sencillo que existe es encender un LED, que en este caso será conectado en el pin del puerto B bit4 (PB4) (diagrama 2.1). En el montaje de los circuitos hay que considerar siempre dos aspectos físicos (hardware): el correcto voltaje de alimentación y la terminal de RESET. En este ejercicio, la terminal de RESET está conectada al voltaje VCC de +5 V a través de una resistencia de 1 kΩ (el valor de R puede variar entre 1 kΩ y 4.7 kΩ). En otros ejercicios la terminal de RESET va con un push-button.
Diagrama 2.1 Primer circuito para encender un LED
Aún no se han explicado los registros involucrados en un puerto de AVR para la configuración, ni las partes que involucran la sección de configuración, pero se explicará con detalle cada sección del programa a partir de este ejemplo. El programa se inicializa de la siguiente forma:
A continuación se muestra el uso del programa AVR Studio 4 para la edición y simulación de los programas que serán cargados en el AVR. La primera ventana después de ejecutar la catarina es la que muestra la figura 2.1 donde se debe seleccionar el tipo de proyecto, que en nuestro caso será “Atmel AVR Assembler” (este libro se basará exclusivamente en lenguaje ensamblador) que tiene la forma de rombo rojo (la opción AVR GCC es para lenguaje C). En la casilla de Project name se escribirá el nombre del proyecto al que le pondremos “PROGRAMA_1”. Es importante que el nombre del programa use “guion bajo” en lugar de los “espacios”.
Figura 2.1 Seleccionando el nombre y tipo de proyecto
Deben estar seleccionadas las casillas Create inicial file y Create folder. Y seleccionar en el browser la ruta del programa nuevo (figuras 2.1 y 2.2).
En la web existen muchas páginas donde se pueden obtener proyectos, aplicaciones, fragmentos de código para AVR, en diferentes idiomas como español, inglés, alemán y ruso.
PRECAUCIÓN: Como siempre, se recomienda extrema precaución en la navegación de páginas web en la búsqueda de información para AVR (como cualquier otro tópico), ya que existen algunas que pueden ser de origen desconocido y causar problemas en el ordenador. Si el programador desea mayor seguridad en las páginas web sobre AVR, o más información sobre alguna instrucción o función, consultar directamente la página de Atmel (http://www.atmel.com/) e introducirse en “Soporte técnico (Support>Request Technical>Support>Open a new case)”, y registrar un caso nuevo, a lo cual en un par de días obtendrán una respuesta vía email.
Nota:
En caso de seleccionar el tipo de proyecto para lenguaje C será necesario descargar el programa WinAVR, que se basa en el compilador GCC. El enlace para descargarlo es http://winavr.sourceforge.net/ o https://sourceforge.net/projects/winavr/files/latest/download.
También sugerimos revisar la página http://dybkowski.net/download/winavr-user-manual.html o la comunidad AVR Freaks http://www.avrfreaks.net/, donde podrá encontrar mucha información y ayuda en las plataformas ensamblador y lenguaje C para AVR.
Figura 2.2 Escribiendo el nombre del proyecto y la localidad del nuevo programa
En la columna de la izquierda (figura 2.3) se selecciona la plataforma AVR Simulator en Debug Platform, y en la columna derecha se selecciona el AVR a programar (Device). Aquí hay que tener sumo cuidado en el modelo seleccionado, ya que debe coincidir con la librería que será editada en la sección de encabezado. Pulsamos Finish. Para este programa se usará el AVR ATtiny2313.
Figura 2.3 Seleccionando la plataforma y el AVR
A continuación se abre la siguiente ventana (figura 2.4), donde podemos visualizar seis secciones: 1) la barra de menú, 2) los archivos vinculados del proyecto, 3) la zona de edición, 4) la visualización de las funciones del AVR seleccionado, 5) la sección de simulación y 6) la sección de mensajes y compilación de archivos (Build). En la figura 2.4
