🎉 20 Ans du Forum WDA - 2004-2024 ! 🎉

Découvrez l'histoire et les moments marquants de notre communauté depuis 2004. Rejoignez-nous dans les célébrations !

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

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

Modérateur : Membres WDA

Règles du forum
N'oubliez pas; Présentez-vous ...
(Règlement interne du forum WDA)
Avatar du membre
Krapoutchik
Contrôle WDA
Contrôle WDA
Messages : 1068
Enregistré le : 01 juil. 2009, 08:00
Collectionneur (-euse) ? : Oui
Localisation : Paris

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

Message non lu par Krapoutchik »

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 ::( .
Flèche gauche code ASCII 08
Flèche gauche code ASCII 08
Escape code ASCII 1B
Escape code ASCII 1B
Chapeau code ASCII 5E
Chapeau code ASCII 5E
Point d'interrogation code ASCII 3F
Point d'interrogation code ASCII 3F
Tiret code ASCII 2D
Tiret code ASCII 2D
Espace code ASCII 20
Espace code ASCII 20
Point d'interrogation code ASCII 3F
Point d'interrogation code ASCII 3F
Esperluette code ASCII 26
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
Contrôle WDA
Contrôle WDA
Messages : 1068
Enregistré le : 01 juil. 2009, 08:00
Collectionneur (-euse) ? : Oui
Localisation : Paris

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

Message non lu par Krapoutchik »

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 lu par Lali35 »

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
Contrôle WDA
Contrôle WDA
Messages : 1068
Enregistré le : 01 juil. 2009, 08:00
Collectionneur (-euse) ? : Oui
Localisation : Paris

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

Message non lu par Krapoutchik »

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...
Avatar du membre
musovern
Messages : 3
Enregistré le : 20 avr. 2014, 11:43
Collectionneur (-euse) ? : Oui

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

Message non lu par musovern »

Hi there,

I would like to try this for my Apple II+ that the keyboard encoder has died.
Do you have a wiring digram so I could hook up the TIL311 display and test.

Regards

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

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

Message non lu par Krapoutchik »

Hello !

Sorry but i'm very, very, very far from my home. I 'll answer in mid september, be patient :pray: .
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
meridian
Messages : 3
Enregistré le : 18 mars 2020, 20:57
Collectionneur (-euse) ? : Oui

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

Message non lu par meridian »

Bonjour,

Je serais également très intéressé par le code et le schéma de connexion vers les TIL311 :)
Avatar du membre
Krapoutchik
Contrôle WDA
Contrôle WDA
Messages : 1068
Enregistré le : 01 juil. 2009, 08:00
Collectionneur (-euse) ? : Oui
Localisation : Paris

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

Message non lu par Krapoutchik »

Oops, en fait je me suis rappelé que je n'ai jamais fini le code car ayant récupéré une carte encodeur Videx.

Ceci dit il n'est pas très compliqué de finir le code car je ne l'ai pas trop mal documenté :boohoo: .
La principale difficulté est de programmer un Atméga 32 ou tout Atméga à 40 pattes. Pour ça il faut un Arduino uno ou similaire et lui installer un script de programmation, ce n'est pas bien compliqué mais il ne faut pas aller trop vite surtout pour la programmation des fusibles de l'Atméga à 40 pattes, et aussi pour choisir la fréquence d'horloge. Ici j'ai choisi la fréquence interne de 8 MhZ qui m'évite d'avoir recours à un quartz externe.

Je n'ai pas fait non plus de schéma mais on peut le déduire du code ici par exemple.

Code : Tout sélectionner

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
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
Les numéros de broches utilisés (A0...A7, 8, 9, ...14) se référent aux broches en bleu dans le schéma ci-dessous. Les pins 1 et 2 sont utilisées (broche 0 et 1 en bleu sur le schéma) pour le strobe normal et le strobe shifté mais dans la vrai vie on n'a besoin que d'un seul strobe, il suffit donc que l'instruction "digitalWrite(1,HIGH)" soit identique dans les 2 tests (le 1 ici redirige vers la pin 2).
Il faut aussi remplacer l'instruction Delay par delayMicroseconds (10) pour avoir un strobe de 10µs.
Le port C sur lequel on récupère la valeur ASCI en binaire est représenté par les broches en bleu 16 à 22 (16=bit 0, 22=bit 6).
atmega32.png
Enfin je n'ai pas fait de schéma pour le TIL311 non plus mais cette afficheur se connecte très simplement, les pattes Gnd (7) et +5 V (14 et 1), bien sûr et les 4 bits de données ABCD (3, 2, 13 , 12) pour le poids faible et ABC pour le poids fort sur le deuxième afficheur.
La broche 5 (LATCH STROBE INPUT) doit être au niveau bas en permanence pour que l'afficheur affiche en permanence ce qu'il reçoit sur les entrées ABCD.
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
meridian
Messages : 3
Enregistré le : 18 mars 2020, 20:57
Collectionneur (-euse) ? : Oui

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

Message non lu par meridian »

Je regarde tout ça
Merci :D
Répondre

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités