[Info] - Remplacement APPLE 2+ keyboard encoder KR3600-070

Questions génériques informatiques, vos tutoriaux ou vos astuces de restaurations...

Modérateurs : Membres WDA, Modérateurs complets

Avatar du membre
Krapoutchik
Bureau WDA
Bureau WDA
Messages : 886
Enregistré le : 01 juil. 2009, 08:00
Collectionneur (-euse) ? : Oui
Localisation : Paris

[Info] - Remplacement APPLE 2+ keyboard encoder KR3600-070

Message non lupar Krapoutchik » 20 janv. 2017, 23:00

Dans le dernier épisode je remplaçais le clavier de mon Apple 2+ et son encodeur HS par un Arduino et un clavier PS/2.
Bon , OK, ça marche mais on perd complétement l'esprit de la machine et c'est super moche :eek: .

Au risque de me répéter, l'encodeur est absolument introuvable, il y a effectivement quelques rares annonces sur le net mais soit ce sont des encodeurs HS ou douteux vendus au prix de l'or soit ce sont des encodeurs n'ayant pas la même table de caractère que l'Apple 2+ (KR3600 ne terminant pas par "-070) donc inutilisables.

Comme on n'est jamais si bien servi que par soi-même, j'ai décidé de contourner le problème de la façon la plus élégante possible en reconstruisant un encodeur s'insérant entre le clavier d'origine et la carte mère.
J'aurai bien aimé remplacer le KR3600 directement par un microcontrôleur mais cela nécessitait de charcuter sauvagement la carte encodeur et ça c'est c'est Le Mal ::twisted: .

Le seul souci immédiatement rencontré est que pour gérer convenablement le clavier du 2+ il faut 28 pattes d'entrées/sorties (matrice 10X5 = 15, touches shift, ctrl, reset et rept = 4, bus de donnée + strobe + reset = 9).
En rusant on peut gagner 3 pattes mais c'est toujours trop par rapport aux 23 pattes d'E/S d'un arduino classique basé sur un mega 328 (nano, uno, duemilanove...).
Ne voulant pas rajouter de circuit externe et pour rester simple je me suis finalement dirigé sur un Atméga 32 qui comporte 32 E/S, le grand confort :drunken: !

Pour programmer un Atmega vierge (sans bootloader donc) c'est super simple !
Il suffit d'utiliser un arduino sur lequel on va charger un programme qui va permettre de programmer n'importe quel Atmega de n'importe quel référence , elle est pas belle la vie :banana: ?!
En prérequis il faut télécharger le core de l'Atmega utilisé (ATmega1284, 644, 324, 164, 32, 16 et 8535 ), j'ai utilisé la bibliothèque de cores MightyCore à cet endroit https://github.com/MCUdude/MightyCore (aller dans la section installation en bas de page) avec une version de l'IDE Arduino en V1.6 minimum.
Comme je ne voulais pas m’embêter avec des composants externes, j'ai programmé l'Atméga32 pour utiliser son oscillateur interne à 8 Mhz plutôt qu'un quartz externe.

Je n'ai pas encore fini toute la programmation mais pour obtenir le résultat ci-dessous il faut une quarantaine de lignes dont la majeure partie est utilisée par plusieurs tableaux de définitions des touches.
J'ai utilisé la bibliothèque KEYPAD qui permet très facilement de gérer un clavier matricé de n'importe quel taille.
Il va encore me rester encore plein de place pour rajouter des petits trucs sympas, gérer un clavier externe de type PS/2 par exemple et/ou ajouter un port série pour rentrer des données avec un PC externe en mode terminal :drunken: .

L'arduino Nano sur la partie gauche n'est là que pour programmer l'Atmega32, une fois le projet finalisé il n'y aura plus que l'Atmega32, une résistance, un condo et 2 connecteurs.
On voit bien le caractères ascii (afficheur de gauche) et son code affiché (afficheurs de droite).
La led rouge montre un strobe avec un caractère shift, la led verte montre un strobe avec un caractère normal sans shift.
Tout en bas le vilain encodeur APPLE dont le KR3600-070 est mort ::( .

fleche gauche-08.JPG
Flèche gauche code ASCII 08

escape-27.JPG
Escape code ASCII 1B

chapeau-5E.JPG
Chapeau code ASCII 5E
interrogation-3F.JPG
Point d'interrogation code ASCII 3F

Tiret-2D.JPG
Tiret code ASCII 2D
space-20.JPG
Espace code ASCII 20
interrogation-3F.JPG
Point d'interrogation code ASCII 3F
esperluete-26.JPG
Esperluette code ASCII 26


Et hop, le code que j'utilise, il n'est pas terminé mais le plus gros est fait :8: .

Code : Tout sélectionner

/* @file HelloKeypad.pde
|| @version 1.0
|| @author Alexander Brevig
|| @contact alexanderbrevig@gmail.com
||
|| @description
|| | Demonstrates the simplest use of the matrix Keypad library.
|| #

Modifié par olivier LIPPMANN 20/01/2017
Remplacement de l'encodeur clavier APPLE 2+ KR3600-70  par un ATMEGA 32
Jeux de caractère normal et shift OK
Reste à faire jeux de caractère et détection avec touche Ctrl
on peut aussi retirer 0x40 de tous les caractères entre 0x41 et 0x5F si manque de mémoire

Reste à faire envoi du reset calibré sur détection des touches Reset et Ctrl
Reste à faire fonction repeat avec la touche RPT

Attention le caractère 0x00 est interdit car il pose des soucis avec le Pascal sur Apple, remplacé par 0x20
*/

#include <Keypad.h>

boolean shift = 0 ;
const byte ROWS = 10; //10  rows
const byte COLS = 5; //5 columns
char keys[ROWS][COLS] = {
  {0x2D,0x50,0x15,0x2F,0x0D},
  {0x3A,0x4F,0x08,0x2E,0x20},
  {0x30,0x49,0x3A,0x2C,0x20},
  {0x39,0x55,0x4C,0x4D,0x20},
  {0x38,0x59,0x4B,0x4E,0x20},
  {0x37,0x54,0x4A,0x42,0x41},
  {0x36,0x52,0x48,0x56,0x1B},
  {0x35,0x45,0x47,0x43,0x31},
  {0x34,0x57,0x46,0x58,0x32},
  {0x33,0x51,0x44,0x5A,0x53}
};
const byte ROWS2 = 10; //10 rows
const byte COLS2 = 5; //5 columns
char keys2[ROWS2][COLS2] = {
 {0x3D,0x40,0x20,0x3F,0x20},
  {0x2A,0x20,0x20,0x3E,0x20},
  {0x20,0x20,0x2B,0x3C,0x20},
  {0x29,0x20,0x20,0x5D,0x20},
  {0x28,0x20,0x20,0x5E,0x20},
  {0x27,0x20,0x20,0x20,0x20},
  {0x26,0x20,0x20,0x20,0x20},
  {0x25,0x20,0x20,0x20,0x21},
  {0x24,0x20,0x20,0x20,0x22},
  {0x23,0x20,0x20,0x20,0x20}
};
byte rowPins[ROWS] = {A0, A1, A2, A3,A4,A5,A6,A7,14,13}; //connexion des rangées du clavier normal
byte colPins[COLS] = {12, 11, 10,9,8}; //connexion des colonnes du clavier

byte rowPins2[ROWS2] = {A0, A1, A2, A3,A4,A5,A6,A7,14,13}; //connexion des rangées du clavier shift
byte colPins2[COLS2] = {12, 11, 10,9,8}; //connexion des colonnes du clavier

Keypad clav = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
Keypad clavshift = Keypad( makeKeymap(keys2), rowPins2, colPins2, ROWS2, COLS2 );


void setup(){
 
  DDRC = B01111111; // bit 0 à 6 du port C en sortie
  pinMode(1, OUTPUT); // pin 2 en sortie
  pinMode(0, OUTPUT); // pin 1 en sortie
  pinMode(15, INPUT_PULLUP); // pin 15 en entrée touche shift
}
 
void loop(){
  char key = clav.getKey(); // récup de la touche appuyée dans la variable key
  char key2 = clavshift.getKey(); // récup de la touche appuyé avec shift dans la variable key2
  shift = digitalRead(15); // on lit la touche shift

// simulation strobe  de 700 ms avec jeux de caractère normal  , led verte sur pin 1
// Si key et shift vrai, on exécute la suite du IF
  if (key && shift){   
    PORTC = key; // on allume les bits du PortC avec la valeur de key
    digitalWrite(0,HIGH); // on envoie le strobe sur la led verte pin 1
    delay (700);   // la led reste allumée 700 ms
    digitalWrite(0,LOW); // on éteint la led verte
  }

// simulation strobe de 700 ms avec jeux de caractère shift  , led rouge sur pin 2
// le vrai Strobe ne dure que 10 microseconde
// !shift car on détecte un niveau 0, un coté de la touche shift est relié à la masse
// si key2 et l'inverse de shift est vrai on exécute la suite du IF
   if (key2 && !shift){   
    PORTC = key2;
    digitalWrite(1,HIGH); // on envoie le strobe sur la led rouge pin 2
    delay (700);
    digitalWrite(1,LOW);
  }
}
Tektronix 454A, Atten ADS 1102CAL Powa !!
Born to bricole
[Rch] Vieux composants électroniques et circuits intégrés toute époque et vieilles cartes à microprocesseur
Ma petite collection...
Tutoriel pour insérer des photos...

Avatar du membre
Krapoutchik
Bureau WDA
Bureau WDA
Messages : 886
Enregistré le : 01 juil. 2009, 08:00
Collectionneur (-euse) ? : Oui
Localisation : Paris

Re: [Info] - Remplacement APPLE 2+ keyboard encoder KR3600-070

Message non lupar Krapoutchik » 28 janv. 2017, 23:46

J'ai eu quelques questions...

1 - L'atmega32 décode les touches du clavier et envoie le résultat de la touche frappée sur 7 bits.

2 - Ces 7 bits sont décodés par les afficheurs de la breadboard inférieur. Le quadruple afficheur de gauche ne sait afficher que des caractères affichables tandis que les 2 de droite affichent le code ASCII du caractères envoyé. Ces afficheurs ne sont là que faciliter le débuggage. En zoomant sur la photo on voit bien les 7 bits de données, 3 fils noirs + 3 fils jaunes + 1 fil rouge ::wink: .

3 - Le signal Strobe : Il sert à signaler à l'Apple 2 qu'un nouveau caractère vient d'arriver. Le décodeur clavier envoie le caractère sous forme d'un mot de 7 bits puis envoie le strobe (pulse positive) d'une durée de 10 µs. Cette pulse positionne une case mémoire à 1 sur la carte mère. La routine d'acquisition va regarder à intervalle régulier si la case mémoire contient un 1, si oui , elle va prendre en compte le caractère puis remet à zéro la case mémoire, si non, la routine continue son job et reviendra voir quelques millisecondes plus tard si un nouveau caractère est arrivé.

4 - Pour faciliter le débuggage j'ai volontairement exagéré la durée du strobe à 700 ms pour pouvoir le voir car avec la valeur normale de 10µs je n'aurai rien vu du tout :doh: . De même, il n'y a qu'un seul strobe quelque soit la combinaison de touche frappée sur le clavier. J'ai rajouté un petit bout de code pour visualiser le strobe avec un appui sur la touche shift (led rouge) ou non (led verte) mais ce bout de code sera supprimé dans la version finale.

5 - Non, :naughty: la carte encodeur d'origine en bas des photos n'est pas raccordée au montage et n'est là que pour information :mrgreen: .
Tektronix 454A, Atten ADS 1102CAL Powa !!
Born to bricole
[Rch] Vieux composants électroniques et circuits intégrés toute époque et vieilles cartes à microprocesseur
Ma petite collection...
Tutoriel pour insérer des photos...

Avatar du membre
Lali35
Posteur habitué
Posteur habitué
Messages : 15
Enregistré le : 07 févr. 2017, 11:31
Collectionneur (-euse) ? : Non

Re: [Info] - Remplacement APPLE 2+ keyboard encoder KR3600-070

Message non lupar Lali35 » 08 févr. 2017, 18:02

Woo je suis impressionné par ce travail précis et minutieux !

En fait si je comprends bien, ça va te permettre d'encoder plus facilement ? et tout ça via ton clavier ? (peut-être que mes questions sont idiotes, j'ai peur de mal comprendre :) )
Je suis en train de me renseigner sur le code en informatique et toutes ces techniques. Je cherche aussi des infos pour apprendre la programmation comme ici. C'est pour ça que je pose des questions, puisque les histoires de claviers m'intéressent également :).

Comment de temps ça a duré pour réaliser tout ça ?
Modifié en dernier par Lali35 le 15 févr. 2017, 17:42, modifié 1 fois.
It's me

Avatar du membre
Krapoutchik
Bureau WDA
Bureau WDA
Messages : 886
Enregistré le : 01 juil. 2009, 08:00
Collectionneur (-euse) ? : Oui
Localisation : Paris

Re: [Info] - Remplacement APPLE 2+ keyboard encoder KR3600-070

Message non lupar Krapoutchik » 12 févr. 2017, 13:31

Le clavier en lui-même n'est qu'un assemblage de switchs connectés à l'intersection de fils électriques formant une matrice. Par exemple avec 10 fils verticaux et 5 fils horizontaux on a une matrice de 10 X 5 permettant de connecter 50 touches, une matrice de 8 X 8 pouvant connecter 64 touches...
Grosso modo un encodeur clavier est une interface entre des touches claviers et l'ordinateur. Il détecte l'appui sur une touche et transforme cette information en un code unique (généralement sur 7 bits) compréhensible par l'ordinateur.

L'encodeur peut être inclus dans le clavier et envoyer l'information en série (prise PS/2) ou en USB sur l'ordinateur, clavier de PC par exemple.

L'encodeur peut être séparé du clavier et envoyer l'information en parallèle (mot de 7 ou 8 bits) vers l'ordinateur. C'est très souvent le cas des vieux micros des années 70-80 où l'on achetait une carte mère nue puis on rajoutait un clavier et un encodeur générique fabriqué par un autre constructeur, ce clavier et cet encodeur pouvant être utilisé sur d'autres ordinateurs n'ayant rien à voir entre eux.
Cette manière de procéder est très souple car il suffit que la carte mère "traduise" le code envoyé par le clavier en un code compréhensible par l'UC.
Cette traduction est très facile a réaliser, le moyen le plus simple est d'utiliser une Eprom dont on peut très rapidement modifier le contenu pour l'adapter à des claviers de langues différentes. Un autre moyen encore plus souple est de charger en mémoire vive une table de traduction à l'aide de fichiers correspondant chacun à une langue différente ( le fameux KEYB FR pour un clavier français ou KEYB RU, clavier russe, dans l'autoexec.bat des PC sous MS-DOS).

L'encodeur peut être aussi inclus dans la carte mère, celui pouvant être utilisé à d'autres taches quand le clavier n'est pas utilisé. Cette technique a été très utilisée dans les années 80-90 pour des micros familiaux (Oric, Sinclair, Thomson...), essentiellement pour des raisons de coût.

J'ai passé pas mal de temps. D'abord à réfléchir et à collecter de l'information puis une après midi à trouver dans mon fourbi et connecter des afficheurs permettant de visualiser le code envoyé, ces afficheurs évitent de connecter ma bidouille à mon Apple 2+, me font gagner de la place et permettent une plus grande souplesse dans mes tests.
Une autre après midi pour faire une ébauche de code à charger dans l'Atméga et à tester avec un vrai clavier.
Et encore plusieurs heures à venir pour finaliser le code, souder tous les éléments entre eux et pourquoi pas réaliser un circuit imprimé :8: .
Tektronix 454A, Atten ADS 1102CAL Powa !!
Born to bricole
[Rch] Vieux composants électroniques et circuits intégrés toute époque et vieilles cartes à microprocesseur
Ma petite collection...
Tutoriel pour insérer des photos...


Retourner vers « Classe Info, Restauration, Tutoriaux... »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité