Programación de múltiples circuitos integrados utilizando un solo bus USBasp/SPI y Arduino IDE

¡Hola y gracias por mirar!

Fondo

Después de codificar y diseñar un proyecto con el hardware e IDE de Arduino, grabé mi propia PCB con un solo ATMega328 y componentes relacionados para el proyecto en particular. Incluyo en mis placas un encabezado de seis pines al que he estado conectando un programador USBasp genérico y luego actualizo el IC con un nuevo código escrito en el IDE de Arduino.

Todo esto funciona muy bien.

Problema

Ahora estoy construyendo un circuito más avanzado que requiere cinco circuitos integrados ATMega328, cada uno con su propio código que es diferente al código de los otros circuitos integrados . Necesito poder flashear los cinco circuitos integrados desde la única conexión USBasp/SPI de seis pines, pero no tengo ni idea de cómo.

Me doy cuenta de que sería más fácil usar un solo IC con más pines, pero esa no es una opción por ahora.

Pregunta

Usando mi única conexión USBasp/SPI de seis pines, ¿cómo puedo flashear varios circuitos integrados ATMega328 con su código respectivo que he escrito en el IDE de Arduino?

Respuestas (3)

Tomaría el firmware USBAsp y lo modificaría para ejecutarlo en otro chip AVR en su placa que manipularía las líneas de reinicio de cada uno de sus cinco Atmegas objetivo individualmente. Necesitará encontrar una forma de seleccionar qué objetivo programar. Si está utilizando AVRDUDE como su programador, puede usar su "-x extended_param" para esto.

Esto no es una cosa fácil de hacer. Tendría que preparar un programador incorporado adicional, así como un código para comunicarse con él; es posible que esto se haya hecho antes, pero no lo he visto.

La solución de Nick Alexeev sería correcta si el nivel de selección en el pin de reinicio fuera diferente del nivel de programación, pero son idénticos en la programación en serie de bajo voltaje, que es el método predeterminado. Esto significa que los AVR terminarían respondiendo en paralelo, posiblemente dañando sus búferes de salida MISO y haciendo imposible abordarlos individualmente. La primera vez, mientras se borran todos los AVR, puede salirse con la suya dejando los pines de reinicio altos en lugar de bajos (ya que el estado predeterminado de las E/S es flotante). Pero eso básicamente falla en la programación de más chips, a menos que los primeros sepan evitar los pines SPI.

la solución de paul está más cerca, pero en realidad no es suficiente para manipular las líneas de reinicio individualmente (aunque obviamente el AVR maestro necesita el suyo propio); son las líneas MISO y SCK las que deben separarse. El primero para que los AVR esclavos no se dañen entre sí, el segundo para que puedan ser direccionados individualmente.

Dado que necesita muchas líneas SCK, esto significa que probablemente no pueda usar el puerto SPI para comunicarse con los dispositivos esclavos; además, necesita el primer SPI para incluso programar el AVR maestro. Eso a su vez significa bitbanging (controlar por software) los pines de programación, además de reprogramar la interfaz serial, por lo que las modificaciones del firmware de programación son notables.

Una opción es usar algún tipo de chip extensor de E/S en lugar del AVR maestro, y dejar que el host haga el bitbanging a través de él. Es probable que sea más lento, pero la velocidad rara vez es un problema en chips de este tamaño.

En resumen, generalmente es más fácil colocar un conector ICSP por AVR. Atmel simplemente no diseñó el protocolo ICSP para varios chips, aunque muchos otros chips SPI lo admiten (a través de selecciones de chips o conexión en cadena). JTAG TAP está diseñado de manera similar para la conexión en cadena.

Descargo de responsabilidad: no he hecho esto con Arduino o Atmega. Pero he hecho esto con PIC.

Sinopsis: conecte las líneas SPI en paralelo, trate las líneas RESET_n por separado. Como escribiste, tu nuevo esquema tendrá 5x Atmegas. Agregue a su esquema bloques de cortocircuito 5x (selectores de puente). Cada selector tiene 3 pines.

  • Pin1 va conectado a la línea RESET_n del programador. ( _n al final significa que la línea es baja activa. Hay algunas notaciones comunes para "baja activa", esta es solo una de ellas).
  • Pin2 va a RESET_X_n, donde X es un controlador individual. La línea RESET_X_n tendría una resistencia pullup como una línea de reinicio normal.
  • Pin3 va a GND.

Supongamos que desea programar controller_1. Conectar RESET_1_n al programador a través de su selector. Conecte todas las demás líneas de reinicio a GND. Esto reiniciará todos los demás Atmegas, harán flotar los pines, que llegaron a las líneas SPI, y no interferirán con la programación del controlador_1 [editar: asegúrese de leer el comentario de Yann Vernier a continuación y su respuesta en este hilo ]. Elimine todos los bloques de cortocircuito para ejecutar su sistema.

ACTUALIZAR en respuesta al comentario de Matthew

"simplemente conecte el programador USB y luego envíe el código [a varios controladores]"

Si puede obtener un controlador con interfaz JTAG, lo que está pidiendo sería fácil. JTAG es la única "bala mágica" para su problema que yo sepa. (Los otros enfoques son más complicados, aunque este es un problema divertido de ingeniería de sistemas para darle vueltas en la cabeza).

Al mismo tiempo, para empezar, confía en el usuario con la reprogramación. Considere confiarle también los selectores.

Gracias Nick, esto suena genial. Sin embargo, esperaba que esto pudiera hacerse sin el uso de puentes para que el usuario final pudiera simplemente conectar el programador USB y luego enviar el código. ¿No es esto posible? Gracias de nuevo.
Mantener los otros AVR reiniciados habilitará sus puertos de programación, por lo que no harán flotar los pines. Debe tenerlos funcionando y no habilitar los pines de programación para la salida en ese caso. Alternativamente, configure cada uno para deshabilitar la programación de bajo voltaje para que haya una diferencia entre los voltajes de reinicio y de programación.
@YannVernier El esquema con programación de bajo voltaje, que estás describiendo, es lo que tenía en mente. (Esto es lo que he hecho con los PIC, consulte el descargo de responsabilidad anterior).