Curso práctico para programación de AVR - Ernesto Paredes Martínez - E-Book

Curso práctico para programación de AVR E-Book

Ernesto Paredes Martínez

0,0
22,99 €

-100%
Sammeln Sie Punkte in unserem Gutscheinprogramm und kaufen Sie E-Books und Hörbücher mit bis zu 100% Rabatt.
Mehr erfahren.
Beschreibung

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:

Android
iOS
von Legimi
zertifizierten E-Readern

Seitenzahl: 274

Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



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

Acerca del autor

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.

Agradecimientos

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.

Mensaje del editor

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.

Plataforma con contenidos interactivos

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.

Contenido

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

Relación de figuras, tablas, registros y diagramas

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

Introducción

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.

1 AVR

Programando

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/.

2 AVR

Primer programa en AVR (encender un LED)

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