L'atelier Le mystère des pins 6 et 7 ! Ou comment peut-on être une entrée et une sortie en même temps ?
aoineko
Membre non connecté
Conseiller Municipal
Hello,
J'aimerai comprendre comment fonctionne les pins 6 et 7 du port joystick (General Purpose port pour être précis) qui sont censés pouvoir être utilisé comme entrée ou comme sortie.
Leur utilisation en entrée est classique (par ex. pour lire l'état des 2 boutons d'un joystick MSX), mais leur utilisation en sortie semble plus rare. Un exemple d'utilisation est la communication avec le NinjaTap ou le pin 6 permet d'initialiser la transmission des données.
Ce que je ne comprends pas c'est comment un pin peut être à la fois une entrée et une sortie (avec des valeurs correspondantes différentes).
Même si on m'a déjà répondu qu'il eut être l'un ou l'autre, mais pas les deux en même temps, il y a un cas que je ne comprends toujours pas.
Pour lire un joystick par ex., on sélectionne dans le registre 15 du PSG (R#15) le port que l'on souhaite lire, mais se faisant, on est obligé de donnée des valeurs output aux pin 6, 7 et 8 qui sont dans le même registre. A priori, pour un joystick, il est conseillé de mettre les valeurs correspondantes à ces pins à '1' (high ?).
Pourtant, quand on va lire la valeur du port via R#14, on peut récupérer une autre valeur sur les pin 6 et 7, si par ex. les boutons sont appuyés (dans ce cas on récupère un '0'; low ?).
Comment est-ce possible physiquement ?
C'est une question de timing ? Le pin est mi à high lors de l'écriture dans R#15 mais quelque chose le remet à low quand on lit R#14 ?
Ou bien le pin peut-il avoir 2 valeurs ? (j'imagine que non).
Je sais que la réponse va être « Open collector !! », mais j'ai lu la page Wikipedia et j'ai pas compris grand chose ni vu de rapport direct avec le fonctionnement des pins 6 et 7.
Si quelqu'un peut éclairer ma lanterne, je serais très reconnaissant. Edité par aoineko Le 22/11/2024 à 14h00
J'aimerai comprendre comment fonctionne les pins 6 et 7 du port joystick (General Purpose port pour être précis) qui sont censés pouvoir être utilisé comme entrée ou comme sortie.
Leur utilisation en entrée est classique (par ex. pour lire l'état des 2 boutons d'un joystick MSX), mais leur utilisation en sortie semble plus rare. Un exemple d'utilisation est la communication avec le NinjaTap ou le pin 6 permet d'initialiser la transmission des données.
Ce que je ne comprends pas c'est comment un pin peut être à la fois une entrée et une sortie (avec des valeurs correspondantes différentes).
Même si on m'a déjà répondu qu'il eut être l'un ou l'autre, mais pas les deux en même temps, il y a un cas que je ne comprends toujours pas.
Pour lire un joystick par ex., on sélectionne dans le registre 15 du PSG (R#15) le port que l'on souhaite lire, mais se faisant, on est obligé de donnée des valeurs output aux pin 6, 7 et 8 qui sont dans le même registre. A priori, pour un joystick, il est conseillé de mettre les valeurs correspondantes à ces pins à '1' (high ?).
Pourtant, quand on va lire la valeur du port via R#14, on peut récupérer une autre valeur sur les pin 6 et 7, si par ex. les boutons sont appuyés (dans ce cas on récupère un '0'; low ?).
Comment est-ce possible physiquement ?
C'est une question de timing ? Le pin est mi à high lors de l'écriture dans R#15 mais quelque chose le remet à low quand on lit R#14 ?
Ou bien le pin peut-il avoir 2 valeurs ? (j'imagine que non).
Je sais que la réponse va être « Open collector !! », mais j'ai lu la page Wikipedia et j'ai pas compris grand chose ni vu de rapport direct avec le fonctionnement des pins 6 et 7.
Si quelqu'un peut éclairer ma lanterne, je serais très reconnaissant. Edité par aoineko Le 22/11/2024 à 14h00
On est toujours ignorant avant de savoir.
TurboSEB
Membre non connecté
Conseiller Municipal
Je vais pas répondre a la question (j'ai pas cette prétention vue mon niveau en électronique) mais complété les données pour apporter de l'eau au moulin. J'ai crû lire que ça interagisser avec les CI 4021 qui sont des sorte de multiplexeurs série , voire cette vidéo ( https://youtu.be/VSZBLvlZRSc )
Ma petite piste de recherche si j'ose .... Sinon pour éviter les rebond de signaux en électronique car quand on appuie physiquement sur un bouton , c'est pas forcément 1 ou 0 dans un signal franc et net 1 ou 0 , pas un front de signal carré , or la si j'ai bien compris on a un multiplexage de 4 manettes donc plusieurs données qui peuvent arrivé en même temps mais pas forcément "traité" en même temps mais alternativement en fonction du cycle d'horloge donc il faudra bien traité ces données en switchant les entrées/sorties alternativement ,ceci sera transparent en utilisation car il est quasi impossible que l'on appuis sur un bouton durant seulement un cycle d'horloge donc les différents ports d'entré/sorties sont certainement décomposé en train d'onde afin d'être lu comme tel en haute fréquence . J'imagine que le fait que si il y a deux Signal en miroir, c'est pour imposer avec une fonction NAND (ou AND , voyez j'ai des lacunes ) une sélection par cycle d'horloge d'une lecture alternative des différents boutons non pas front montant ou descendant, mais en état haut bas a chaque cycle d'horloge .
(Désolé si tu n'as peut-être rien compris de ce que j'ai dis , c'est probable , ça m'arrive tout le temps car je n'ai pas forcément la formation ni la pratique ni le bon vocabulaire qu'il faut . Edité par TurboSEB Le 22/11/2024 à 15h48
MSX 1&2 + Moniteurs+divers (environ 0.70Tonnes)
les 2 signaux lecture et écriture ne passent pas par le même port I/O du PSG
pour lire c'est le port A Registre 14 on passe par un 74LS157 qui est un aiguillage entre les joysticks 1 et 2
port A du PSG bit 4 pin 6 du joystick 1 et 2
port A du PSG bit 5 pin 6 du joystick 1 et 2
pour écrire c'est le port B Registre 15 qui envoie les données au travers d'un ampli 7407
port B du PSG bit 0 pin 6 du joystick 1
port B du PSG bit 1 pin 7 du joystick 1
port B du PSG bit 2 pin 6 du joystick 2
port B du PSG bit 3 pin 7 du joystick 2
extrait de assembleur et périphériques des MSX retapé par Granced
pour lire c'est le port A Registre 14 on passe par un 74LS157 qui est un aiguillage entre les joysticks 1 et 2
port A du PSG bit 4 pin 6 du joystick 1 et 2
port A du PSG bit 5 pin 6 du joystick 1 et 2
pour écrire c'est le port B Registre 15 qui envoie les données au travers d'un ampli 7407
port B du PSG bit 0 pin 6 du joystick 1
port B du PSG bit 1 pin 7 du joystick 1
port B du PSG bit 2 pin 6 du joystick 2
port B du PSG bit 3 pin 7 du joystick 2
extrait de assembleur et périphériques des MSX retapé par Granced
Registres R14 et R15
Le PSG possède deux registres d’entrées/sorties qui servent dans les MSX à la gestion des
joysticks et des manettes analogiques. Ces ports peuvent être dirigés en entrée ou en sortie
comme nous vous le disions lors de la description du registre R7. En conséquence, on peut
écrire ou lire sur ces ports, mais seulement par l’intermédiaire de OUT et IN.
Écriture : Comme pour les registres précédents, il faut fournir le numéro de registre et la
donnée à écrire. La routine qui s’en charge à l’adresse 0093H est toujours utilisable.
Lecture : La démarche est un peu différente puisque les ports d’entrées/sorties utilisés ne
sont plus A0H et A1H mais A0H et A2H. La lecture se fait en chargeant le numéro du
registre à lire sur le port A0H (par exemple OUT 0A0H, numéro) et l’on récupère le contenu
du registre demandé sur le port A2H (par exemple IN A, (0A2H)). Comme pour l’écriture, il
existe une routine qui fait cela toute seule en ROM. Celle-ci est appelée par un vecteur du
BIOS qui se trouve à l’adresse 0096H. Le paramètre d’entrée est le numéro du registre à lire
qui doit se trouver dans l’accumulateur. Ainsi, si vous voulez lire le contenu du port A vous
faites :
LD A, 14
CALL 0096H
Au retour le contenu du port A se trouvera dans l’accumulateur.
Que représentent ces ports ?
Voici un détail de toutes les fonctions de leurs bits :
Le port A (registre 14) sert principalement à la lecture des joysticks. Les bits b0, b1, b2 et b3
servent à déterminer la direction dans laquelle est poussée le manche à balai selon la
convention qu’un bit passe à 0 lorsqu’on pousse le manche dans la direction qui lui
correspond et avec :
Bit 0 correspondant au nord
Bit 1 correspondant au sud
Bit 2 correspondant à l’ouest
Bit 3 correspondant à l’est
Nota : Si vous poussez la manette dans la direction sud-est, les bits correspondant au sud et
à l’est sont cumulés.
Le bit 4 sert pour le bouton de tir, il est à 0 si le bouton est enfoncé.
Le bit 5 sert pour le trigger des manettes analogiques.
Le bit 6 ne sert pas.
Le bit 7 sert pour la cassette.
Le port B sert pour la sélection du joystick (comme on dispose de deux joysticks, il faut dire
celui que l’on désire scruter) et pour les manettes analogiques. Voici le détail de ses bits : les
bits b0 à b5 servent pour la valeur de la manette analogique. Cette valeur est donc comprise
entre 0 et 31.
Le bit 6 sert à sélectionner le joystick que l’on veut lire (1 ou 2)
Le bit 7 n’est pas utilisé.
Pour scruter les joysticks, il existe en ROM des routines dont vous pouvez vous resservir.
Ces routines sont :
Lecture du joystick : On met dans l’accumulateur le numéro (1 ou 2) de la manette que
l’on désire lire, on fait un CALL à l’adresse D5H. On récupère alors la valeur dans
l’accumulateur.
Lecture du bouton de tir : On met dans A le numéro du joystick, et l’on fait CALL à
l’adresse D8H.
Lecture de la manette analogique : La routine située en DBH est équivalente à la fonction
PAD et celle située en DEH est équivalente à la fonction PDL.
Le PSG possède deux registres d’entrées/sorties qui servent dans les MSX à la gestion des
joysticks et des manettes analogiques. Ces ports peuvent être dirigés en entrée ou en sortie
comme nous vous le disions lors de la description du registre R7. En conséquence, on peut
écrire ou lire sur ces ports, mais seulement par l’intermédiaire de OUT et IN.
Écriture : Comme pour les registres précédents, il faut fournir le numéro de registre et la
donnée à écrire. La routine qui s’en charge à l’adresse 0093H est toujours utilisable.
Lecture : La démarche est un peu différente puisque les ports d’entrées/sorties utilisés ne
sont plus A0H et A1H mais A0H et A2H. La lecture se fait en chargeant le numéro du
registre à lire sur le port A0H (par exemple OUT 0A0H, numéro) et l’on récupère le contenu
du registre demandé sur le port A2H (par exemple IN A, (0A2H)). Comme pour l’écriture, il
existe une routine qui fait cela toute seule en ROM. Celle-ci est appelée par un vecteur du
BIOS qui se trouve à l’adresse 0096H. Le paramètre d’entrée est le numéro du registre à lire
qui doit se trouver dans l’accumulateur. Ainsi, si vous voulez lire le contenu du port A vous
faites :
LD A, 14
CALL 0096H
Au retour le contenu du port A se trouvera dans l’accumulateur.
Que représentent ces ports ?
Voici un détail de toutes les fonctions de leurs bits :
Le port A (registre 14) sert principalement à la lecture des joysticks. Les bits b0, b1, b2 et b3
servent à déterminer la direction dans laquelle est poussée le manche à balai selon la
convention qu’un bit passe à 0 lorsqu’on pousse le manche dans la direction qui lui
correspond et avec :
Bit 0 correspondant au nord
Bit 1 correspondant au sud
Bit 2 correspondant à l’ouest
Bit 3 correspondant à l’est
Nota : Si vous poussez la manette dans la direction sud-est, les bits correspondant au sud et
à l’est sont cumulés.
Le bit 4 sert pour le bouton de tir, il est à 0 si le bouton est enfoncé.
Le bit 5 sert pour le trigger des manettes analogiques.
Le bit 6 ne sert pas.
Le bit 7 sert pour la cassette.
Le port B sert pour la sélection du joystick (comme on dispose de deux joysticks, il faut dire
celui que l’on désire scruter) et pour les manettes analogiques. Voici le détail de ses bits : les
bits b0 à b5 servent pour la valeur de la manette analogique. Cette valeur est donc comprise
entre 0 et 31.
Le bit 6 sert à sélectionner le joystick que l’on veut lire (1 ou 2)
Le bit 7 n’est pas utilisé.
Pour scruter les joysticks, il existe en ROM des routines dont vous pouvez vous resservir.
Ces routines sont :
Lecture du joystick : On met dans l’accumulateur le numéro (1 ou 2) de la manette que
l’on désire lire, on fait un CALL à l’adresse D5H. On récupère alors la valeur dans
l’accumulateur.
Lecture du bouton de tir : On met dans A le numéro du joystick, et l’on fait CALL à
l’adresse D8H.
Lecture de la manette analogique : La routine située en DBH est équivalente à la fonction
PAD et celle située en DEH est équivalente à la fonction PDL.
aoineko
Membre non connecté
Conseiller Municipal
Oui, mais les deux ports du PSG (A et B) sont bien connecté au même pins de chaque port joystick pour les pins entrée/sortie (pins 6 et 7), non ?
Par exemple, dans l'exemple ci-dessous, si je sélectionne le port joystick 1 (bit 7=0) via le registre 15 du PSG, je vais aussi changer la valeur d'output des pins 6 et 7 (qui sont mis à 1 dans l'exemple).
C'est à dire, si je comprends bien, que ces pins prennent la valeur HIGH (haute), que j'imagine être un courant de +5V.
Pourtant, quand je récupère la valeur lue sur les pins 6 et 7 via le registre 14 du PSG, je peux avoir une valeur différente que précédemment.
Par ex., si un joystick est branché sur le port 1 et que ses boutons sont appuyés, je vais récupéré 0 dans les bits correspondants au pin 6 et 7 (bit 4 et 5).
Toujours si j'ai bien compris, cela signifie que ces pins prennent la valeur (basse), que j'imagine être un courant de +0V.
Je ne comprends pas comment un pin pourrait avoir 2 valeurs. Edité par aoineko Le 23/11/2024 à 15h42
Par exemple, dans l'exemple ci-dessous, si je sélectionne le port joystick 1 (bit 7=0) via le registre 15 du PSG, je vais aussi changer la valeur d'output des pins 6 et 7 (qui sont mis à 1 dans l'exemple).
C'est à dire, si je comprends bien, que ces pins prennent la valeur HIGH (haute), que j'imagine être un courant de +5V.
Pourtant, quand je récupère la valeur lue sur les pins 6 et 7 via le registre 14 du PSG, je peux avoir une valeur différente que précédemment.
Par ex., si un joystick est branché sur le port 1 et que ses boutons sont appuyés, je vais récupéré 0 dans les bits correspondants au pin 6 et 7 (bit 4 et 5).
Toujours si j'ai bien compris, cela signifie que ces pins prennent la valeur (basse), que j'imagine être un courant de +0V.
Code ASM :
ld a, #15 out (0xA0), a ; Sélection de R#15 (pour écriture) ld a, 0b00010011 out (0xA1), a ; Sélection du port joystick 1 (bit 7=0) et mise à 1 (HIGH?) des bits correspondant aux pins 6, 7 et 8 (du port joystick 1) ld a, #14 out (0xA0), a ; Sélection de R#14 (pour lecture) in a, (0xA2), a ; Lecture du port joystick 1 and #0x3F ; Ne garder que les 6 bits de poids faible
Je ne comprends pas comment un pin pourrait avoir 2 valeurs. Edité par aoineko Le 23/11/2024 à 15h42
On est toujours ignorant avant de savoir.
popolon
Membre non connecté
Villageois
tout, tout, tout, vous saurez tout sur la zizi...que
aoineko :
Oui, mais les deux ports du PSG (A et B) sont bien connecté au même pins de chaque port joystick pour les pins entrée/sortie (pins 6 et 7), non ?
ben non c'est pas relié directement
pour lire c'est le port A Registre 14 on passe par un 74LS157 qui est un aiguillage entre les joysticks 1 et 2
pour écrire c'est le port B Registre 15 qui envoie les données au travers d'un ampli 7407
un extrait du schéma du VG8020/00 pour mieux comprendre
aoineko
Membre non connecté
Conseiller Municipal
Prenons un exemple concret :
- Un joystick connecté au port joystick 1 (General purpose),
- Et regardons uniquement l'état pour pin 6 de la prise DB9 (et donc du fil correspondant qui relie le MSX au joystick).
1) Quand on écrit dans le registre R#15 (port B du PSG), le fil rouge sur le schéma va prendre la "valeur" (je sais pas quel est le terme en électronique) du bit 0 (IOB0 sur le schéma) ?
2) Quand on lit dans le registre R#14 (port A du PSG), on va récupérer la valeur du fil rouge ?
Si c'est bien le cas, quand on lit le pin 6, quelle valeur récupère-t-on puisse que le fil rouge est connecté à IOB0 et au pin 6 du joystick ?
Le composant en triangle est peut-être la clé ?
Edité par aoineko Le 24/11/2024 à 01h24
- Un joystick connecté au port joystick 1 (General purpose),
- Et regardons uniquement l'état pour pin 6 de la prise DB9 (et donc du fil correspondant qui relie le MSX au joystick).
1) Quand on écrit dans le registre R#15 (port B du PSG), le fil rouge sur le schéma va prendre la "valeur" (je sais pas quel est le terme en électronique) du bit 0 (IOB0 sur le schéma) ?
2) Quand on lit dans le registre R#14 (port A du PSG), on va récupérer la valeur du fil rouge ?
Si c'est bien le cas, quand on lit le pin 6, quelle valeur récupère-t-on puisse que le fil rouge est connecté à IOB0 et au pin 6 du joystick ?
Le composant en triangle est peut-être la clé ?
Edité par aoineko Le 24/11/2024 à 01h24
On est toujours ignorant avant de savoir.
quand tu parles de valeur tu veux dire tension a la pin 6 en volt ou bien état 0 ou 1 ?
ton bit 0 numériquement à 2 valeurs 0 ou 1 qui correspondent à 0 Volt et 5 Volts
ces 5 volts sont amplifiés par le 74LS07 ( composant en triagle ) et arrivent sur la pin 6 du joystick
on peut les retrouver aussi sur le bit 4 du port A uniquement à condition que le bit 6 du port B soit à 0
question : il sort de ou ton schéma car il est plus clair que le mien
ton bit 0 numériquement à 2 valeurs 0 ou 1 qui correspondent à 0 Volt et 5 Volts
ces 5 volts sont amplifiés par le 74LS07 ( composant en triagle ) et arrivent sur la pin 6 du joystick
on peut les retrouver aussi sur le bit 4 du port A uniquement à condition que le bit 6 du port B soit à 0
question : il sort de ou ton schéma car il est plus clair que le mien
aoineko
Membre non connecté
Conseiller Municipal
Le schéma vient de MRC : https://www.msx.org/wiki/General_Purpose_port
(j'ai juste surligné en rouge la partie du circuit concernant le pin 6 du port joystick 1)
Pour en revenir à nos moutons numériques, on a bien 2 sources qui peuvent changer la tension 0V ou 5V de la partie rouge du circuit ?
- Un changement de valeur du bit 0 de R#15 (IOB0) : OUTPUT
- Un joystick connecté quand on appuis sur le 1re bouton (celui relié au pin 6) : INPUT
Comment ces sources de changement de tension peuvent cohabiter sur une même portion de circuit ?
(j'ai juste surligné en rouge la partie du circuit concernant le pin 6 du port joystick 1)
Pour en revenir à nos moutons numériques, on a bien 2 sources qui peuvent changer la tension 0V ou 5V de la partie rouge du circuit ?
- Un changement de valeur du bit 0 de R#15 (IOB0) : OUTPUT
- Un joystick connecté quand on appuis sur le 1re bouton (celui relié au pin 6) : INPUT
Comment ces sources de changement de tension peuvent cohabiter sur une même portion de circuit ?
On est toujours ignorant avant de savoir.
la partie rouge est déjà polarisée à 5V au travers de la résistance de 10K branchée entre la pin 6 et le 5V
quand on appuie sur le bouton on fait passer la valeur à 0V
pour que ça cohabite il faut bien brancher un joystick appuyer sur le bouton de tir et envoyer une donnée pour activer le bit 0 du port B en même temps, faut être tordu non
ça fait l'un ou l'autre suivant le besoin du programmeur
quand on appuie sur le bouton on fait passer la valeur à 0V
pour que ça cohabite il faut bien brancher un joystick appuyer sur le bouton de tir et envoyer une donnée pour activer le bit 0 du port B en même temps, faut être tordu non
ça fait l'un ou l'autre suivant le besoin du programmeur
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie