¿Ensamblaje de AVR en Arduino a través de USB?

3

Di que quería aprender AVR ASM, y tuve un arduino.

Ahora sé que puedes programar el ensamblaje en el arduino, pero hay una manera de hacerlo a través de USB. Supongo que solo escribiría el ensamblaje normal y lo haría a través de avr-dude, pero ¿me falta algo o necesito un programador en serie para hacerlo con éxito?

me estoy perdiendo algo? ¿O debería ser tan fácil como dije anteriormente?

Creo que he oído hablar de usar el ensamblaje "en línea" ... pero, ¿qué tan diferente sería esto de escribir ASM directamente al AVR?

    
pregunta

6 respuestas

2

Puede usar AVRA (ensamblador AVR) en Linux para desarrollar su programa de lenguaje ensamblador en Linux. Estoy en Linux y libre tanto como en beer & libertad de uso.

Planee usar AVRDUDE (también gratis, ambos contextos anteriores) para grabar en su código objeto. Lo he usado en Linux.

Planee usar otro Arduino (barato - gratis como en código abierto) como programador. He utilizado un aquí y documentado. En mi artículo, descargo un gestor de arranque a un nuevo ATmegaxx, en su lugar puedes grabar en tu propio programa. Lo hice todo a través de USB (como pediste).

Definitivamente, puedes usar un Arduino basado en USB o RBBB + cable USB para programar tu Arduino objetivo mediante USB. RBBB es de hecho una utilidad Arduino que he usado en ese rol.

En general, para usar mi solución, tendría que usar otro programador u otro Arduino barato como RBBB . También he revisado RBBB en mi otra publicación .

Otra forma para programar tu Arduino con otro Arduino.

Programación de su Arduino usando un programador USB de terceros.

    
respondido por el Chetan Bhargava
3

Es muy simple. Usa el estudio Avr para escribir el código en ensamblador y compilarlo. Luego alimente el archivo hex al software XLoader para cargarlo en el arduino a través de USB como lo hace en el IDE de Arduino. No hay necesidad de ningún quemador / programador extra.

    
respondido por el 0xakhil
2

El cambio de C al ensamblaje no requiere ningún cambio en el método de carga del objeto binario final en el chip.

Si pudo cargar los bocetos de Arduino en la placa a través del USB, entonces también puede cargar programas C de código abierto y programas en lenguaje ensamblador.

Todo lo que necesita es una cadena de herramientas que producirá imágenes binarias apropiadas para usar con avrdude.

Para un programa C de metal puro, puede hacer esto utilizando la copia de avr-gcc ya instalada por el IDE de Arduino, y podría valer la pena leer las guías para hacerlo como un primer paso. Luego, alternativamente, puede asignar archivos de lenguaje de ensamblaje avr-gcc (.s) en lugar de archivos de origen C.

EDITAR: para aclarar: los programas metálicos "simples" no impiden retener un cargador de arranque de estilo Arduino, a menos que configure sus asignaciones de direcciones de la cadena de herramientas para producir un código que desee sobrescribir el cargador de arranque y use una herramienta de programación (/ opciones de herramienta ) dispuesto a sobrescribirlo. Unos segundos después del arranque, el gestor de arranque transfiere el control a su programa y permanece completamente fuera del camino, solo espacio de reclamo de "datos" pasivos en un extremo de la memoria flash, hasta el próximo reinicio.

    
respondido por el Chris Stratton
2

Recomiendo el ensamblador en línea en C. El gcc-avr con el que ya está creando bocetos le permite escribir el ensamblador con marcadores de posición para los nombres de registro. El compilador de C luego asigna los registros durante su paso de optimización. Usted obtiene la conveniencia de C y el control, donde lo necesite, del ensamblador. No hay nuevas herramientas para instalar, y el proceso de desarrollo de Arduino USB no cambia.

    
respondido por el user3213669
1

El problema es que sin Arduino BootLoader no hay soporte directo para el USB, para cargar. Incluso el Arduino BootLoader necesita ser cargado inicialmente. Esto se hace normalmente utilizando la conexión ICSP. Puede utilizar varios programadores de ICSP baratos, como USBtinyISP , que se pueden encontrar muy baratos. Si miras lo suficientemente duro.

O como se mencionó anteriormente, incluso puedes usar otro Arduino como ArduinoISP o el RBBB mencionado anteriormente para hacer esto.

Alternativamente, puede simplemente codificar el Ensamblaje en línea con los Bocetos de Arduino:

Playground

__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t");

o avr-libc

asm("in %[retval], %[port]" :
[retval] "=r" (value) :
[port] "I" (_SFR_IO_ADDR(PORTD)) );

Para que pueda probar su código de ensamblaje y directamente en Arduino

    
respondido por el mpflaga
1

Encontré su pregunta al intentar hacer exactamente lo mismo: programe una placa Arduino existente en un ensamblaje AVR puro sin tener que usar ningún hardware adicional. Terminé descubriendo cómo hacerlo por mi cuenta, por lo que quiero compartir mi respuesta que cualquiera debería poder reutilizar en Windows.

Primero, descargue Atmel Studio . Estoy usando la versión 6.1. Esto le permitirá compilar el código de ensamblaje AVR que escribe en un archivo .hex que se escribirá en el microcontrolador en la placa Arduino. Mi tablero Arduino es un Arduino Uno que usa el chip ATmega328P, así que selecciónelo al crear un nuevo proyecto en Atmel Studio.

Si eres como yo e intentas aprender el ensamblaje de AVR, es probable que también quieras el Conjunto de instrucciones AVR de 8 bits guía que le indica qué instrucciones puede usar en el ATmega328P.

Aquí está el código que uso para obtener un LED parpadeante en Arduino en ensamblaje puro:

/*
 * Get an LED blinking on the ATmega328 (Arduino)
 * On Arduino, pin 13 has an on-board LED which blinks. Pin 13 should map to PB5 (SCK/PCINT5) on the MCU.
 */ 

 .ORG   0x0000                  // Tells the next instruction to be written
 RJMP   main                    // State that the program begins at the main label

 main:
 LDI    r16, 0xFF               // Load the immedate value 0xFF (all bits 1) into register 16
 OUT    DDRB, r16               // Set Data Direction Register B to output for all pins

 loop:
 SBI    PortB, 5                // Set the 5th bit in PortB. (i.e. turn on the LED)
 RCALL  delay_05
 CBI    PortB, 5                // Clear the 5th bit in PortB. (i.e. turn off the LED)
 RCALL  delay_05
 RJMP   loop                    // Loop again

 // Everything beneath is part of the delay loop
 delay_05:
 LDI    r16, 8

 outer_loop:
 LDI    r24, low(3037)
 LDI    r25, high(3037)

 delay_loop:
 ADIW   r24, 1
 BRNE   delay_loop
 DEC    r16
 BRNE   outer_loop
 RET

Localice el archivo .hex que Atmel Studio crea cuando compila el código anterior. El mío está en C:\Users\John\Documents\Atmel Studio.1\AssemblerApplication1\AssemblerApplication1\Debug .

El IDE de Arduino usa AVRdude para enviar los programas que escribes en C a la placa Arduino. Puede ver esto activando la salida detallada en el IDE de Arduino y observando lo que sucede en el registro. Encontré que usar la misma versión de AVRdude que instala el IDE de Arduino funciona bien. Aquí está el comando para cargar su programa en su Arduino:

"C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude" -C avrdude.conf -v -p atmega328p -c arduino -P \.\COM5 -b 115200 -D -U flash:w:compiled-code.hex:i

Deberá usar un comando diferente si AVRdude se instala en un lugar diferente. También deberá encontrar su copia de avrdude.conf y copiarla (junto con el archivo .hex de la carpeta Debug anterior) en la carpeta desde la que ejecutará el comando anterior. Es mejor activar la salida detallada en el IDE de Arduino y verificar el comando correcto para usted. (Por ejemplo, su Arduino podría no estar conectado a través de COM5.)

Puede leer más acerca de las opciones utilizadas por AVRdude en Tutorial AVR de ladyada . Las instrucciones anteriores no funcionarán si aún no tiene un Arduino trabajando con el IDE de Arduino; en otras palabras, el cargador de arranque Arduino ya debe estar en su chip ATmega328. Esto no sobrescribirá el cargador de arranque, y puede cambiar fácilmente el uso de este método de programación para usar el IDE de Arduino sin dolores de cabeza.

    
respondido por el John

Lea otras preguntas en las etiquetas