Pour des raisons d'économie (d'argent mais aussi et surtout de place) je voulais utiliser un ATMega328P sans quartz externe, en utilisant simplement son oscillateur interne à 8MHz.
J'ai cherché un peu comment faire mais je n'ai trouvé aucune doc vraiment claire.
Voici comment faire en détail:
Tout d'abord, la majorité des ATMega328P sont pré-configurés pour utiliser un quartz externe, et beaucoup son pré-chargés avec un bootloader compatible Arduino. Certains sont livrés bruts et semble-t-il préconfigurés pour utiliser l'oscillateur interne.
Nous allons utiliser l'IDE Arduino et un programmateur ISP ou bien le sketch ArduinoISP (c'est ce que j'ai utilisé).
Il n'existe pas de définition de "board" pour un Uno avec oscillateur interne, nous allons donc la créer. Pour ce faire, il faut commencer par ouvrir avec un éditeur de texte le fichier boards.txt qui se trouve dans le dossier <Arduino_home>\hardware\arduino\avr et y dupliquer l'entrée concernant le Uno pour y apporter les modifications suivantes:
############################################################## uno_internal_osc.name=Arduino Uno (internal 8 MHz oscillator, prescaler: 8) uno_internal_osc.vid.0=0x2341 uno_internal_osc.pid.0=0x0043 uno_internal_osc.vid.1=0x2341 uno_internal_osc.pid.1=0x0001 uno_internal_osc.vid.2=0x2A03 uno_internal_osc.pid.2=0x0043 uno_internal_osc.vid.0x2A03.warning=Uncertified uno_internal_osc.upload.tool=avrdude uno_internal_osc.upload.protocol=arduino uno_internal_osc.upload.maximum_size=32256 uno_internal_osc.upload.maximum_data_size=2048 uno_internal_osc.upload.speed=115200 uno_internal_osc.bootloader.tool=avrdude uno_internal_osc.bootloader.low_fuses=0x62 uno_internal_osc.bootloader.high_fuses=0xDE uno_internal_osc.bootloader.extended_fuses=0x07 uno_internal_osc.bootloader.unlock_bits=0x3F uno_internal_osc.bootloader.lock_bits=0x0F uno_internal_osc.bootloader.file=optiboot/optiboot_atmega328.hex uno_internal_osc.build.mcu=atmega328p uno_internal_osc.build.f_cpu=1000000L uno_internal_osc.build.board=AVR_UNO uno_internal_osc.build.core=arduino uno_internal_osc.build.variant=standard
Remarquez les points suivants:
Le changement des fusibles de l'ATMega328P s'effectue via AVRDude:
Ouvrir une ligne de commande et se placer dans le dossier <Arduino_Home>\\hardware\tools\avr\bin
Afficher les valeurs actuelles des fusibles avec une commande de ce genre (adapter le port COM utilisé):
avrdude -v -C ..\etc\avrdude.conf -p atmega328 -c STK500v1 -P\\.\COM8\ -b 19200 -n -F
AVRDude doit vous répondre entre autres quelque chose comme ceci:
avrdude: safemode: lfuse reads as 62 avrdude: safemode: hfuse reads as DE avrdude: safemode: efuse reads as 7 avrdude: safemode: Fuses OK (H:07, E:DE, L:62)
Il ne reste plus qu'à programmer les fusibles avec les valeurs souhaitées, en l'occurence ceci pour un ATMega328P programmé via ArduinoISP, avec une horloge interne à 8MHz et un prescaler à 8:
avrdude -C ..\etc\avrdude.conf -p atmega328 -c STK500v1 -P\\.\COM8\ -b 19200 -F -U lfuse:w:0x62:m -U hfuse:w:0xDE:m -U efuse:w:0x07:m
Tout ceci peut parraître abscons mais fort heureusement il existe de nombreux outils pour aider à calculer les valeurs des bits des différents fusibles. J'utilise souvent ce site.