
Notre prochain objectif: faire clignoter des diodes façon K2000!
J'ai une carte avec un pic18f256 et 3 diodes sur le port C (et plus exactement les pattes RC0, RC1 et RC2). Mais attention, comme je n'avais pas assez de place sur la carte, j'ai branché l'anode sur le pic et la cathode sur le VCC. Rien de grave, on en tiendra compte dans le programme...
Ceux qui sont familiers avec les pics peuvent passer directement au paragraphe suivant, les autres ont le droit de ne pas s'affoler... et de lire la suite.
Le pic est un microcontrôleur difficile d'accès, car chaque patte peut avoir plusieurs fonctions différentes. On va faire simple, pour l'instant on ne va pas utiliser les fonctions avancées.
Chaque patte peut basiquement servir d'entrée ou de sortie.
Lorsque la patte est configurée en sortie, le PIC peut connecter via un transistor (en fait 2) soit à la masse soit à l'alimentation. La patte est dite soit à 1 soit à 0, ou en LowZ.
Lorsque la patte est configurée en entrée, la patte n'est connectée par le PIC ni à l'alimentation ni à la masse: La patte est dite en haute impédance (HighZ) , car la résistance entre la patte et les alimentations est suffisament forte pour qu'un montage extérieur puisse contrôler la tension sur la patte.
En résumé :
Le contrôle de tout cela est fait au travers de trois registres pour chaque bloc de pattes (un port):
(Attention, il y a parfois des gags dans l'architecture du PIC à ce propos: par exemple, certaines pattes sont en collecteur ouvert, i.e. elles n'ont que l'état HighZ et 0; d'autres pattes sont communes avec des convertisseurs analogique/numérique activé par défaut - ça pose parfois problème quand on l'oublie)
Les registres sont définis dans rforth1 sous le même nom que dans la datasheet du PIC. Donc en cas de doute, on regarde la datasheet, et on connaît le nom du registre.
On peut bien entendu écrire le registre d'un coup:
c! ( valeur_8bits registre -- )! ( valeur_16bits registre -- )Comme l'architeture du PIC permet de positionner les bits indépendemment, on peut manipuler les bits un par un.
LATA 0 bit-setLes instructions pour modifier un bit d'un registre sont:
bit-set ( registre bit -- )
bit-clr ( registre bit -- )
bit-toggle ( registre bit -- )
Ma première version est très bête: on a 3 leds, donc 4 étapes dans le chenillard K2000.
( Définition d'une attente de 10000 cycles de 10 instructions, soit environ 0.01 seconde )
: wait ( -- )
10000
begin
1 - dup 0=
until
drop
;
( On fait une attente un peu plus longue, grace à l'attente courte )
: wait-long ( -- )
100
begin
wait
1 - dup 0=
until
drop
;
: main ( -- )
0xF8 TRISC c! ( Initialise les bits 0 à 2 du port C en sortie )
begin
0x01 LATC c!
wait-long
0x02 LATC c!
wait-long
0x04 LATC c!
wait-long
0x02 LATC c!
wait-long
again
;