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

3

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

Prototipé la placa con los sensores y un Digispark ( Comenzando , Cargar Bootloader ) como el ADC y la conexión en serie. He fabricado la placa (varias veces) y ahora estoy intentando comunicarme con ella.

He intentado cargar un gestor de arranque a través de ISP (se ha cargado algo) y luego he intentado hablar con él con mi PC con Windows 10 a través de USB:

Antecedentesyintentosactuales

Elobjetivofinalesun"sensor stick" USB conectado a una Raspberry Pi que recopila datos del sensor y los envía a un servidor.

Bootloader

He usado el gestor de arranque micronucleus ( Micronucleus repo ) utilizando AVRDUDE y un Arduino Uno como un ISP desde la terminal. Esto se hace a través de las conexiones de 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 produce:

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.

(Discutiré sobre los fusibles más adelante).

Controladores

He instalado los controladores adecuados para el micronúcleo ( Grabar el cargador de arranque Micronucleus 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 correctos. Estoy usando calculadora de fusibles de engbedded.com para calcular los fusibles correctos, he intentado varios y ninguno ha funcionado. 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

me sale:

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 inicio PWRDWN / RESET: 6 CK / 14 CK + 64 ms; estaba recibiendo el ID de dispositivo de error 0x00000000 y ya no pude ISP un cargador de arranque. De lo contrario lo he mantenido como Int.RC Osc. 8 MHz

Tengo un reloj externo de 16 MHz, pero como dije, la selección del reloj externo pareció bloquear uno.

No he deshabilitado el reinicio.

Controladores USB

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

He intentado seleccionar el controlador por: Actualizar controlador Buscar en mi computadora el software del controlador Permítame seleccionar de una lista de controladores de dispositivos en mi computadora Have Disk ... Browse ... 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ñada 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 utilizo el IDE de Arduino como si fuera un Digispark, no hay dispositivo se reconoce (se agota el tiempo). 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 está en configurar los fusibles, pero no estoy seguro de cuál es la configuración correcta y cómo probarlo.

Contexto

Ahora estoy usando un ATtiny167 en lugar del ATtiny85, por lo que es más parecido al Digispark pro. Sin embargo, utiliza los mismos controladores (controladores de micronúcleos). No he probado otro cargador de arranque para USB y el rango ATtiny ( Optiboot ). No he intentado usar ISP de alto voltaje.

    
pregunta AidenRay

1 respuesta

4

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

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

En segundo lugar, cuando intentaste usar tu cristal externo, usaste la configuración de fusible incorrecta y, de hecho, no habilitaste el cristal. En la calculadora de fusibles empotrados, la opción de reloj para "Ext. Reloj - XTAL1" no se selecciona para usar un cristal externo, requiere que alimente un reloj CMOS / TTL señal en XTAL1. Incidentalmente, seleccionar esto con un cristal conectado a los pines XTAL bloqueará el chip y evitará el ISP debido a la falta de cualquier fuente de reloj.

La solución es utilizar la configuración de fusibles correcta. Deberá seleccionar la opción de reloj para "External Crystal - 8-16MHz" que habilitará los circuitos del oscilador de cristal interno y permitirá que se derive un reloj de su cristal. Desde la calculadora, suponiendo que no hay BOD habilitado (hasta usted si es necesario), y la programación automática habilitada (necesaria para el cargador de arranque), se requieren los siguientes ajustes de fusibles:

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

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

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas