Ce guide décrit comment programmer un microcontrôleur Atmega328P en utilisant une carte Arduino comme programmateur, et un oscillateur 16MHz externe. Il est le résultat de la frustration qu'ont provoqué chez moi toutes les tentatives infructueuses et les lectures de tutoriels incomplets. Maintenant que j'ai trouvé une méthode qui marche, je la publie ici afin de ne pas la perdre.
## Matériel nécessaire
* Atmega328P (le P change tout)
* Arduino board (j'ai utilisé une Arduino Micro)
* oscillateur 16MHz
* 2× condensateur 22pF
* résistance 10kΩ
* condensateur 100µF
### Note
Si vous n'avez aucun condensateur de 22pF, vous pouvez en récupérer dans un vieil appareil (par exemple il y en a plein dans les magnétoscopes). Malheureusement les condensateurs traversants de cette valeur ont l'air assez rares, donc vous devrez peut-être récupérer plein de condensateurs montés en surface et trouver les bons en fabriquant un [capacimètre tout simple avec une Arduino](https://www.instructables.com/Capacitance-Meter/).
La description des broches de l'Atmega328P peut être trouvée dans [sa fiche technique](atmega328p.pdf).
* Connectez les broches MOSI, MISO, SCK(=SCLK) de l'Arduino aux broches correspondantes de l'Atmega. (sur l'Arduino Uno, ce sont respectivement les broches 11, 12, 13)
* Connectez la broche 10 de l'Arduino à la broche Reset de l'Atmega.
* Connectez les deux pôles de l'oscillateur aux broches XTAL/TOSC de l'Atmega, et placez un condensateur de 22pF entre ces pôles et le GND.
* Connectez les GNDs. Connectez les VCC de l'Atmega, AVCC de l'Atmega et +5V de l'Arduino.
Vérifiez bien les branchements. Le MOSI va sur le MOSI et le MISO sur le MISO, ils ne sont pas échangés.
### En production
Les branchements suivants sont nécessaires seulement quand le microcontrôleur n'est pas connecté à l'Arduino.
* Placez une résistance pull-up sur Reset (une résistance de 10kΩ entre Reset et VCC).
* Placez un condensateur de 100µF entre GND et VCC.
* L'oscillateur et les petits condensateurs sont toujours nécessaires.
* VCC et AVCC doivent toujours être reliés.
## Programmation
J'utilise l'IDE Arduino.
D'abord, programmons l'Arduino pour en faire une sorte de relais entre l'ordinateur et le microcontrôleur :
1. Ouvrez le programme d'exemple `ArduinoISP`.
1. Si vous utilisez une Arduino Uno, décommentez la ligne `#define USE_OLD_STYLE_WIRING`.
1. Choisissez votre carte dans le _Type de carte_ (_Arduino Micro_ pour moi).
1. Choisissez votre programmateur habituel (en général _AVR ISP_).
1. Envoyez le programme normalement.
Nous pouvons enfin programmer le microcontrôleur :
1. Ouvrez le programme voulu. (ou testez avec l'exemple `Blink`)
1. Choisissez le type de carte _Arduino Uno_. (même si vous utilisez une autre carte comme programmateur ; c'est parce qu'un Atmega328P seul avec un oscillateur 16MHz se comporte comme une Arduino Uno)
1. Choisissez le programmateur _Arduino as ISP_.
1. Si le microcontrôleur ne contient pas encore de bootloader, faites _Outils -> Graver la séquence d'initialisation_.
1. Envoyez le programme avec _Croquis -> Téléverser avec un programmateur_.