# Les entrées sorties

Le PIC permet de décider pour chaque PIN (patte du chip) si c’est une entrée (par exemple pour lire un bouton) ou une sortie (par exemple pour allumer une LED). Pour cela, il faut bien comprendre comment est fabriqué une "patte" du chip. Certaine pattes peuvent faire les choses encore plus spéciale comme lire une tension ou faire un compteur, mais on n'utilise pas cela ici.

## Une Entrée

Lorsque l’on ne lit pas l'entrée, l'état de la pin est mis en permanence dans le latch . Au moment de la lecture, on verrouille le latch pour éviter que la valeur risque de changer en cours de route.
pour lire le bit 0 du PORTA, on peut écrire

## Une Sortie

Pour qu'une pin soit une sortie, on doit mettre un 0 dans le bit correspondant du registre TRIS, ce qui permet de connecter la sortie du Data Latch avec la pin (petit triangle colorié en vert).
On peut alors écrire ce que l’on veut dans LATx (en bleu) et à la fin de l'écriture, ce sera mémorisé dans le Data Latch et la sortie aura donc changé.
Pour écrire un 0 dans le bit 0 du PORTA, on peut écrire
Lors de la définition des entrées sorties, faire attention avec un 18F2550 d’utiliser LATxxx pour les sorties et PORTxxx pour les entrées. En effet, si deux instructions assembleurs BCF ou BSF se suivent sur le même PORT, le résultat n’est pas prédictible !!! La doc du PIC est assez peu claire sur ces instructions dites "Read-Modify-Write", mais on peut très bien avoir un résultat erroné (p. ex. BCF PORTA,0 suivit de BSF PORTA,1 peut fort bien se terminer avec le bit 0 de PORTA qui clignote (passe à 0 lors du BCF, puis repasse à 1 lors du BSF de son voisin). En regardant bien le schéma, on comprend pourquoi: lorsque l’on écrit, la donnée que l’on veut est mise dans le Data Latch à la fin de l'écriture. Or la lecture d'une pin est "gelée" durant toute la lecture. Si deux instructions "Read-Modify-Write" se suivent, la première met la donnée sur la pin à la fin du Write. Comme il s'agit d'une pin, qui a un consommateur au bout, la tension ne va pas monter instantanément. Or l'instruction suivante est un "read-modify-write", qui s'il est fait sur PORTx et non sur Latx, va lire non pas le registre, mais la pin. Comme la tension sur la pin est en train de changer et que l’on gèle la lecture de la pin avec un Latch au début du cycle, on a en fait des risques de mémoriser l'état d'avant !!! d'où un comportement étonnant.
Ce problème est présent sur tous les PIC, mais l'avantage avec la famille 18Fxxxx est que l’on peut lire et écrire le registre LAT. Dans les premiers PIC, ce registre existe aussi, mais on ne peut pas le lire, on ne peut que l'écrire via PORT... le risque est alors grand, et il faut faire attention en écrivant le soft de ne pas faire 2 "read-modify-write" de suite.
En déclarant les bits comme c’est la cas ici, et contrairement à la pratique Pinguino qui consiste à utiliser la procédure DigitalWrite, on améliore l’efficacité du code de manière drastique (au moins 1 à 20) et on est très proche de l'assembleur, mais du coup, on s'expose à ce problème !!! Il faut donc bien déclarer les IOs
Pour plus d'info, voir le forum microchip et

## Allumage d'une LED

Comme la Led est reliée au 5 V, si on met 0 Volt (=un 0 dans RA0), la LED s'allume, car il y a du courant qui peut passer (comme un moulin avec de l'eau en haut d'un côté et de l'eau en bas de l'autre). Par contre si on a 5 Volts d'un côté et 5 Volts de l'autre, la LED ne s'allume pas (comme un moulin noyé dans l'eau)
Mais à la fin on se perd un peu! Non? Il faut mettre 0 pour allumer et 1 pour éteindre! alors que des fois on voit sur un interrupteur 1 pour allumer et 0 pour éteindre. c'est pour cela que dans le fichier hardware.h ci-dessous on a aussi écrit
Comme cela on peut écrire des choses que l’on arrive à lire facilement. Led0 = Allume; c’est beaucoup plus clair que PORTAbits.RA0=0
| Jeu d'adresse sonore | Sommaire |