4. K2000

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...

Accèdons à l'extérieur

L'architecture PIC et les registres de contrôle

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.

Des ports, des latches et des tristates

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é :

  • Pour contrôler l'extérieur, on doit placer la patte en LowZ
  • Pour mesurer l'extérieur, on doit placer la patte en HighZ

Le contrôle de tout cela est fait au travers de trois registres pour chaque bloc de pattes (un port):

  • TRIS contrôle l'impédance de sortie: un bit placé à 1 du tristate active la sortie correspondante, un 0 place la patte en entrée (lecture/écriture)
  • LAT contrôle la donnée de sortie (lecture/écriture)
  • PORT permet de lire la donnée d'entrée (lecture seule)

(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)

Modifier un registre avec rforth1

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 -- ) Et de même, pour les registres 16 bits (comme les timers)  ! ( 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-set Permet de placer à 1 ("set") le bit 0 du Port A. À condition que le tristate correspondant soit en basse impédance, cette instruction met la patte RA0 à +5V... Les instructions pour modifier un bit d'un registre sont:  bit-set ( registre bit -- ) bit-clr ( registre bit -- ) bit-toggle ( registre bit -- ) Comme les anglophones l'auront compris directement, bit-set place le bit à 1, bit-clr le passe à 0, et bit-toggle le passe à 1 s'il était à 0, et à 0 s'il était à 1.  

Application

Soyons simple

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 ( -- )
  ( Initialisation des bits 0 à 2 du port C en sortie )
  0xf8 TRISC c!
  begin
    0x01 LATC c!
    wait-long
    0x02 LATC c!
    wait-long
    0x04 LATC c!
    wait-long
    0x02 LATC c!
    wait-long
  again ;