J'ai déjà lu la fiche technique et Google mais je ne comprends toujours pas quelque chose.
Dans mon cas, je règle PIN RC6 d’un PIC18F26K20 en mode INPUT:
TRISCbits.TRISC6 = 1;
Ensuite, j'ai lu la valeur avec PORT et LATCH et j'ai une valeur différente!
v1 = LATCbits.LATC6;
v2 = PORTCbits.RC6;
v1 me donne 0 où v2 donne 1.
Est-ce normal? Dans quel cas nous devons utiliser PORT et dans quel cas LATCH?
Le verrou est le verrou output sur lequel les valeurs sont écrites. Le port est la tension à la broche réelle.
Il existe quelques situations où elles peuvent être différentes. Celui que j'ai rencontré le plus souvent est si vous avez une broche (accidentellement) en court-circuit à la terre. Si vous définissez le loquet haut, le loquet affichera une valeur élevée, mais le port, une valeur faible, car la tension sur la broche est toujours approximativement à la terre.
Une autre situation qui aboutit à ce que vous avez décrit est lorsque la broche de port n’a pas été configurée correctement. Moi (et tous ceux avec qui je travaille) ai passé de nombreuses heures à essayer de comprendre pourquoi notre PIC n’atteignait pas les attentes, pour finalement découvrir que nous avions négligé de désactiver les modules analogiques, par exemple. Assurez-vous de passer en revue la section Ports I/O -> PORT ?, TRIS ?, et LAT? enregistre dans la fiche technique. Vous pouvez obtenir plus d'informations dans la page wiki de Microchip , qui explique comment lire une valeur incorrecte immédiatement après avoir écrit une sortie sur une broche connectée à une charge capacitive.
Cette page wiki explique également:
Une lecture du registre de verrouillage de port renvoie les paramètres des pilotes de sortie, tandis qu'une lecture du registre de port renvoie les niveaux logiques vus sur les broches.
En outre, voici un extrait de la section Ports d'E/S du 18F14K50 (qui devrait être identique au reste de la série 18F):
Chaque port a trois registres pour son opération. Ces registres sont:
- Registre TRIS (registre de direction des données)
- Registre PORT (lit les niveaux sur les broches de l'appareil)
- Registre LAT (loquet de sortie)
Donc, dans la plupart des situations, vous écrivez sur le loquet et lisez le port.
Je vais adapter ma réponse de génie électrique.
Utilisons l'image du manuel:
Lorsque vous écrivez un bit dans une broche d'E/S, vous le stockez du bus de données au registre de données ( D-FlipFlop ). Si TRISx de ce bit est 0, les données de Q du registre de données seront donc dans la broche d’entrée/sortie. Écrire en LATx ou en PORTx est la même chose. Voir ci-dessous en rouge:
Par contre, lire depuis LATx est différent de lire depuis PORTx.
Lorsque vous lisez depuis LATx, vous lisez ce qu’il ya dans le registre de données ( D-FlipFlop ). Voir l'image ci-dessous en vert:
Et lorsque vous lisez PORTx, vous lisez la valeur réelle de la broche d’E/S. Voir ci-dessous en bleu:
Le PIC utilise des opérations de lecture-modification-écriture pour écrire et ceci peut être un problem , ils utilisent donc ce registre de suivi pour l'éviter.
Voici un résumé utile de la fiche technique.
11.2.3 Registres LAT
Le registre LATx associé à une broche d’E/S élimine les problèmes pouvant survenir avec les instructions Read-modify-write. Une lecture du registre LATx renvoie les valeurs contenues dans le port Les bascules de sortie, au lieu des valeurs des broches d’E/S. Une opération de lecture-modification-écriture sur le registre LAT , Associée à un port d'E/S, évite la possibilité d'écrire les valeurs des broches d'entrée dans les verrous du port Une écriture dans le registre LATx a le même effet qu'une écriture dans le registre PORTx.
Les différences entre les registres PORT et LAT peuvent être résumées comme suit:
Oui, il est normal de lire PORTx et LATx et de constater qu’ils ont parfois des valeurs différentes.
Lorsque vous voulez savoir si un matériel externe utilise une broche haute ou basse, vous devez définir la broche en mode d'entrée (avec TRIS ou le registre DIR) et lire PORTx. Cette lecture vous indique si la tension réelle sur la broche est haute ou basse.
Lorsque vous souhaitez piloter une broche haute ou basse, vous devez définir la broche en sortie (avec TRIS ou le registre DIR); vous devriez écrire le bit dans le registre LATx.
(Ecrire ce bit dans le registre PORTx peut sembler faire le bon choix: cette broche finira par aller haut ou bas comme ordonné. Mais il existe de nombreux cas - comme dans le cas où une autre Le port est connecté à un bus à collecteur ouvert - cette écriture sur un bit du registre PORTx gâchera l’état des autres broches de ce port, ce qui entraînera des problèmes de débogage difficiles).
Ma recommandation est de considérer les valeurs PORT comme en lecture seule. Les valeurs LAT peuvent être lues ou écrites, mais la valeur lue sera la dernière valeur écrite et non la valeur d'entrée de la broche.
Sur les anciens PIC, les valeurs LATx n'existaient pas; le seul moyen d'écrire sur un port était via les registres PORTx. Curieusement, certains des très vieux PIC, qui remontaient à l'époque de General Instruments (pré-Microchip), supportaient LATx, mais Microchip n'a pas ajouté cette fonctionnalité jusqu'à la ligne PIC18x.
Utilisez LATx
: pour écrire sur une broche de sortie
Utilisez PORTx
: pour lire une broche d'entrée
Pour tous les PIC avec des registres LATx
, tout INPUT doit être de PORTx
et tout OUTPUT doit être de LATx
, ce qui évite totalement le problème de retournement des bits lorsque vous écrivez sur un seul bit du port.
J'ai récemment constaté que l'écriture sur PORTx Ri (par exemple, PORTC RC1) de PIC18F14K50 était inefficace lorsqu'un autre PORTx Rj (par exemple, PORTC RC0) était déjà défini. Ce problème a disparu dès que j'écrivais sur LATx.
L'écriture LATx semble obligatoire sur PIC18 et l'écriture PORTx est interdite.