El programa unificado y la interfaz de depuración (UPDI) es una interfaz de un cable para programar / depurar los nuevos microcontroladores Atmel de 8 bits, reemplazando la interfaz PDI de dos cables utilizada para programar los microcontroladores AVR XMEGA.
Entonces, llegó el regimiento de los protocolos Atmelovsk: ISP, JTAG, debugWIRE, TPI, aWire, PDI, ahora aquí está UPDI. Al mismo tiempo, la situación del ecosistema en AVR todavía es muy desesperada, por lo que íbamos a abandonar por completo su uso, pero la última tendencia nos complació un poco, por lo tanto, este artículo fue escrito.
Solo los afortunados propietarios del programador Atmel ICE pueden usar el protocolo UPDI, que no es muy conveniente de usar debido a la elección bastante extraña del conector, y no es tan barato permitirse comprarlo a escala industrial. Además, requiere la instalación de Atmel Studio, que periódicamente se niega a trabajar con él, porque de acuerdo con la política de nuestra empresa, la mayoría de las computadoras no tienen acceso a Internet, y el estudio rastrea periódicamente allí para los controladores o para algunas bibliotecas, como resultado hubo momentos en que el programador era visible en el sistema, es decir, los controladores se instalaron correctamente, pero el estudio no lo notó hasta que obtuvo acceso a la red y no se actualizó por la fuerza.
Por lo tanto, inmediatamente después de comenzar a usar el nuevo y bastante conveniente microcontrolador ATTiny1616 en nuestros desarrollos (sobre sus ventajas más adelante), había una necesidad de una herramienta que pudiéramos usar para escribir en el controlador del gestor de arranque primario en producción. Por supuesto, sin
SMS y registro de acceso a Internet.
Después de un poco de búsqueda, descubrí el proyecto pyupdi en
Github (https://github.com/mraardvark/pyupdi), una implementación del protocolo UPDI en Python, y esta implementación se basa en el protocolo UART habitual, excepto sin convertidores de nivel, que, de hecho, aún más conveniente, porque le permite usar chips convertidores FTDI estándar o sus homólogos chinos CH340 / 341.
El proyecto fue descargado y probado, las cosas salieron bastante alegremente. Pero después de un par de días quedó claro que todavía no nos quedaba bien. Razones:
- es necesaria la instalación de Python y todo un grupo de paquetes (les recuerdo que estamos hablando de computadoras sin acceso a Internet), tuve que descargar e instalar manualmente casi una docena de paquetes diferentes que se unieron entre sí con dependencias. Sí, en principio, puedes hacer un archivo ejecutable en otra computadora desde un script Python, esto de alguna manera resolvió el problema, pero la lista de problemas no terminó ahí
- casi no hay verificación de errores en el script, cualquier error termina con una interrupción que indica un grupo de archivos que se vinculan entre sí, lo que para el personal ordinario no parece muy claro
- Es imposible leer el contenido del controlador
- no hay forma de leer fusible
- la velocidad del script deja mucho que desear, se escriben 16 kb durante casi un minuto, esto se debe a la ausencia de optimización durante la transferencia, todo se basa en tiempos ajustados
- falta de indicación del proceso de grabación
- el proyecto no admite varios procesadores que podrían admitir
- el proyecto está medio muerto y no responde a las solicitudes
Los problemas se resolvieron durante algún tiempo dentro del marco de Python, pero después de cualquier solución tuve que volver a ensamblar el proyecto, probarlo, de modo que hubiera un deseo de reescribir el script en algo más familiar y rápido, es decir, en C. Somos embebadores, después de todo!
Ahora brevemente sobre las ventajas de la nueva serie 1 de tinyAVR:
- unificación real de periféricos y espacio de direcciones dentro de 2 kb a 32 kb
- configuración conveniente del cargador de arranque (¡al comienzo de la memoria!)
- simplificación significativa del algoritmo ISP (Programación en el sistema)
- transición a la arquitectura von Neumann
- memoria flash de hasta 32 kb en un paquete pequeño (3x3 mm) con 24 pines, de los cuales hasta 22 (!) pueden usarse como IO
- La presencia de un oscilador interno a 16/20 MHz
- Menos dependencia del rendimiento en la configuración de los fusibles (AVR cefalea perpetua)
- Excelente parte analógica para un controlador pequeño (ADC / DAC / comparadores con la posibilidad de conmutación tanto interna como externa de entradas / salidas)
- programación y depuración de un solo cable
- precio de venta extremadamente bajo (desde 0.6 € por 16 kb)
Como parte del programador, tomamos el convertidor USB-UART TTL disponible basado en el chip CH340 chino, así:

Para la programación, es suficiente conectar sus dos salidas RX y TX, ya que ya están equipadas con una resistencia de salida de 1.5k, si no hay una resistencia en su modelo de convertidor, entonces necesita agregarla. La salida combinada está conectada al pin UPDI en un chip programable; la tierra del convertidor también debe estar conectada a la tierra del controlador. Si tiene alimentación externa, solo debe prestar atención a si corresponde a la potencia que utiliza el convertidor (3.3V o 5V). Si es necesario, puede alimentar el circuito con el controlador y desde el convertidor, lo que puede ser muy conveniente para la programación inicial.
Atencion La resistencia es opcional, debe soldarse solo si su convertidor no tiene resistencias protectoras en la salida.
El único problema que está asociado con el chip CH340 es que no funcionó en mi versión de Linux del programa, porque el bit de paridad se usa en el protocolo de programación, y el controlador CH340 en mi versión de kernel no funciona correctamente con este bit. Quizás el problema se solucionará en el futuro cercano, hasta ahora no he tenido la paciencia para hacer esto.
Como resultado del trabajo y los experimentos, el programa
updiprog fue escrito y depurado en el IDE Code :: Blocks,
cuyos códigos fuente se publicaron en Github .
Lo que se implementó en esta versión del programa:
- Se agregó la capacidad de leer el contenido de la memoria flash del controlador en un archivo hexadecimal
- Se agregó la capacidad de leer el estado de todos los fusibles del controlador
- siempre que sea posible, manejo de errores agregado con los mensajes correspondientes
- Indicación adicional del proceso de escritura / lectura
- Velocidad significativamente mayor (aproximadamente 6 segundos para leer 16 kb)
- Soporte agregado para todos los microcontroladores de la Serie 1
El tamaño inicial del programa es de aproximadamente 25 kb, en comparación con 5 kopecks para el script de Python fuente compilado.
Espero que el trabajo realizado sea útil para alguien. Estaría encantado de comentarios y sugerencias.