connecter un clavier ps/2 ou usb sur ancienne machine

Placez ici vos trucs et astuces, étalez sans retenue votre savoir-faire et votre science qui va nous permettre de redonner une apparence neuve et fonctionnelle à nos bouzes.

Modérateurs : Papy.G, fneck, Carl

nicolho
Messages : 409
Inscription : 10 nov. 2016 16:53

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par nicolho »

coconuts a écrit :A vrai dire j'esperais que Jim ferais une version usb du ckey...
Jim ? je vois pas... :)
La carte usb pour apple II n'utilise pas de zarlink mais un multiplexeur (pas examiné les détails)
arf dommage, ça aurait été intéressant, puisque c'est le sujet... un lien peut-être ?
L'interet du zarlink c'est qu'il permet de vraiment simuler la matrice clavier pas de prise de tete
une touche basse on connecte dans la matrice, une touche haute on deconnecte
restore ou reset on reset la matrice complete
euh oui, vu que tu ne l'avais pas fait, c'est ce que je me suis évertué à expliquer (et à contextualiser un minimum) dans mon précédent message (au prix d'une usure probablement inutile de mon clavier :D )
Je ne pense pas que l'on puisse simuler un clavier directment sur un port avec un arduino il faudrait attaquer
avec autre chose comme un arm ou un propeller (le probleme c'est qu'il faut des level shifter...)
...
la 1 cog s'assurerais de a surveillance de la matrice et enverrais les bonnes données dans un delai correct
Oui mais encore ?? (enfin, à part les références à des noms de produits pas forcément connus des lecteurs du forum). Pour répondre à Phil et Notator, j'essayais justement de lancer une discussion technique et plus concrète sur le sujet, notamment sur les problèmes qu'impliquent une implémentation de ce type (simulation d'une matrice clavier) avec un microcontrôleur seul, peu importe le modèle (et sans lien avec les possibilités de calcul ou de la gestion de l'usb.). Vu que tu as l'air d'être assez renseigné sur la question, tu en penses quoi de ce qui a été rapporté de StackExchange (ou ailleurs) et qui m'avait l'air plutôt pertinent ?
Le probleme du pic c'est de se remettre dedans... abandoné ca il y a prés de 6 ans... au profit de l'avr
ce qui faudrait trouver c'est un bon tutorial sur l'utilisation du mode 'peripherique'
C'est justement pour ça que je t'avais donné spécialement un lien direct vers le code source des exemples de Microchip. Parce que, en gros, c'est ça, la doc' (comme chez FTDI d'ailleurs...). Enfin au lieu de "je vais plutôt faire comme ci et comme ça, avec ceci ou cela", comme nous sommes sur un forum de discussion, j'espérais qu'on allait rentrer dans le vif du sujet (en même temps c'est vrai que tu ne t’adressais à aucun moment ni à "tu" ni à "vous", je sais pas de quoi je me mêle après tout, désolé)
coconuts

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par coconuts »

Chaque microcontrolleur different sinon ce n'est pas drole :)

je crois que le pic32 a un enviroment similaire a celui d'arduino
jete un oeil sur la doc du pic, je ne suis pas certain que ca fonctionne... les fonction en mode master
sont tres avancées par contre en mode master ca semble tres réduit...

Jim c'est Jim Brain... le propriétaire de go4retro il est sur la mailing list commodore depuis la nuit des temps
généralement les gens qui fréquente ces mailing list le connaissent (il est aussi sur la mailing list coco)

il a trouvé intelligent de gratter les composants...
mais en cherchant on trouve: CD4051 et CD74HC6067E

https://www.tindie.com/products/option8 ... apple-iie/

voila un lien mais ce n'est pas exactement la carte que j'ai
la carte que j'ai elle est géniale elle permet de faire fumer complètement le bus de l'apple II
donc surtout si vous en avez une entre les main ne la connectez pas sur un slot
il y a du cuivre sous le vernis épargne si le connecteur arrache le vernis on fait un court circuit...

beaucoup de claviers ne fonctionne pas avec cette carte c'est pour cela que j’étudie des solutions autre
que le max... (ca je pense que c'est un probleme dans la couche soft du max, il a peut être ete mis a jours)

l'usb est une couche soft qui va consommer beaucoup de cpu en même temps le cpu doit être a l'affut
des bon desirs du scan clavier pour répondre... dur a realiser sauf si le processeur est très rapide (arm)
ou si le microcontrolleur est multicore https://www.parallax.com/product/p8x32a-q44
le propeller a 8 cores appellés cog très limités et une memoire partagée
le propeller peut generer un signal video ou emuler des protocols
c'est une platforme très connue...

beaucoup de gens s'imagine qu'il suffit d'envoyer les données en fait le scan n'est pas un vrai read, il faut attendre
le bon vouloir du scan pour envoyer les données en prime quand le cpu fait autre chose il n'est pas sur le clavier
c'est toute la nature du clavier...

Dans le pire des cas en étant joueur on pourrais imaginer 2 avr lié par spi 1 s'occuperais de l'usb
et l'autre d'envoyer vers le scan (j'ai une idée en tete mais pas verifiée qui consisterais a générer une sorte de chip select
quand une seule des lignes est activé et le brancher sur une interruption....) mais il y a toujours un problème
on ne pourrais plus connecter le clavier d'origine (que l'utilisateur peut esperer reparer dans le futur...)
le zarlink permet de regler ca

pour info ce circuit: CD22M3494MQZ c'est un gros un MT8816 (même brochage)

pour le pic toujours le même probleme pas de doc precise sur l'utilisation en mode slave
il y a 2 mode slave l'ancien qui lui est incompatible et le nouveau dont la donc est vaporeuse
tout la doc porte sur le mode master pour acceder a des chips externe...

il y aurais une autre solution: avr + cpld (même probleme ca bloque le clavier d'origine)
nicolho
Messages : 409
Inscription : 10 nov. 2016 16:53

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par nicolho »

coconuts a écrit :pour info ce circuit: CD22M3494MQZ c'est un gros un MT8816 (même brochage)
c'est une blague?? c'est exactement le modèle que je t'ai proposé il y a 2 jours en fin de mon message, alors merci pour l'info :) (mais quand même un peu décourageant de répondre point par point et finalement d'avoir l'impression d'être lu en diagonale...).
C'est déjà sympa d'avoir été plus informatif concernant Jim ou le Parallax Propeller, ça permet au moins à ceux qui connaissent pas de mieux te suivre.

Bon, après avoir étudié la question plus loin, à la réflexion ça me paraît complètement possible de faire ça avec le seul pic32, si on configure bien les tâches. Et le scan du clavier, que ce soit celui fait par des machines assez anciennes, ou celui en USB (étudie d'abord le protocole) c'est plutôt tranquille niveau latence pour l'un, et débit pour l'autre... c'est pas de la video composite ou du gigabit ethernet ! Du coup je vais pas m'embêter à rentrer dans les détails, finalement j'ai vu que la documentation USB des PIC était très bonne, donc c'est comme le reste, je comprends pas bien...et personnellement j'en peux plus de ce monologue plein de jargon pas clair, voire un peu toc, du genre "le scan n'est pas un vrai read", "le cpu doit être a l'affut" (ou encore "quand le cpu fait autre chose il n'est pas sur le clavier"...et à quoi ça sert que les IRQ elles se décarcassent?!), "le mode master pour acceder a des chips externe" ... ma che "mode master" ?? ma quali "chips externe"? che cosa vuoi dire, esat-tamente ?! ma perche, tutto questo! ma daii! con chi stai parlando ?!! :mrgreen: :mrgreen: :mrgreen:
coconuts

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par coconuts »

si une interruption arrive trop tard elle ne sert a rien

Code : Tout sélectionner

 E4BE	iE4BE	LDY #$FF
 E4C0		STY $A6		; Key Image
 E4C2		INY
 E4C3		STY $98		; Flag: Print Shifted Chars.
 E4C5		LDA $E4		; 4.80: Flag: REPEAT Key Used, $80 = Repeat, $40 = disable
 E4C7		AND #$7F
 E4C9		STA $E4		; 4.80: Flag: REPEAT Key Used, $80 = Repeat, $40 = disable
 E4CB		LDX #$50
 E4CD	iE4CD	LDY #$08
 E4CF		LDA $E812
 E4D2		CMP $E812
 E4D5		BNE $E4CD
 E4D7	iE4D7	LSR
 E4D8		BCS $E4F9
 E4DA		PHA
 E4DB		LDA $E6D0,X
 E4DE		BNE $E4E6
 E4E0		LDA #$01
 E4E2		STA $98		; Flag: Print Shifted Chars.
 E4E4		BNE $E4F8
 E4E6	iE4E6	CMP #$10
 E4E8		BNE $E4F2
 E4EA		LDA $E4		; 4.80: Flag: REPEAT Key Used, $80 = Repeat, $40 = disable
 E4EC		ORA #$80
 E4EE		STA $E4		; 4.80: Flag: REPEAT Key Used, $80 = Repeat, $40 = disable
 E4F0		BMI $E4F8
 E4F2	iE4F2	CMP #$FF
 E4F4		BEQ $E4F8
 E4F6		STA $A6		; Key Image
 E4F8	iE4F8	PLA
 E4F9	iE4F9	DEX
 E4FA		BEQ $E504	; -	Process Key Image
 E4FC		DEY
 E4FD		BNE $E4D7
 E4FF		INC $E810	; PIA 1						CHIP
 E502		BNE $E4CD
j'ai aussi une version dont je n'ai pas parlé par certain cotés elle est idéale...
pas d'interruption, pas d'avr, pas de pic, pas de microcontrolleur
pourtant ca fonctionne en ps2 et avec un seul chip
du pur hardware mais pas moyen de changer la table de décodage

je vous laisse jouer avec un raspberry pi et du javascript...
puisque quand on lit les forum ça semble être la solution a tous les problèmes...


Craciun Fericit!!!
nicolho
Messages : 409
Inscription : 10 nov. 2016 16:53

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par nicolho »

Vous aussi, vous avez un ado à la maison ?... Bon, le nôtre est parti bouder dans sa chambre et il nous laisse en plan avec son exercice à solutionner.. (à c't'âge là, ça préfère jouer les snobs et rouler des mécaniques, au lieu de bosser son exposé :D ).

Pour ne pas rester sur ce gros "fail", dès qu'on demande un minimum d'argumentation technique au lieu d'affirmations vagues et creuses... j'ai retrouvé le code copié/collé dans le message qui précède (balancé comme ça, sans la moindre explication, et amputé du titre qui permettait de l'identifier, sans doute pour continuer d'entretenir le mystère ?..) il s'agit de la routine désassemblée du "scan clavier" de la rom du PET/CBM 8032, qu'on peut consulter ici (merci Google) : https://github.com/chitselb/pettil/blob ... .txt#L7402

Effectivement, quand on veut répondre dans les temps à ce scan (qui correspond en gros à "on active une des rangées de la matrice du clavier et on regarde quelle colonne est activée en même temps, comme ça on peut retrouver la touche à l'intersection des deux parce qu'elle les relie quand elle est enfoncée") c'est une bonne idée d'analyser le code qui, justement, est chargé d'effectuer ce scan.

On peut voir, dans les commentaires qui accompagnent la trentaine d'instructions de cette routine, qu'il est fait mention d'un certain "PIA 1". Ne connaissant pas le Commodore PET (à part de nom, ou en photo) et étant relativement néophyte en "ordinosaures", j'ai déjà commencé par me renseigner un minimum, chose relativement aisée vu qu'il s'agit d'une machine plutôt connue.

Voici, à chaque fois, le premier résultat obtenu dans un célèbre moteur de recherche pour ces termes :
- pet + "pia 1" : http://www.6502.org/users/andre/petinde ... .html#pia1
- pet + keyboard : http://www.6502.org/users/andre/petindex/keyboards.html
Soit des pages qui présentent, de manière à la fois claire et concise, respectivement la programmation des entrées/sorties de la serie PET, et une description en un petit paragraphe du fonctionnement du "scan" clavier, accompagné d'images et de tableaux pour les différents modèles (clavier "business" pour le CBM 8032).
- 8032 + schematics : ftp://www.zimmers.net/pub/cbm/pet/schem ... 029-03.gif
sur ce site qui propose de très nombreux schémas de ces machines, ainsi qu'une carte détaillée de la mémoire :
http://www.zimmers.net/cbmpics/cbm/PETx/petmem.txt

Donc ça permet, après quelques minutes de recherche, de savoir à quoi correspondent ces addresses mémoire dans la routine : les 10 rangs de la matrice sont "activés" via les 4 bits de poids faible du registre PORT A du PIA1 à l'adresse $E810, et les colonnes sont "lues" via les 8 bits du registres du PORT B à l'adresse $E812 (pout le cas du 8032, avec sa matrice clavier de 10x8).

Maintenant, pour l'assembleur 6502 de la routine, j'ai souffert davantage :oops: :mrgreen: (j'ai encore rien codé de ce genre, et je connais à peine les modes d'adressage, alors n'hésitez pas à corriger si je me trompe...). Mais j'ai essayé de mesurer la durée minimum séparant l'activation d'un rang et le test d'une colonne. Voici le cheminement le plus direct du code entre les deux (assez court effectivement), avec le nombre de cycles utilisés par le processeur entre parenthèses :

Code : Tout sélectionner

E4FF INC $E810 -> on active le rang suivant
E502 BNE $E4CD -> si on est pas revenu au rang 0 (je crois...), on saute      (3)
E4CD LDY #$08  -> on met Y à 8                                                (2)
E4CF LDA $E812 -> 1ère capture de l'état des colonnes de la matrice clavier   (4)
E4D2 CMP $E812 -> on verifie que cet état n'a pas changé à l'instant (mmoui??)
Donc, dans le pire des cas (selon le moment où le registre est effectivement lu pendant l'instruction LDA) ça fait dans les 8 cycles, à 1 MHz. Maintenant, si on prend un micro-controlleur AVR à 16Mhz type Arduino, celui-ci allant seize fois plus vite que le processeur du PET, ça lui fait 128 cycles pour simuler à temps une réponse de la matrice du clavier. Et d'après la doc de l'ATMEGA328P (paragraphe 11.7.1 , "Interrupt Response Time") une interruption matérielle lui prendra de 7 à 9 cycles (branchement à la routine d'interruption compris) avant qu'il éxecute la première instruction.

Au final, il resterait pas loin de 120 cycles à l'Atmega (ce qui, sur cette architecture, signifie presque autant d'instructions) pour tester un bit (correspondant au rang activé) et aller chercher un unique octet (dans un tableau de 10 valeurs représentant la matrice à simuler) à coller directement dans le registre d'un port de 8 sorties... bref, comme quoi, avec les interruptions matérielles, ça semble carrément jouable d'arriver à l'heure, coco !

Après, il faut voir comment faire cohabiter ceci avec la gestion simultanée d'une liaison vers un clavier externe en USB ou PS/2 (ou en SPI, I2C ou UART pour communiquer avec un autre module qui s'en occuperait), mais comme ces liaisons séries sont souvent gérées en partie matériellement (avec un tampon de données) on doit théoriquement pouvoir s'en occuper avec une priorité moindre.
Et si on excepte le court moment dévolu au "scan clavier" (qui a lieu, je crois, au début de l'affichage de chaque nouvelle image sur l'écran du PET) un micro-contrôleur récent doit avoir largement le temps de s'occuper de beaucoup d'autres choses, dans la majeure partie du trentième de seconde (soit environ 500000 cycles à 16MHz) qui sépare chaque rafraichissement d'écran.
Dernière modification par nicolho le 27 déc. 2016 23:07, modifié 1 fois.
Avatar de l’utilisateur
6502man
Messages : 12332
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par 6502man »

Le PIA est un grand classique des 8 bits, la sur les PET le PIA est un 6522 le grand copain du 6502 :lol:

J'avais commencé à étudié l'adaptation d'un module Arduino+clavier PS/2 pour remplacer un clavier externe de MSX, et le cas est un peu similaire avec en plus des bits de controls, j'avais réussi à envoyer des key codes au MSX par l'Arduino mais pas eu le temps de terminer et surtout le délai très court des interrogations de la matrice oblige à trouver une ruse ;)

Quelle est la vitesse de frappe d'un humain ?

En faite la matrice est parcouru plusieurs fois par secondes et bien plus vite que ce que peut taper un humain ?
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
nicolho
Messages : 409
Inscription : 10 nov. 2016 16:53

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par nicolho »

6502man a écrit :Le PIA est un grand classique des 8 bits, la sur les PET le PIA est un 6522 le grand copain du 6502 :lol:
Oui, en fait depuis peu, j'ai fait connaissance avec celui du MO5 (PIA6821) :) mais quelle que soit la puce qui gère les entrées/sorties, ça importe peu pour cette problématique du scan clavier.
J'avais commencé à étudié l'adaptation d'un module Arduino+clavier PS/2 pour remplacer un clavier externe de MSX...
le délai très court des interrogations de la matrice oblige à trouver une ruse ;)
encore des mystères.... :roll: quelle ruse ? ah c'est au conditionnel, je suppose :) . A priori, niveau fonctionnement ça doit être plus ou moins exactement pareil :D que ce que j'ai détaillé plus haut sauf que pour le MSX (si j'en crois la première page qui me tombe sous la main) on parle des ports B et C sur le PPI (évidemment! :P) et d'une matrice 11x8 :
http://www.angelfire.com/art2/unicorndr ... R-PPI.html
Sinon, retrouve-nous la routine désassemblée correspondante dans la rom du MSX. Pour étudier le fonctionnement, c'est le même principe.
EDIT : j'ai pas vraiment cherché, mais la routine (bios call) correspondante sur MSX se nomme SNSMAT
En faite la matrice est parcouru plusieurs fois par secondes et bien plus vite que ce que peut taper un humain ?
Euh bah oui.. déjà, comme je le disais à la fin, un scan complet est effectué à chaque nouvelle image sur l'écran du Commodore PET, ça fait donc du 25 ou 30 fois par secondes (selon la vitesse de rafraichissement).
Après, combien de temps dure le scan "rapide" et complet de la matrice ? Il faudrait calculer le nombre de cycles "consommés" par la boucle de scan dans sa totalité. Tout dépend de sa complexité. Pour la routine du PET postée plus haut, je dirais, au pifomètre, en moyenne une vingtaine de cycles par "cases" de la matrice, disons entre 1500 et 3000 cycles, soit quelques centièmes de secondes??.. à confirmer.
Dernière modification par nicolho le 28 déc. 2016 00:21, modifié 1 fois.
nicolho
Messages : 409
Inscription : 10 nov. 2016 16:53

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par nicolho »

6502man a écrit :J'avais commencé à étudié l'adaptation d'un module Arduino+clavier PS/2 pour remplacer un clavier externe de MSX, et le cas est un peu similaire avec en plus des bits de controls
ah pardon, désolé Phil, j'avais pas vu "clavier EXTERNE" (donc y'a un protocole série, j'imagine? si oui, forcément, c'est autre chose... ou alors, c'était un clavier externe branché sur les ports du clavier interne, comme il est question ici ? dans ce cas, tu pourrais nous en dire plus, ou pas :) )
J'ai vu aussi ton interface clavier externe TO8, et quelque chose de PS/2, je crois, dans le sujet TripleX (qui m'a pris deux plombes a lire en entier récemment :o ).

Comme cette "discussion" s'autodétruira après 30 jours d'inactivité, peut-être lance un sujet pour un projet concret qui t'intéresserait, en rapport avec le clavier ? Moi j'ai pas de projet clavier :P mais c'est toujours intéressant de se renseigner, d'échanger et de voir ce qu'on peut faire. Et surtout c'est cool de faire les trucs ensemble ! (comme ta réparation en cours :wink: )
Avatar de l’utilisateur
6502man
Messages : 12332
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par 6502man »

Oui mon projet était pour des claviers externes car c'est vraiment ce qui manque, on trouve souvent des unités centrales mais il manque la plus part du temps les claviers qui vont avec :roll:
Pour ma part j'ai au moins 3 ou 4 MSX comme ca, peut être même plus :wink:

Concernant le clavier MSX c'est pas du série mais plus comme les PET 8032 ou 8096 (clavier externe) mais le nombre de fils de la matrice à était réduit et des fils pour gérer les échanges rajoutés :roll:
Plus exactement 4 fils sont à double sens IN / OUT et il y a un fils STB qui défini le sens des signaux justement sur les 4 fils I/O, plus un fils CAPS.
La c'est de mémoire mais en gros c'est ca :
L'UC passe STB bas et intérroge un numéro de ligne
L'UC passe STB haut et lit l'octet correspondant à la ligne

la manuel service doit être plus précis :
PX-7
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
nicolho
Messages : 409
Inscription : 10 nov. 2016 16:53

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par nicolho »

Pour revenir sur une possible solution Arduino (ou AVR, branché directement aux entrées/sorties de la matrice), en regardant plus attentivement la doc de l'Atmega328P, à la rubrique 17.1 "Pin Change Interrupt Timing", il y a un magnifique diagramme qui nous montre qu'une interruption sera générée 2 ou 3 cycles après par un changement d'état sur une des pins (entrée ou sortie logique).
Donc la latence d'une l'interruption matérielle devrait finalement atteindre 9 à 12 cycles sur ce micro-contrôleur(et quelques cycles peuvent s'ajouter pour la lecture ou l'écriture des pins au niveau matériel).

Après, j'ai dit que ça me semblait carrément faisable, pas que c'était du tout cuit. Pour savoir ce qu'il en est concrètement, j'essaierai peut-être prochainement de faire de même avec mon MO5 (moins de 5 cycles à 1MHz pour détecter le scan clavier de la rom et y répondre !) pour voir comment ça se passe et éventuellement faire un retour d’expérience, avec des vrais détails techniques (sinon, quel intérêt ?).
6502man a écrit :...pour remplacer un clavier externe de MSX, ...
mais pas eu le temps de terminer et surtout le délai très court des interrogations de la matrice oblige à trouver une ruse ;)
Pas eu le temps.. pour respecter les timings ?? :P Donc, je suppose que tu n'avais pas trouvé cette fameuse ruse obligatoire.

Sinon merci pour le pdf du manuel du PX-7, ça, c'est d'la doc ! Avant même de le lire, je me suis plongé dans la rom du MSX pour faire la même chose que précédemment : compter les cycles d'instructions d'un nouveau processeur :) (pas de la tarte, parce qu'il paraît que les instructions du Z80 se chevauchent, mais pas toujours..), c'est du même ordre, mais sur un processeur qui tourne 3 fois plus vite...
J'ai vu ton fil concernant ce projet sur msxvillage (avec l'habituel gars qui répond "ouaih, j'l'ai fait avec un Atmel, ça marche pas trop mal, mais finalement j'l'ai fait en fpga, c'est mieux"... ça me rappelle tout à fait quelqu'un d'autre :roll: , on est ravi pour lui, mais niveau échange technique, c'est le néant).

Par contre, au delà de l'assembleur, la gestion hardware du connecteur clavier complique la donne avec des timings encore plus serrés ! Du coup, le procédé évoqué plus haut resterait possible mais difficile, ça nécessiterait un micro-contrôleur plus rapide (généralement en 3.3V, donc avec des levels shifter) et une programmation au quart de poil de c..arotte. :)
Du coup, autant se rabattre sur une solution plus simple. J'ai une idée (pas chère et pas folichonne :oops: ) pour que tu termines facilement ton adaptateur PS/2, mais comme je le disais, ça me fait un peu chier d'avoir pris la peine et le temps de donner toutes ces explications (écrites pour qu'éventuellement, quelqu'un en profite à l'avenir) dans un topic "de passage" qui va bientôt être effacé, et je préfère attendre que toi ou quelqu'un d'autre crée un sujet pérenne sur le forum, pour un éventuel cas concret (donc pourquoi pas pour ce projet MSX, quand t'auras le temps) a+
Daniel
Messages : 17426
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par Daniel »

Avec l'Arduino, il faut savoir que l'écriture d'un port de 8 bits est plus rapide que l'écriture d'un bit, et à fortiori 10 ou 20 fois plus rapide que l'écriture de 8 fois un bit. C'est bon à savoir quand le délai de réponse doit être court.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
Papy.G
Modérateur
Messages : 3054
Inscription : 10 juin 2014 13:40
Localisation : Haute-Garonne/Gers

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par Papy.G »

Nicolho> Oui, je vais br..ler des mouches, comme à mon habitude, mais quand-même, je vais tenter un truc, pour que ceux qui n'ont pas un niveau technique comprennent. :oops:

En gros, si la gestion de la matrice de touches passe par un buffer de port parallèle (PIA…), on peut espérer faire quelque chose simplement à base de microcontrôleur (rapide et programmé en code machine), mais si la matrice est mappée directement en mémoire, c'est mort, le temps de réponse risque d'être bien trop lent. Il faut aussi absolument que le port PS2 soit géré matériellement, par le microcontrôleur ou un composant externe.

N'existe-il pas de composant comme pour les afficheurs Led, où l'on puisse écrire avec le microcontrôleur des octets correspondants à la matrice, mais au lieu d'avoir un balayage interne pour alimenter les diodes par rangées (ou caractère), on réponde à un balayage externe (celui de l'ordinateur hôte), en fermant des contacts simulants les touches. S'il était bien question d'un tel composant plus haut dans cette discussion, pourquoi ne pas s'en servir au lieu de s'exposer aux risques liés à des timings limite. :cry:
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.
nicolho
Messages : 409
Inscription : 10 nov. 2016 16:53

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par nicolho »

Papy.G a écrit :je vais tenter un truc, pour que ceux qui n'ont pas un niveau technique comprennent. :oops:
Oula, personnellement, j'ai passé pas mal de temps à essayer d'être explicatif et en français normal, en évitant le jargon et les références lapidaires à des trucs obscurs. En contrepartie, surtout quand c'est pour étudier concrètement la question des latences (à la fois côté "vieille machine" et micro-contrôleur), c'est tout de suite plus fastidieux (et bourratif) que les déclarations mal ou pas étayées du tout auxquelles je faisais initialement réponse.
En gros, si la gestion de la matrice de touches passe par un buffer de port parallèle (PIA…), on peut espérer faire quelque chose simplement à base de microcontrôleur (rapide et programmé en code machine), mais si la matrice est mappée directement en mémoire, c'est mort, le temps de réponse risque d'être bien trop lent.
Je vois pas forcément la distinction entre PIA et "matrice mappée directement en mémoire", je m'explique (comme je peux) :
Les registres du PIA ne sont pas à proprement parlé en RAM, bien qu’adressés de la même manière par le CPU (via le bus partagé notemment par ces trois circuits/acronymes de trois lettres que je viens d'énumérer :) ).

Côté processeur, il ne s'agit que d’adresses qu'il va interroger sur le bus, chaque puce étant "câblée" pour répondre aux adresses qui la concernent, que ce soit le PIA, la ROM, la RAM, un gate-array...
Pour ce qui est du PIA, le contenu de ses registres, utilisés comme de simples "cases mémoire" côté programmeur, correspond immédiatement à l'état de ses lignes d'entrées/sorties lorsqu'il est interrogé, et par extension, on peut dire que ces lignes sont "mappées" en mémoire.

En ce qui concerne les fonctionnements que je connais (juste pour les avoir un peu étudié à l'occasion de cette discussion), la matrice clavier du PET et du MO5 est plus ou moins reliée en direct, parfois juste au travers de codeurs/décodeurs (qui permettent d'activer ou de lire une ligne à la fois, ce qui est suffisant pour chaque étape du "scan") donc le lien est quasi-instantané avec le registre, sans "bufférisation"ou cycle supplémentaire.

Mais ce n'est pas "mort" puisqu'il s'écoule un certain nombres de cycles d'horloge processeur (d'au plus quelques MHz pour les micros de cette génération) entre le moment où le processeur active un registre et en "capture" un autre, et c'est pour ça que je m'attardais à compter les cycles des routines en ROM (juste en me référant à la documentation, dans la mesure de mes faibles connaissances en la matière). Dans la plupart des cas, les instructions de lecture et d'écriture se suivent immédiatement dans le code, alors selon la vitesse du processeur ça laisse plus ou moins de marge de manœuvre avec un microcontrôleur qui exécute des instructions quelque dizaines de fois plus rapidement.
(pour le PIA du MSX, c'est la même chose sauf que ça se complique parce qu'après lui, l'électronique dédiée à sa gestion d'un bus bidirectionnel va temporiser l'activation de la matrice du clavier, ce qui raccourcit encore le délai au niveau du connecteur externe).
N'existe-il pas de composant ... où l'on puisse écrire avec le microcontrôleur des octets correspondants à la matrice...
S'il était bien question d'un tel composant plus haut dans cette discussion, pourquoi ne pas s'en servir au lieu de s'exposer aux risques liés à des timings limite.
Oui, il en était tout à fait question puisque coconuts avait évoqué dès le départ son usage dans des circuits de simulation de clavier existants (dont les siens), et j'avais par la suite décrit son fonctionnement : le "crosspoint zarlink" (ou plus communément "analog switch array").
Ca parait en effet le plus simple, puisqu'on n'a pas à se soucier des contraintes de réactivité côté ordinateur, surtout quand on s'occupe déjà de simuler logiciellement du PS/2 (ce qui est moins un problème quand on utilise une interface en partie gérée matériellement, genre UART, SPI, ou USB quand c'est le cas).

Mais à la différence d'un clavier, je ne crois pas qu'il soit équipé de diodes pour éviter les phénomène gênants de touches "fantômes" ou de "masquage" (voir les multiples explications disponibles sur Internet, par exemple http://www.dribin.org/dave/keyboard/one_html/) qui se produisent lors de l'usage simultané de plus de 2 touches (d'après son manuel, le clavier du MSX PX-7 en a quelques unes pour gérer spécifiquement les combinaisons du type [GRAPH]+[SHIFT]+[autre touche sur les mêmes colonnes que les deux précedents]).

On peut aussi se servir d'un petit FPGA ou CPLD pour simuler efficacement la matrice, mais utiliser un programme dans un microcontrôleur (éventuellement accompagné de petits composants et circuits logiques plus basiques), en plus d'apporter plus de facilité et une souplesse dans la (re)programmation de l'interface série, relève davantage de l'économie de composants et tout simplement de moyens qui caractérise depuis toujours toute la production électronique, même la plus simple, et d'ailleurs un certain Steve Wozniak a connu un certain succès avec ce genre de complication (ou raffinement, c'est selon), alors qu'il se serait moins pris la tête en utilisant une puce dédiée à la gestion de tel ou tel périphérique, pour un surcoût très relatif... tout ça pour se la péter, évidemment ! :P
Avatar de l’utilisateur
Papy.G
Modérateur
Messages : 3054
Inscription : 10 juin 2014 13:40
Localisation : Haute-Garonne/Gers

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par Papy.G »

Je ne considère pas qu'un clavier soit mappé en mémoire dès lors qu'il lui faut écrire un port avec une instruction de transfert, pour lire ensuite, avec une autre instruction de transfert. Cela prend beaucoup moins de temps lorsque, comme cela semble être le cas du PET, et du MO5, on active les lignes directement avec les lignes adresses du bus système, on n'a, du coup, qu'à faire une lecture à une adresse donnée. Ce genre de lecture donne beaucoup moins de temps à un microcontrôleur pour sauvegarder ses registres, accéder au vecteur d'interruption, lire le port d'entrée, récupérer la valeur adéquate et la renvoyer sur son port de sortie. Avec un microcontrôleur seulement dix fois plus rapide que le processeur à duper, ça peut s'avérer tendu tout de même, il faut donc, comme tu l'as indiqué, vérifier les timings au cas par cas.

Je rappelle, des fois que certains moins avancés suivent encore cette discussion :mrgreen: , que la différence entre les 1MHz d'un 6502 et les 16MHz d'un microcontrôleur ne donneront pas systématiquement un rapport de 1 pour 16 en terme de rapidité d'exécution des instructions. Pour l'AVR je ne sais pas ce qu'il en est, mais rares sont les µC et Processeurs qui exécutent une instruction par cycle horloge.
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.
nicolho
Messages : 409
Inscription : 10 nov. 2016 16:53

Re: connecter un clavier ps/2 ou usb sur ancienne machine

Message par nicolho »

Je viens de voir que le sujet avait été déplacé dans cette rubrique, merci aux admins pour leur écoute et/ou leur intérêt, c'est sympa.
Papy.G a écrit :Je ne considère pas qu'un clavier soit mappé en mémoire dès lors qu'il lui faut écrire un port avec une instruction de transfert, pour lire ensuite, avec une autre instruction de transfert.
ok très bien, c'est juste que comme tu disais exactement "...passe par un buffer de port parallèle (PIA…)," , tu laissais entendre (pas forcément ton intention) que c'était une caractéristique propre aux PIA mentionnés, sans quoi je ne me serais pas embêté à démontrer concrètement le contraire :)
Cela prend beaucoup moins de temps lorsque, comme cela semble être le cas du PET, et du MO5, on active les lignes directement avec les lignes adresses du bus système, on n'a, du coup, qu'à faire une lecture à une adresse donnée..
Je ne sais pas à quelle autre machine tu opposes ce fonctionnement, mais c'était bien le cas que j'ai explicité pour ces ordinateurs. Plus précisément (au risque de me répéter un paquet de fois) c'est généralement une écriture dans un registre suivie immédiatement d'une lecture dans un autre. Le reste des observations présentées concernant le fonctionnement matériel n'étaient d'ailleurs pas des impressions, mais faites après une étude attentive des schémas électroniques et de la documentation de ces circuits intégrés (même si je peux comprendre de travers :) ).
Ce genre de lecture donne beaucoup moins de temps à un microcontrôleur pour sauvegarder ses registres, accéder au vecteur d'interruption, lire le port d'entrée, récupérer la valeur adéquate et la renvoyer sur son port de sortie.
Après ça, il doit plus nous rester beaucoup de lecteurs :mrgreen:
Oui, c'est court mais plutôt que de me contenter d'un "on a beaucoup moins de temps qu'avec un système de transfert plus lent" ou encore "les interruptions vont arriver en retard", j'ai essayé, pour faire avancer la discussion, de quantifier concrètement ces contraintes de timings, parce que je trouve ça plus constructif et positif (moins démotivant que "ça peut s'avérer tendu" et moins définitif que "c'est mort" sans confirmation du médecin légiste :D )
Pour l'AVR je ne sais pas ce qu'il en est, mais rares sont les µC et Processeurs qui exécutent une instruction par cycle horloge.
Très juste, mais je m'auto-cite : "Au final, il resterait pas loin de 120 cycles à l'Atmega (ce qui, sur cette architecture, signifie presque autant d'instructions)...". J'évoquais justement cette particularité de l'AVR (qui lui a même valu une récompense je crois) dont la quasi-totalité des instructions s’exécutent en un seul cycle d'horloge.

D'où cet optimisme (s'appuyant à la fois sur l'analyse du code et les spécifications exactes de l'Atmega328P en terme de latence pour le traitement des interruptions matérielles) concernant une possible utilisation dans le cas du PET et sa routine clavier en rom (le morceau d'assembleur porté à notre attention, que je n'ai pas choisi), généreuse en cycles surtout grâce aux deux instructions intermédiaires de la boucle analysée (BNE puis chargement du compteur LDY, voire même une seconde chance avec l'anti-glitch du CMP... voilà pour ma participation au challenge "TIC et TOC" :P ).
En effet, pour un programme procédant plus directement (écriture puis lecture immédiate), on aurait déjà deux fois moins de temps...

Mais je ne faisais que répondre aux questions sur la "faisabilité avec un Arduino", aux craintes un peu trop exagérées concernant le délai des interruptions, et spécifiquement sur le cas de figure présenté, sans forcément généraliser, même si le recours à une puce plus rapide peut assouplir ces contraintes. Et toutes les précautions que tu nous as indiquées pour éviter une extrapolation simpliste de ce cas de figure sont de mises.
Répondre