Top Banner
Programación de Arduino en lenguaje ensamblador
28

Programación de Arduino en lenguaje ensamblador

Nov 20, 2021

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Programación de Arduino en lenguaje ensamblador

Programación de Arduino en lenguaje ensamblador

Page 2: Programación de Arduino en lenguaje ensamblador

Indice

● Introducción● Consideraciones iniciales● Herramientas

– AVR-GCC● avr-as● avr-ld● avr-objcopy

– AVRDude

● Detalles de arquitectura y lenguaje– Correspondencia pines/puertos

– Definición de puertos

● Ejemplo: Blink

Page 3: Programación de Arduino en lenguaje ensamblador

Introducción

● Arduino– Plataforma de placas de desarrollo

– Hardware Libre

– Basada en microcontroladores AVR

– Incluye una serie de herramientas y librerías para hacer mas fácil su programación

– Su lenguaje de programación principal es C++

Page 4: Programación de Arduino en lenguaje ensamblador

Consideraciones iniciales

● Placa de desarrollo: Arduino UNO R3– Microcontrolador: Atmega 328p

● Sistema Operativo: GNU/Linux● Herramientas a usar:

– Ensamblador/linkador: AVR-GCC

– Cargador: AVRDude

Page 5: Programación de Arduino en lenguaje ensamblador

AVR-GCC

● Colección de herramientas de GCC para programación de microcontroladores AVR, para línea de comandos

● Incluye las herramientas:– Avr-as: ensamblador

– Avr-ld: linkador

– Avr-objcopy: conversor de formatos binarios

Page 6: Programación de Arduino en lenguaje ensamblador

AVR-GCC: avr-as

● Herramienta de ensamblado de GCC para microcontroladores AVR– Genera el fichero objeto a partir del código

ensamblador

● Sintaxis:– Similar a la sintaxis de GCC

avr-as -mmcu=[modelo_microcontrolador] -o [nombre_fich_objeto] [nombre_fich_ensamblador]

– En nuestro caso, el modelo de microcontrolador es “atmega328p”

Page 7: Programación de Arduino en lenguaje ensamblador

AVR-GCC: avr-ld

● Linkador de GCC para microcontroladores AVR● Recibe el fichero objeto y realiza el linkado

– Fichero de salida: binario elf

● Sintaxis:

avr-ld -o [nombre_fich_elf] [nombre_fich_obj]

Page 8: Programación de Arduino en lenguaje ensamblador

AVR-GCC: avr-objcopy

● Conversor de formatos binarios● La programación de microcontroladores AVR se

realiza con ficheros de formato .hex– avr-objcopy nos permite convertir los binarios de

formato elf a formato .hex, para su posterior grabación con avrdude

● Sintaxis:

avr-objcopy -O ihex -R .eeprom [fichero_elf] [fichero_hex]

Page 9: Programación de Arduino en lenguaje ensamblador

AVRDude

● Programador● Carga el programa hexadecimal en el

microcontrolador● Sintaxis:

avrdude -C /etc/avrdude.conf -p [modelo_microcontrolador] -c arduino -P /dev/ttyACM0 -b 115200 -D -U flash:w:[fichero_hex]:i

Page 10: Programación de Arduino en lenguaje ensamblador

Detalles de arquitectura y lenguajeCorrespondencia pines/puertos

● Nos basaremos en el esquema de conexionado de la pagina oficial: https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf

Page 11: Programación de Arduino en lenguaje ensamblador

Detalles de arquitectura y lenguajeCorrespondencia pines/puertos

Pines de la placa

Conexiones microcontrolador

Page 12: Programación de Arduino en lenguaje ensamblador

Detalles de arquitectura y lenguajeCorrespondencia pines/puertos

● El ATMega328p incluye 3 puertos, de entre 5 y 8 conexiones cada uno

– Puerto B (PB): ● 5 conexiones digitales, correspondientes a los pines 8-13 de la placa● 1 conexión de tierra (GND)● 1 conexión AREF● 2 pines suplementarios, SCL y SDA

– Puerto C: Conexiones analógicas, correspondientes a los pines A0-A5 de la placa

– Puerto D (PD): Conexiones digitales, correspondientes a los pines 0-7 de la placa

● También incluye otras conexiones para alimentación, tierras, reset y reloj

Page 13: Programación de Arduino en lenguaje ensamblador

Detalles de arquitectura y lenguajeDefinición de puertos

● Cada puerto de la placa está asociado a una registro mapeado en memoria principal

– PORTX: registro de lectura/escritura del puerto

– DDRX: registro de definición del puerto

● Las conexiones de cada puerto se definen en DDRX como un vector de 8 bits, en el que cada bit representa una conexión

– Para activar una conexión, ponemos su posición del vector a 1

Page 14: Programación de Arduino en lenguaje ensamblador

Detalles de arquitectura y lenguajeDefinición de puertos

● Ejemplo: activación de la conexión 2 del puerto B, PB2

– Como el puerto B solo tiene 6 conexiones, quedan 2 conexiones sin usar

– En DDRB, escribimos el vector de bits con la posición 2 puesta a 1

● El valor en hexadecimal sería 0x04

DDRB

0 0 0 0 0 1 0 0

Sin usar

Sin usar

PB5 PB4 PB3 PB2 PB1 PB0

Page 15: Programación de Arduino en lenguaje ensamblador

Detalles de arquitectura y lenguajeDefinición de puertos

● Nos basaremos en el juego de instrucciones de AVR:

http://www.atmel.com/images/Atmel-0856-AVR-Instruction-Set-Manual.pdf

● Para leer y escribir en los puertos y registros de E/S, usamos las instrucciones IN y OUT

– IN reg, [origen]

– OUT [destino], reg

● IN lee el contenido de la entrada y lo guarda en un registro

● OUT escribe el contenido del registro en la salida

Page 16: Programación de Arduino en lenguaje ensamblador

Detalles de arquitectura y lenguajeDefinición de puertos

● En el ejemplo anterior, queríamos activar la conexión PB2

– Tenemos que escribir en el registro DDRB, el vector de bits 00000100 o, en hexadecimal, 0x04

– Usaremos la instrucción OUT● Como OUT no permite asignar valores de forma directa, cargaremos el vector de bits en un

registro: en este caso el 16

Con todo esto, las instrucciones a ejecutar serían:

LDI r16, 0x04

OUT DDRB, r16

● Si quisiéramos escribir algún dato en el puerto, la instrucción seria igual pero cambiando DDRB por PORTB

OUT PORTB, r16

– El dato saldría por la conexión activa del puerto, en este caso por la 2

Page 17: Programación de Arduino en lenguaje ensamblador

Ejemplo: Blink

● Produce el parpadeo de un led– Intervalos de 1 segundo

– Led conectado al pin 12 de la placa● Pin 12 = Puerto B, conexión 5 (PB4)

– DDRB ← 00010000

● El fichero de código tendrá por nombre “simple_led_blink.s”

Page 18: Programación de Arduino en lenguaje ensamblador

Ejemplo: Blink

● Código

Page 19: Programación de Arduino en lenguaje ensamblador

Ejemplo: Blink

● Código desglosado

Nombramos los puertos con las direcciones de memoria asociados a ellos

Escribimos el vector de bits de los pines en el registro asociado al puerto B

Inicializamos memoria y registros

Programa en bucle a ejecutar por el microcontrolador

Indicamos dirección de inicio del programa

Escribimos en el puerto de salida el bit previamente invertido

Page 20: Programación de Arduino en lenguaje ensamblador

Ejemplo: Blink

● Código

Programa

Inicializamos contadores

Page 21: Programación de Arduino en lenguaje ensamblador

Ejemplo: Blink

● Programación del programa en la placa, desde linea de comandos– Ensamblado del código

● avr-as -g -mmcu=atmega328p -o simple_led_blink.o simple_led_blink.s

● avr-ld -o simple_led_blink.elf simple_led_blink.o● avr-objcopy -O ihex -R .eeprom simple_led_blink.elf

simple_led_blink.hex

– Carga en la placa● avrdude -C /etc/avrdude.conf -p atmega328p -c arduino -P

/dev/ttyACM0 \ -b 115200 -D -U flash:w:simple_led_blink.hex:i

Page 22: Programación de Arduino en lenguaje ensamblador

Ejemplo: BlinkModificaciones

● Basándonos en este código podemos realizar varios cambios

– Si quisiéramos cambiar el pin de salida, tendríamos que fijarnos en estas lineas

ldi r16,0x10 ; set port bits to output mode

out DDRB,r16

En este caso, la conexión asignada es la PB4, correspondiente al pin 12 de la placa

● Podríamos cambiarlo al pin 13 (PB5), simplemente desplazando un bit

ldi r16,0x20 ; set port bits to output mode

Page 23: Programación de Arduino en lenguaje ensamblador

Ejemplo: BlinkModificaciones

● Hay pines de la placa que no están en el puerto B, como los pines 0-7.

– Para ver las direcciones de memoria de los puertos tenemos que fijarnos las directivas .equ, situadas al principio del programa

– Los pines 0-7 se encuentran en el puerto D, PD, que no tenemos definido en nuestro ejemplo

– Mirando otros ejemplos como éste: https://gist.github.com/mhitza/8a4608f4dfdec20d3879 vemos que sus posiciones en memoria son

● PORTD = 0x0b● PIND = 0x09● DDRD = 0x0a

– Las añadimos al inicio del programa con las lineas

.equ PORTD, 0x0b

.equ PIND, 0x09

.equ DDRD, 0x0a

Page 24: Programación de Arduino en lenguaje ensamblador

Ejemplo: BlinkModificaciones

● Una vez añadidos los direccionamientos del Puerto D, modificamos el código para adaptarlo al nuevo pin

– Vamos a usar el Pin 2 de la placa, correspondiente al PD2● DDRD ← 00000100 = 0x04

● Buscamos las siguientes lineas

ldi r16,0x10 ; set port bits to output mode

out DDRB,r16

● Y las modificamos de la siguiente forma:

ldi r16,0x04 ; set port bits to output mode

out DDRD,r16

Page 25: Programación de Arduino en lenguaje ensamblador

Ejemplo: BlinkModificaciones

● El código quedaría así:

Añadido puerto D

Cambiado a conexión 2

Cambiado a DDRD

Cambiado a PORTD

Page 26: Programación de Arduino en lenguaje ensamblador

Ejemplo: BlinkModificaciones

● Otro cambio que podemos hacer es reducir el periodo de encendido del led

– Para ello buscamos la etiqueta wait: y miramos las siguientes lineas:

ldi r16,0x40 ; loop 0x400000 times

ldi r17,0x00 ; ~12 million cycles

ldi r18,0x00 ; ~0.7s at 16Mhz

– Actualmente, el periodo esta definido en 0x400000 iteraciones (0x40), lo cual equivale a 1 segundo

● Cambiando ese valor, podremos establecer un nuevo periodo de encendido– Si quisiéramos cambiar el periodo a la mitad, cambiaríamos la primera

linea así:

ldi r16,0x20 ;

Page 27: Programación de Arduino en lenguaje ensamblador

Conclusiones

● Existen muchas herramientas para programar dispositivos AVR

– La colección AVR-GCC provee un entorno muy bueno para programación de este tipo de dispositivos desde GNU/Linux

● Ventajas: Muy ligero, y compatible con la mayoría de distribuciones GNU/Linux

● Desventajas: Interfaz de linea de comandos

● El juego de instrucciones de AVR es bastante similar al de otros microcontroladores, como los PIC

– Los esquematicos de hardware libre, y el tener una placa real, facilita mucho la programación y prototipado

Page 28: Programación de Arduino en lenguaje ensamblador

Enlaces de interés

● Esquema de conexionado Arduino UNO R3: https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf

● Native Assembler Programming on Arduino: https://www.cypherpunk.at/2014/09/native-assembler-programming-on-arduino/

● Programming Arduino UNO in assembly: https://gist.github.com/mhitza/8a4608f4dfdec20d3879

● Juego de instrucciones AVR

http://www.atmel.com/images/Atmel-0856-AVR-Instruction-Set-Manual.pdf