Que se passe-t-il lorsque les données sont écrites dans LATCH?

9

C'est ce que j'ai trouvé dans la fiche technique PIC16F1947:

La lecture du registre PORTB lit l'état des broches, tandis que l'écriture dans celui-ci écrit dans le verrou PORT. Toutes les opérations d'écriture sont des opérations de lecture-modification-écriture. Par conséquent, une écriture sur un port implique que les broches du port sont lues, cette valeur est modifiée puis écrite dans le verrou de données PORT (LATB).

Je suis développeur de firmware et j'ai une formation en informatique. J'ai encore du mal à comprendre l'électronique et la logique au niveau matériel. Je n'ai que les connaissances de base.

Donc, je veux comprendre ce qui se passe lorsque les données sont écrites pour se verrouiller au niveau matériel.

Je vous remercie.

Donotalo
la source

Réponses:

19

Le verrou est une sorte de mémoire d'un bit.

Utilisons l'image dans le manuel:

Fonctionnement du port d'E / S générique

Lorsque vous écrivez un bit dans une broche d'E / S, vous stockez ce bit du bus de données dans le 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'E / S. L'écriture en LATx ou PORTx est identique. Voir ci-dessous en rouge:

Écriture du fonctionnement du port d'E / S générique

D'un autre côté, la lecture depuis LATx est différente de la lecture depuis PORTx.

Lorsque vous lisez depuis LATx, vous lisez ce qui se trouve dans le registre de données ( D-FlipFlop ). Voir l'image ci-dessous en vert:

Fonctionnement du port d'E / S générique Lire LATx

Et lorsque vous lisez à partir de PORTx, vous lisez la valeur réelle des broches d'E / S. Voir ci-dessous en bleu:

Fonctionnement du port d'E / S générique Lire PORTx

PIC utilise lecture-modification-écriture pour écrire des opérations et cela peut être un problème , ils utilisent donc ce registre fantôme pour l'éviter.

Daniel Grillo
la source
1
+1 pour le lien vers un endroit qui décrit clairement le problème (et la solution) (lire-modifier-écrire) [ techref.massmind.org/techref/readmodwrite.htm] .
davidcary
1
Wow, grande explication.
abdullah kahraman
Les deux liens vers le problème de lecture-mod-écriture sont rompus.
Randomblue
@ Randomblue, j'ai mis un autre lien. Le problème avec l'autre lien est le caractère «]» à la fin. Supprimez-le simplement dans l'adresse de votre navigateur.
Daniel Grillo
6

Pour éviter les problèmes de lecture-modification-écriture, vous devez écrire sur le port dans son ensemble, plutôt que de définir ou de réinitialiser des bits individuels dans le port. Un problème RMW peut entraîner un bit non défini ou une autre sortie élevée, en particulier si les broches de sortie recherchent ou absorbent beaucoup de courant.

Un "registre fantôme" est généralement utilisé. Définissez ou réinitialisez les bits dans cela, et envoyez-les au port, pour éviter les problèmes RMW.

Le problème est évité avec les PIC 18F en utilisant un verrou séparé, des bits individuels qui peuvent être définis et réinitialisés en toute impunité.

Leon Heller
la source
mais je suppose que je n'ai pas besoin d'écrire dans le registre de verrouillage, car l'écriture dans le registre de port d'origine écrit dans le verrou, non?
Donotalo
@Donotalo, vous avez raison. Vous pouvez également écrire dans le registre des ports. Ce n'est pas important.
Daniel Grillo
@Donotalo: Il est possible d'écrire dans le registre des ports, mais je recommanderais par habitude d'écrire dans les registres LATx sur les processeurs qui en disposent, et de considérer les registres PORTx comme en lecture seule. Un stockage "aveugle" dans un registre PORTx (par exemple PORTB = 0x42;) ne se comportera pas différemment de l'un vers LATBx, et une lecture-modification-écriture dans un registre PORTx (par exemple PORTB | = 0x02;) aura un effet qui soit être le même que LATx, soit différer d'une manière très probablement indésirable. BTW, certains des PIC pré-Microchip plus récents offraient LATx; Je ne sais pas pourquoi Microchip a mis des années (des décennies?) À le faire.
supercat
+1 pour avoir mentionné que les puces PIC18F (aka "PICs d'instructions 16 bits) ont le registre LAT, tandis que les puces PIC16F (aka" PICs d'instructions 14 bits ") nécessitent de simuler le registre LAT dans le logiciel (" shadow shadow ").
davidcary