Caricare bootloader e firmware su ATMEGA32A

Come accennato nell’articolo riguardante l’installazione di un bootloader per l’aggiornamento di un microcontrollore mi cimenterò nella suddetta operazione al fine di disporre di bootloader su un ATMEGA32A acquistato in versione completamente blank ossia privo di qualsiasi software pre installato.

Il microcontrollore da dotare di bootloader è l’ATMEGA32A-PU (trovate qui tutti i dettagli): un microcontrollore disponibile in diversi package (40 pin pdip nel mio caso) piuttosto noto ed usato in diverso ambiti tra i quali controller per tastiere meccaniche/custom.

Questa operazione richiede tipicamente l’uso di un programmatore ovvero di apposito dispositivo atto all’aggiornamento del firmware del microcontrollore. Per i microcontrollori della famiglia ATmel AVR di ATmel / Microchip si utilizza in genere USBASP (come questo o questo) quindi un dispositivo facilmente reperibile e poco costoso. In rete si trovano anche dei video tutorial (come questo) che mostrano tutte le operazioni da effettuare.

Documentandomi ho però scoperto che è possibile effettuare questa operazione anche senza acquistare un programmatore ma utilizzando semplicemente Arduino UNO R3 e pochi componenti elettronici aggiuntivi. In sostanza è possibile impostare Arduino in modalità ISP ovvero trasformarlo in un programmatore per microcontrollori della serie AVR. In rete sono disponibili diversi tutorial che parlano di questo argomento (questo uno dei più famosi) ma sembra sia possibile anche effettuare l’operazione usando solamente Arduino e nessun altro componente esterno! Questo mi ha incuriosito molto ed è poco documentato : nei forum viene blandamente descritto come fattibile e tanto è bastato per destare la mia curiosità.

Disclaimer

ATTENZIONE! Le operazione descritte in seguito vengono effettuate sotto vostra, e solo vostra, specifica responsabilità! Quindi, se danneggiate qualcosa o vi esplode la casa non ritenetemi responsabile di nulla. Scherzi a parte: le operazioni non sono dannose per nessuno dei componenti usati se fatte con precisione. Mi raccomando attenzione nell’usare l’esatta tipologia di materiale descritto. Nel dubbio meglio controllare i collegamenti più una volta in più.

Materiale richiesto

Impostare Arduino in modalità ISP

La prima operazione consiste nell’impostare Arduino in modalità ISP in modo da predisporlo per l’utilizzo come interfaccia di programmazione:

  1. Collegare Arduino al PC
  2. Attivare Arduino IDE e verificare dal menu Tools > Board che la scheda impostata sia Arduino UNO.
  3. Da Tools > Port verificare che sia settata una porta di comunicazione : questa parte dipende dal sistema operativo, in genere viene identificata automaticamente e proposta quindi basta selezionarla.
  4. Da File > Examples caricare lo sketch ArduinoISP e trasferirlo ad Arduino col tasto Upload

ultimata l’operazione si può disconnettere Arduino dal PC e chiudere l’IDE.

Predisporre Arduino IDE per l’utilizzo con ATMEGA32A

Lo scopo dell’operazione è rendere visibile ATMEGA32A come scheda utilizzabile in Arduino IDE v.2.0.3. Per fare questo si può utilizzare il core esterno MightyCore che comprende buona parte dei microcontrollori della famiglia ATMEGA. Da File > Preferences cliccare sul tasto alla fine di Additional Boards Manager URLs ed aggiungere

https://mcudude.github.io/MightyCore/package_MCUdude_MightyCore_index.json

poi da Tools > Board > Boards manager… cercare ed installare il pacchetto MightyCore. Completata l’operazione nel menu Tools > Board dovrebbe comparire il sotto menu MightyCore con l’ATMEGA32.

Collegare Arduino con ATMEGA32A

Le connessioni tra Arduino e l’ATMEGA32A sono le seguenti:

  • – pin 10 e 30 di ATMEGA32A a 5V di Arduino
  • – pin 11 e 31 di ATMEGA32A a GND di Arduino
  • – pin 6 (MOSI) di ATMEGA32A al pin 11 di Arduino
  • – pin 7 (MISO) di ATMEGA32A al pin 12 di Arduino
  • – pin 8 (SCK) di ATMEGA32A al pin 13 di Arduino
  • – pin 9 (RESET) di ATMEGA32A al pin 10 di Arduino

Caricare il bootloader su ATMEGA32A

Collegare Arduino al PC con l’apposito caso. Dal menu Tools > Port selezionate la porta che vi viene proposta. Da menu Tools > Board > MightyCore selezionare ATMEGA32. Impostate Tools > Programmer a “Arduino as ISP”. Impostate Tools > Clock a Internal 1 Mhz ed infine fate partire l’upload da Tools > Burn Bootloader. Se tutto va come deve nella console di Output di Arduino Ide dovrebbe comparire quanto segue:

avrdude: Version 7.1-arduino.1
         Copyright the AVRDUDE authors;
         see https://github.com/avrdudes/avrdude/blob/main/AUTHORS

         System wide configuration file is /home/pinguino/.arduino15/packages/MightyCore/hardware/avr/2.2.1/avrdude.conf
         User configuration file is /home/pinguino/.avrduderc
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/ttyACM0
         Using Programmer              : stk500v1
         Overriding Baud Rate          : 19200
         AVR Part                      : ATmega32
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PA0
         RESET disposition             : possible i/o
         RETRY pulse                   : SCK
         Serial program mode           : yes
         Parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                           Block Poll               Page                       Polled
           Memory Type Alias    Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom                  4    10    64    0 no       1024    4      0  9000  9000 0xff 0xff
           flash                  33     6    64    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse                   0     0     0    0 no          1    1      0  2000  2000 0x00 0x00
           hfuse                   0     0     0    0 no          1    1      0  2000  2000 0x00 0x00
           lock                    0     0     0    0 no          1    1      0  2000  2000 0x00 0x00
           signature               0     0     0    0 no          3    1      0     0     0 0x00 0x00
           calibration             0     0     0    0 no          4    1      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
avrdude: device signature = 0x1e9502 (probably m32)
avrdude: erasing chip
avrdude: reading input file 0xff for lock
         with 1 byte in 1 section within [0, 0]
avrdude: writing 1 byte lock ...
avrdude: 1 byte of lock written
avrdude: verifying lock memory against 0xff
avrdude: 1 byte of lock verified
avrdude do_op() warning: skipping -U efuse:... as memory not defined for part ATmega32
avrdude: reading input file 0b11010110 for hfuse
         with 1 byte in 1 section within [0, 0]
avrdude: writing 1 byte hfuse ...
avrdude: 1 byte of hfuse written
avrdude: verifying hfuse memory against 0b11010110
avrdude: 1 byte of hfuse verified
avrdude: reading input file 0b10100001 for lfuse
         with 1 byte in 1 section within [0, 0]
avrdude: writing 1 byte lfuse ...
avrdude: 1 byte of lfuse written
avrdude: verifying lfuse memory against 0b10100001
avrdude: 1 byte of lfuse verified

avrdude done.  Thank you.


avrdude: Version 7.1-arduino.1
         Copyright the AVRDUDE authors;
         see https://github.com/avrdudes/avrdude/blob/main/AUTHORS

         System wide configuration file is /home/pinguino/.arduino15/packages/MightyCore/hardware/avr/2.2.1/avrdude.conf
         User configuration file is /home/pinguino/.avrduderc
         User configuration file does not exist or is not a regular file, skipping

         Using Port                    : /dev/ttyACM0
         Using Programmer              : stk500v1
         Overriding Baud Rate          : 19200
         AVR Part                      : ATmega32
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PA0
         RESET disposition             : possible i/o
         RETRY pulse                   : SCK
         Serial program mode           : yes
         Parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                           Block Poll               Page                       Polled
           Memory Type Alias    Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom                  4    10    64    0 no       1024    4      0  9000  9000 0xff 0xff
           flash                  33     6    64    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse                   0     0     0    0 no          1    1      0  2000  2000 0x00 0x00
           hfuse                   0     0     0    0 no          1    1      0  2000  2000 0x00 0x00
           lock                    0     0     0    0 no          1    1      0  2000  2000 0x00 0x00
           signature               0     0     0    0 no          3    1      0     0     0 0x00 0x00
           calibration             0     0     0    0 no          4    1      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
avrdude: device signature = 0x1e9502 (probably m32)
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 /home/pinguino/.arduino15/packages/MightyCore/hardware/avr/2.2.1/bootloaders/optiboot_flash/bootloaders/atmega32/1000000L/optiboot_flash_atmega32_UART0_9600_1000000L_B0.hex for flash
         with 454 bytes in 2 sections within [0x7e00, 0x7fff]
         using 4 pages and 58 pad bytes
avrdude: writing 454 bytes flash ...

Writing | ################################################## | 100% 0.08s

avrdude: 454 bytes of flash written
avrdude: verifying flash memory against /home/pinguino/.arduino15/packages/MightyCore/hardware/avr/2.2.1/bootloaders/optiboot_flash/bootloaders/atmega32/1000000L/optiboot_flash_atmega32_UART0_9600_1000000L_B0.hex

Reading | ################################################## | 100% 0.00s

avrdude: 454 bytes of flash verified
avrdude: reading input file 0xcf for lock
         with 1 byte in 1 section within [0, 0]
avrdude: writing 1 byte lock ...
avrdude: 1 byte of lock written
avrdude: verifying lock memory against 0xcf
avrdude: 1 byte of lock verified

avrdude done.  Thank you.

Testare il funzionamento

La presenza del bootloader sull’ATMEGA32A implica che è ora possibile aggiornare il firmware tramite l’interfaccia USB predisponendo il dispositivo in modalità DFU. La versione in oggetto non dispone dell’interfaccia USB onboard ma in genere questo controllore viene montato su PCB che ne dispongono (es. una dei tanti kit DIY per tastiere meccaniche/custom come questa ). Non avendo sottomano uno di questi kit e volendo simulare l’operazione è teoricamente possibile dotare di un’interfaccia USB il nostro ATMEGA32A mediante V-USB e quindi usare un semplice FTDI ovvero un’interfaccia seriale USB to UART che potete facilmente procuravi sui vari store (come ad esempio questo). Quest’ultima modalità non è affatto banale da implementare e non è neanche detto che funzioni : potrebbe essere un esperimento interessante su cui scrivere in futuro.

Caricare un bootloader su ATMEGA32A usando Arduino come ISP

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *