Cómo escribir un cargador de arranque y controladores para ATtiny167

Estoy usando un chip ATtiny167 Atmel en una placa PCB personalizada que he diseñado.

Hice un prototipo de la placa con los sensores y un Digispark ( Getting going , Upload Bootloader ) como ADC y conexión serial. He fabricado la placa (varias veces) y ahora estoy tratando de comunicarme con ella.

Intenté cargar un cargador de arranque a través de ISP (algo se cargó) y luego intenté hablar con mi PC con Windows 10 a través de USB:

Tablero de águila de diseño de PCBEsquema de águila de diseño de PCB

Antecedentes e intentos actuales

El objetivo final es una "memoria de sensor" USB conectada a una Raspberry Pi que recopila datos del sensor y los envía a un servidor.

cargador de arranque

He usado el gestor de arranque de micronúcleos ( Micronucleus repo ) usando AVRDUDE y un Arduino Uno como ISP desde la terminal. Esto se hace a través de conexiones de pines pogo en la PCB (MISO, MOSI, RESET, SCK, VCC y GND).

El gestor de arranque se carga correctamente:

C:\Program Files (x86)\Arduino\hardware\tools\avr\bin>avrdude -c stk500v1 -p attiny167 -P com6 -U lfuse:r:-:i -v -C avrdude.conf -b 19200

que salidas:

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e9487 (probably t167)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "ProBootloaderR2.hex"
avrdude: writing flash (16384 bytes):

Writing | ################################################## | 100% 0.03s

avrdude: 16384 bytes of flash written
avrdude: verifying flash memory against ProBootloaderR2.hex:
avrdude: load data flash data from input file ProBootloaderR2.hex:
avrdude: input file ProBootloaderR2.hex contains 16384 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.03s

avrdude: verifying ...
avrdude: 16384 bytes of flash verified

avrdude: safemode: Fuses OK (E:FE, H:DF, L:62)

avrdude done.  Thank you.

(Hablaré de los fusibles más adelante).

Conductores

He instalado los controladores apropiados para el micronúcleo ( Grabar el cargador de arranque Micronúcleo para usar ATtiny85 a través de usb (avrdude) (probado con un Digispark en mi PC).

fusibles

No estoy seguro de si los fusibles que he seleccionado son los correctos. Estoy usando la calculadora de fusibles de engbedded.com para calcular los fusibles correctos, probé varios y ninguno funcionó. No seleccionar el fusible (dejarlo por defecto) parece no dar errores.

Cuando leo desde el cargador de arranque usando el comando

avrdude -c stk500v1 -p attiny167 -P com6 -U lfuse:r:-:i -v -C avrdude.conf -b 19200

Yo obtengo:

avrdude: Version 6.3, compiled on Dec 16 2016 at 13:33:19
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "avrdude.conf"

         Using Port                    : com6
         Using Programmer              : stk500v1
         Overriding Baud Rate          : 19200
         AVR Part                      : ATtiny167
         Chip Erase delay              : 1000 us
         PAGEL                         : P00
         BS2                           : P00
         RESET disposition             : possible i/o
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    10     4    0 no        512    4      0  4000  4500 0xff 0xff
           flash         65    10    64    0 yes     16384  128    128  4500  4500 0xff 0xff
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel STK500 Version 1.x firmware
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.06s

avrdude: Device signature = 0x1e9487 (probably t167)
avrdude: safemode: hfuse reads as DF
avrdude: safemode: efuse reads as FE
avrdude: reading lfuse memory:

Reading | ################################################## | 100% 0.03s

avrdude: writing output file "<stdout>"
:01000000629D
:00000001FF

avrdude: safemode: hfuse reads as DF
avrdude: safemode: efuse reads as FE
avrdude: safemode: Fuses OK (E:FE, H:DF, L:62)

avrdude done.  Thank you.

Cuando seleccioné Ext. Reloj – XTAL1; Tiempo de arranque PWRDWN/RESET: 6 CK/14 CK + 64 ms; Estaba recibiendo el ID de dispositivo de error 0x00000000 y ya no podía ISP un gestor de arranque. De lo contrario, lo he mantenido como Int.RC Osc. 8 MHz

Tengo un reloj externo de 16 MHz, pero como dije, seleccionar el reloj externo parecía un ladrillo.

No he desactivado el reinicio.

Controladores USB

Cuando conecto el dispositivo a mi computadora en el puerto USB (COM6), aparece "Dispositivo USB no reconocido". El controlador (en el Administrador de dispositivos) es "Dispositivo USB desconocido (Error en la solicitud del descriptor del dispositivo)".

Intenté seleccionar el controlador: Actualizar controladorBuscar software de controlador en mi computadoraDéjame elegir de una lista de controladores de dispositivo en mi computadoraUtilizar disco…Explorar… y luego intenté seleccionar el archivo .inf apropiado:

“La carpeta que especificó no contiene un controlador de software compatible para su dispositivo. Si la carpeta contiene un controlador, asegúrese de que esté diseñado para funcionar con Windows para sistemas basados ​​en x64”.

También seleccioné el archivo que contiene los controladores apropiados, pero recibo el error "Windows ha determinado que el software del controlador para su dispositivo está actualizado". Y cuando se utiliza el IDE de Arduino como lo haría con un Digispark, no se reconoce ningún dispositivo (tiempo de espera). He probado los mismos controladores en otras máquinas con Windows, con los mismos resultados.


¿Qué estoy haciendo mal y cómo puedo solucionarlo?

Creo que el problema es configurar los fusibles, pero no estoy seguro de qué configuración es correcta y cómo probarla.

Contexto

Ahora uso un ATtiny167 en lugar de un ATtiny85, por lo que se parece más al Digispark pro. Sin embargo, utiliza los mismos controladores (controladores de micronúcleo). No he probado otro bootloader para USB y la gama ATtiny ( Optiboot ). No he intentado usar ISP de alto voltaje.

Si está utilizando el cargador de arranque de micronúcleo precompilado para el t167, debe usar un cristal externo de 16 MHz.
Usar valores de fusible aleatorios no lo ayudará. Para cristal externo de 16 MHz, sin BOD y con autoprogramación habilitada, debe usar: Low=0xFF, High=DF, Extended=FE.
"Ext. Clock – XTAL1" no es una selección para usar un cristal externo, requiere que ingrese una señal de reloj CMOS/TTL en XTAL1, por lo que no es de extrañar que esté bloqueado ya que ya no hay reloj disponible (el ISP requiere un reloj para funcionar ).
Usé la configuración de fusibles que sugeriste y funcionó de inmediato. ¡Gracias! Los controladores estaban bien, solo mis fusibles estaban escritos incorrectamente. Gracias por la explicación.

Respuestas (1)

Después de leer su pregunta y de haber revisado el depósito de micronúcleos, su problema se reduce a fusibles/relojes.

En primer lugar, y aunque no es inmediatamente obvio (no está documentado en ninguna parte excepto en el código), el cargador de arranque de micronúcleo ATTiny167 requiere una fuente de reloj externa de 16 MHz para funcionar. Está utilizando el oscilador interno de 8 MHz que no permitirá que el cargador de arranque funcione a la frecuencia correcta y, por lo tanto, la emulación USB fallará.

En segundo lugar, cuando trató de usar su cristal externo, usó la configuración de fusible incorrecta y, de hecho, no estaba habilitando el cristal. En la calculadora de fusibles incorporados, la opción de reloj para "Ext. Clock – XTAL1" no selecciona usar un cristal externo, requiere que ingrese una señal de reloj CMOS/TTL en XTAL1. Por cierto, seleccionar esto con un cristal conectado a los pines XTAL bloqueará el chip y evitará el ISP debido a la falta de una fuente de reloj.

La solución es utilizar la configuración de fusibles correcta. Deberá seleccionar la opción de reloj para " Cristal externo - 8-16 MHz" que habilitará el circuito del oscilador de cristal interno y permitirá derivar un reloj de su cristal. Desde la calculadora, suponiendo que no esté habilitado el BOD (depende de usted si es necesario) y que la autoprogramación esté habilitada (necesaria para el gestor de arranque), se requieren las siguientes configuraciones de fusibles:

  • Bajo:0xFF
  • Alto:0xDF
  • Extendido:0xFE

Una vez que habilite la fuente de reloj de 16 MHz, su gestor de arranque debería funcionar correctamente suponiendo que no haya otros problemas de hardware.

Gracias Tom, excelente respuesta y funcionó de inmediato. Dado que mi reloj entraba en las líneas XTAL, asumí que eso lo habilitaba, pero usted explicó por qué estaba mal. ¿Dónde sería un buen lugar para documentar que el pequeño micronúcleo requiere un reloj de 16 MHz?