J'ai enfin pu essayer un PIC 18F2455, équipé de tout ce qu'il faut pour construire des périphériques USB. La première séance a été consacrée à la découverte du chip, sans essayer l'USB pour le moment. Et ce n'est sûrement pas pour tout de suite, étant donnés les quelques soucis rencontrés...
I — Connexion de la bête
J'ai voulu tester la programmation du PIC à l'aide du programmateur PICkit 2, qui permet par ailleurs de l'alimenter. A priori, la connexion est très simple : le PICkit 2 est équipé d'un connecteur à cinq broches ; il suffit connecter chacune d'entre elles à la patte correspondante du PIC. Si les broches Vpp, Vdd et Vss ne posent pas de problème (même nomenclature des deux côtés), j'ai en revanche eu un peu de mal à trouver la correspondance des broches « ISCP Data » et « ICSP Clock ». Je l'ai finalement trouvée dans le manuel du PIC :
- pin 28, appelée PGD, correspond à « ICSP Data » ;
- pin 27, appelée PGC, correspond à « ICSP Clock ».
Pour faire les tests, j'ai connecté des LEDs sur RB3 et RB4.
II — Programmation
Je me suis décidé à essayer de programmer le PIC en C avec C18 Student Edition. L'installation se passe sans problème et il s'intègre bien à MPLAB.
Pour programmer en C, il faut commencer par créer un projet. On crée un fichier .c ; on l'ajoute au projet, et on compile le projet avec Ctrl+F10 (lorsqu'on a juste un fichier .asm, on l'assemble avec Alt+F10).
Premier problème : MPLAB se plaint car il n'arrive pas à trouver le fichier p18f2455.h. Si cela se produit, il faut aller dans Project > Build Options > Project et mettre le bon répertoire dans ''include path" (le sous-répertoire h du répertoire d'installation de C18).
Une fois ce souci réglé, la compilation se passe sans problème. Mais on obtient un module objet, pas de fichier HEX. C'est logique, il faut linker le fichier objet issu de la compilation du fichier .c avec les bibliothèques de C18. Pour cela, il faut un linker script, fourni avec C18. Faire Project > Add files to project, et aller chercher le script 18f2455.lkr dans le sous-répertoire lkr de C18. On obtient alors un fichier HEX qu'il est possible d'envoyer sur le PIC.
III — Débogage
On commence par sélectionner le simulateur : Debugger > Select Tool > MPSIM
Ensuite, c'est un jeu d'enfant : Debugger > Run, puis Halt, et ensuite il suffit de survoler les variables pour voir s'afficher leur valeur...
IV — Tests grandeur nature
Après connexion du programmateur PICkit 2 sur la plaque à bidouille, la programmation s'est effectuée sans problème. Cependant, je n'ai pas réussi à obtenir des résultats vraiment fiables et reproductibles.
Le programme suivant fonctionne à peu près convenablement ; il fait clignoter les deux LEDs, qui s'allument alternativement :
#include <p18f2455.h>
#pragma config WDT = OFF
#pragma config FOSC = INTOSC_XT
void tempo(int val) {
unsigned int i, j; // <--- line 7
for(j=0; j<1000; j++) {
PORTB = val;
}
PORTB = 0; // <--- line 13
}
void main(void) {
TRISB = 0;
while(1) {
tempo(0b00010000);
tempo(0b00001000);
}
}
Cependant, si je supprimer la déclaration de i à la ligne 7, ça ne fonctionne plus : la sortie GP4 reste allumée alors que l'autre reste éteinte. C'est complètement incompréhensible !
Et si j'enlève l'instruction PORTB = 0 à la ligne 13, ça compile toujours (normal...), mais je ne peux plus envoyer le programme sur le PIC ! Le logiciel de programmation affiche « error in program memory ». Encore une fois, c'est complètement incompréhensible !
Au bilan, ça pourrait marcher plus mal (j'ai quand-même fait un clignotant), mais un certain non-déterminisme des opérations m'inquiète... Il faudra refaire des essais...