-
d’usine l’ATMega8u2 utilise son horloge interne de 8Mhz avec un diviseur de fréquence par 8 ;
- nous voulons basculer sur l’horloge externe de 16Mhz sans diviseur ;
- une solution logicielle consiste à ajouter en entête du programme :
CLKSEL0 = 0b00010101; // sélection de l'horloge externe
CLKSEL1 = 0b00001111; // minimum de 8Mhz
CLKPR = 0b10000000; // modification du diviseur d'horloge (CLKPCE=1)
CLKPR = 0; // 0 pour pas de diviseur (diviseur de 1)
- une autre solution consiste à modifier des "fuses" ...
- ... soit des registres de configuration matérielle ;
- problème : d’usine l’ATMega8u2 ne permet pas la modification des "fuses" ;
- il est possible de le débloquer via l’AVR ISP ...
- ... en utilisant un Arduino Uno comme programmateur :
$ avrdude -c avrisp -p atmega8u2 -P /dev/ttyACM0 -b 19200 -t
avrdude> erase
avrdude> quit
$
- du coup les "fuses" peuvent être programmées pour une horloge 16Mhz externe :
$ avrdude -c avrisp -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xde:m -U hfuse:w:0xd9:m -U efuse:w:0xf4:m
- malheureusement le débloquage a effacé le chargeur DFU USB ;
- il faut en recharger une version (disponible ici : at90usb82-bl-usb-1_0_5.hex) :
$ avrdude -c avrisp -p atmega8u2 -P /dev/ttyACM0 -b 19200 -U flash:w:at90usb82-bl-usb-1_0_5.hex