Programación de múltiples ICs usando un único USBasp / SPI Bus y Arduino IDE

2

Hola y gracias por mirar!

Fondo

Después de codificar y diseñar un proyecto con el hardware de Arduino y el IDE, he grabado mi propia PCB con un solo ATMega328 y componentes relacionados para el proyecto en particular. Incluyo en mis tableros un encabezado de seis pines al que he estado conectando un programador genérico de USBasp y luego coloco el IC con el 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 de seis pines USBasp / SPI, pero no tengo ni idea de cómo hacerlo.

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

Pregunta

Utilizando mi single conexión de seis pines USBasp / SPI, ¿cómo puedo flashear varios IC ATMega328 con sus respectivos códigos que he escrito en el IDE de Arduino?

    
pregunta Matt Cashatt

3 respuestas

1

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

    
respondido por el pault
1

Esto no es una cosa fácil de hacer. Tendría que preparar un programador adicional a bordo, 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án respondiendo en paralelo, posiblemente dañando sus búferes de salida MISO y haciendo que sea imposible abordarlos individualmente. La primera vez, mientras se borran todos los AVR, puede salir dejando los pines de restablecimiento en lugar de bajo (ya que el estado predeterminado de las E / S es flotante). Pero eso básicamente rompe con la programación de chips adicionales, a menos que los primeros sepan que deben evitar los pines SPI.

La solución de

pault 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 necesitan ser separadas. El primero para que los AVR esclavos no puedan dañarse entre sí, el segundo para que puedan ser direccionados individualmente.

Ya que necesitas muchas líneas SCK, esto significa que probablemente no puedas usar el puerto SPI para hablar con los dispositivos esclavos; además, necesita el primer SPI para programar incluso el AVR maestro. A su vez, esto significa bitbanging (control por software) los pines de programación, además de reprogramar la interfaz serie, por lo que las modificaciones de programación de firmware 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 esto sea más lento, pero la velocidad rara vez es un problema en chips de este tamaño.

En resumen, normalmente es más fácil poner 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 un chip selecciona o encadenamiento de margarita). JTAG TAP está diseñado de forma similar para el encadenamiento en margarita.

    
respondido por el Yann Vernier
1

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

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 5x bloques de cortocircuito (selectores de puente). Cada selector tiene 3 pines.

  • Pin1 se conecta a la línea RESET_n desde el programador. (_n al final significa que la línea está activa-baja. 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 el controlador_1. Conecte RESET_1_n al programador a través de su selector. Conecte todas las otras líneas de reinicio a GND. Esto pondrá a todos los demás Atmegas en reinicio, 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.

ACTUALIZACIÓN 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 la interfaz JTAG, lo que está solicitando sería fácil. JTAG es la única "bala mágica" para su problema que conozco. (Los otros enfoques son más complicados, aunque este es un problema divertido de ingeniería de sistemas que hay que tener en cuenta).

Al mismo tiempo, para comenzar, confías en el usuario con la reprogramación. Considera confiar en ella con selectores también.

    
respondido por el Nick Alexeev

Lea otras preguntas en las etiquetas