Login
Utilisateur :
Mot de passe :
Nouveau ?
Accueil
 
Sasfépu
sasfepu
Matériels
Logiciels
Littérature
Articles de presse
Publicités
Téléchargements
 
Interviews
Pierre Lafitte
Jean Fontayne
 
Emulateurs
MESS
dchector
VB Hector
 
Projets
wav2hec
hec2wav
hecdump
émulateur
cable péritel
Hectorduino
Hectorduino & vidéos
 
Webmestre
 Laisser une Bafouille

Liens
 


HECTOR-DUINO
HECTORDUINO

 

Liste du matériel

  1. Platine Arduino
  2. Ici le choix s'impose de lui-même: Il faut une platine MEGA 2560:

    Pourquoi ce choix? Deux raisons:

    1. Elle se pilote en 5V compatible TTL, comme les entrées/sorties (E/S) d'Hector!
    2. Elle possède suffisamment d'entrées / sorties (ce qui n'est pas le cas de l'UNO)

    ATMEGA

  3. Associé à la platine Arduino et pour plus de praticité je conseille l'utilisation d'une platine vierge. Elle permet plus simplement de connecter les signaux (nombreux) de ce montage et se plug sur la Mega.
  4. Platine vierge

  5. Un cordon Centronics 36 points -> DB25
  6. Personnellement j'ai récupéré un cordon d'imprimante de PC en liaison parallèle que j'ai modifié pour avoir tous mes signaux. Ensuite j'ai raccordé la DB25 femelle sur la platine. évidement, vous pouvez allez directement de la Centronics 36 points à la platine Arduino!

    Centronics 36 points => DB25

    L'intérêt de la DB25 femelle était dans l'utilisation d'une prise à visser pour les essais.

    DB25 femelle à visser

    Maintenant j'ai gardé cet ensemble (Cordon Centronics 36 -> -> DB25 + la DB25 femelle raccordé à la platine Arduino, (OK C'est horriblement cher, 30€ au détail, mais très pratique pour des essais !)

  7. un TTL 74LS74
  8. 74LS74

  9. un lecteur de carte SD :
  10. lecteur de carte SD

  11. Un connecteur HE10 - pratique pour connecter le lecteur SD:
  12. Connecteur HE10

  13. Un Hector HRX !
  14. HEctor HRX

 

Le schéma

Détail sur le raccordement du 74LS74:

Explications

PA0 à PA7

D'abord nous avons les signaux en provenance d'Hector sur 1 octet. Les broches 2 à 9 de la Centronics 36 points d'Hector sont raccordés aux pin 22 à 29 de l'Arduino. Les connections intermédiaires (DB25), comme je le disais, sont optionnels si vous allez directement de la Centronics à la platine Arduino.

PB0 à PB7

Maintenant les signaux vers Hector sur 1 octet. Les broches 49 à 42 de la platine Arduino aux broches 36, 35, 34, 13, 16, 17, 18, 33 de la Centronics 36 points d'Hector. Attention à l'ordre de ces connexions !

RAZ

Il existe un signal RAZ en provenance d'Hector vers la platine Arduino et un autre qui sort de la platine pour aller initialiser les mémoires 7474. Nous avons donc les raccordements de la broche 31 de la Centronics 36 d'Hector à l'entrée 9 de la platine Arduino. Ensuite nous avons le signal de RESET qui ressort de la platine (pin 8) et part vers la raz des 2 mémoires 74LS74 sur les broches 1 et 13,

Mémoire d'écriture d'Hector:

Lorsque Hector écrit une donnée sur le port A, il valide son octet en donnant un pulse sur le PC2 (Port C bit 2 du 8255 d'Hector broche 21), ce qui mettra la 1ere mémoire du 7474 à 1. L'état de cette mémoire et renvoyé à Hector (PC5 - pin 23 de la Centronics d'Hector) pour qu'il soit au courant de la prise en compte de l'octet. Il est également envoyé à la platine pour l'avertir de cet octet (pin 3 Arduino), Enfin lorsque la platine à pris en compte cet octet, elle génère un pulse (pin 11 de la platine Arduino), ce qui remet à 0 la mémoire.

Mémoire d'écriture d'Arduino:

C'est exactement le même principe mais dans l'autre sens: Arduino vérifie qu'Hector à récupéré l'octet précedent pour il mets en place son nouvel octet (PB0-7) et set la seconde mémoire du 7474 (Pin 13 d'Arduino => pin 4du 7474). La sortie du 7474 est renvoyé à Hector (PC4 d'Hector, broche 25 de la Centronics 36) et à l'Arduino (pin 2 de l'Arduino). Hector, lorsqu'il a pris en compte l'octet il remet à 0 la mémoire par un pulse par PC1 (broche 22 de la Centronics 36).

Raccordement SD:

Ici c'est le schéma classique que l'on retrouve sur Internet, mais pour une 2560:

Signal Pin Arduino
Masse -> OV
MISO -> 50
SCK -> 52
MOSI -> 51
CS -> 53
+ -> 5V

Remarque: J'ai utilisé un lecteur qui ne possède ni de buffer ni d'adaptation de signaux (5V -> 3,3V)

Cela fonctionne mais je crains que ce ne soit pas correct. Prenez plutôt un lecteur SD avec adaptation des signaux comme celui ci :

Par contre je n'ai pas essayé...

Photo de mon montage :

Mon montage présenté ici a un avantage et un inconvénient:

Le montage est moche et pas forcément fini: il devra un jour être soudé et faire disparaitre la bread board... L'avantage est qu'il fonctionne!

Alors c'est parti pour les photos:

Ici on voit le raccordement des 2 octets entrant et sortant ainsi que le raccordement de la SD :

La carte SD

Logiciel

Il y a deux Softs: Le microcode qui se loge dans Hector et le code de l'Arduino.

Le microcode:

Il est issu du microcode du Disc2. Il été remanié de façon à répondre aux caractéristiques de l'Arduino.

Gosso modo le microcode se compose d'un corps qui reçoit les commandes de l'Arduino et ensuite des fonctions qui sont demandées par la platine. Toutes le commandes envoyé par la platine sont composées d'un code fonction et ensuite, selon la fonction, de la réception d'un octet ou d'un mot, de renvoyer un octet etc. Par exemple le code 4 permet d'effacer l'écran ( c'est ce code qui est envoyé lorsque l'on tape "CLS", Aucun paramètre n'est passé et la fonction se contente d'effacer l'écran et de rendre la main.

Le code 6 permet d'afficher un caractère à l'écran.On envoi donc le code 6 suivi d'un octet qui sera affiché à l'écran.

Ces différentes fonctions sont indexées dans une table de vecteur.

Le sketch Arduino2

De base j'ai quelques fonction de "bios" : Lecture et écriture. Elle permettent le dialogue de base avec Hector: On envoi un octet ou en en reçoit un.

* Lecture : On regarde si l'entrée disant qu'un octet a été écrit, si oui, on le récupérer et on fait un créneaux sur le raz de la mémoire:

bool Lecture(byte *Val ){
bool Retour = false;

if ( digitalRead(I_READ_Pin) ) { // Octet dispo ?
*Val = PINA;
digitalWrite(RAZ_READ_Pin, LOW);
digitalWrite(RAZ_READ_Pin, HIGH);
Retour = true;
}

return Retour;
}

Le créneau de raz de la mémoire 7474 peut se faire d'une instruction à l'autre, c'est suffisant pour que la porte TTL change d'état. A noter que l'on travaille avec des signaux Arduino TTL en logique inverse. C'est pourquoi on passe à 0 la sortie pour la remonter...

* Ecriture : On regarde si Hector a bien lu l'octet précédent (mémoire à 0), alors on écrit l'octet et set la mémoire.

bool Ecriture(byte Val ){
bool Retour = false;

if ( !digitalRead(I_WRITE_Pin) ){ // pas d'ecriture en cours ?

PORTL = Val;
digitalWrite(SET_WRITE_Pin, LOW);
digitalWrite(SET_WRITE_Pin, HIGH);
Retour = true;
}
return Retour;
}

Suite à ces 2 instructions je suis maintenant capable d'envoyer le microcode à Hector : en effet ici je récupère le principe de l'échange avec le Disc2 : Si on sélectionne l'option "4 Disquette" Hector envoie un octet à AA et ensuite il attend un bloc de programme qui sera chargé en mémoire et lancé. C'est donc ce que je fais : j’envoie donc le micro-code vu précédemment, qui permet d'écrire un code ASCII à l'écran, d'attendre une touche (et retourner son code ASCII) de mettre une mémoire à une certaine valeur, de lire une mémoire et d'envoyer le contenu, de charge un bloc en mémoire et d'envoyer un bloc mémoire... bref, de réaliser toutes les fonctions nécéssaires...
par exemple

Ecrit_Phrase("\r\nFichier enregistre ")

écrit à l'écran d'Hector le texte "Fichier enregistre"...précédé d'un retour à la ligne!

A l'aide de cela j'ai bâti un interpréteur de commande dans l'Arduino permettant de communiquer avec Hector et d'interpréter les commandes saisies au clavier. La première partie de l'interpréteur permet de mémoriser la saisie clavier. Elle se trouve dans la boucle LOOP,

if (Recup_Caractere(&Octet)) {
// Octet est le caractere saisi !!
Pas_Principal++;
bool Exeed = false;
Exeed = (CommandeLength > 100);
// Pas fin de ligne, pas \CR\ ni \DEL\
if ( !Exeed && (Octet != 0x00D) && (Octet != 8)) {
// On cast en char le caractere saisi
Caract = Octet;
Commande[ CommandeLength ] = Caract;
CommandeLength++;
}

Elle gère le "backspace" et surtout de "return". Dès que le "return" et trouvé, on passe alors dans la fonction "Analyse_Commande()" qui va d'abord "saucissonner" la phrase saisie en mots (Param0 à Param4) et ensuite contrôler le premier mot saisie (Param0) par rapport aux commandes connues. Par exemple pour le VLOAD:

if(Param0 == "VLOAD") { // Fonction 2 VLOAD (LOAD en page video) Fonction = 2; Trouve = true; // Pas d'erreur

Ensuite si une fonction à été trouvé elle sera lancée (Code fonction de VLOAD, par exemple, =2).

Au sein de certaines fonctions de l'Arduino j'ai les fonctions de gestion de la carte SD ; Ceci est valable pour les fonctions de gestion de carte (DIR / DEL / MD / RD) ainsi que pour les fonctions de gestion de fichiers (LOAD / SAVE / TYPE). Pour pouvoir comprendre aussi mon code il faut comprendre comment il tourne: J'ai réalisé un ensemble de fonctions "ouverte" : c'est à dire que je n'attends pas qu'une condition soit vrai pour aller plus loin : non je ressort de la fonction mais avec un code de retour à false. LE programme appelant fera de même, ainsi de suite jusqu'à la fonction LOOP. Cette cascade de fonction m'a amené à créer 4 niveaux de fonctions. A chaque niveaux correspond une variable qui permet de de savoir où on en est dans chaque fonction (Pas_N1 pour le niveau 1, Pas_N2 et Pas_N3).

La fonction loop elle-même ressemble à ceci

Utilisation

Lancement

Bien, le montage est tout bon, contrôlé. Il faut maintenant l'utiliser:

En USB chargez le sketch téléchargé.

Un fois fait, couper le jus sur la platine puis connectez le tout. Mettez une SD card formatée FAT avec le fichier "micro.bin" à la racine. La mise sous tension se réalise dans l'ordre suivant: Alimentation de la platine Arduino (via l'USB ou via la prise) et ensuite la mise sous tension d'Hector.

Si tout est OK à l'appui du choix "4 - disquette" vous devez voir le prompt d'HectorDuino!

Commandes:

Lors du prompt, je vous invite à taper "HELP" qui liste les commandes. Faites le!

Allez c'est parti:

Pour saisir un texte le clavier les majuscules et minuscules sont fonctionnelles (mais inutile pour les nom de fichiers). Le "backspace" est fonctionnel mais pas les caractères de contrôles (association CTRL + Q/W/E/R/T/Y...). par exemple "HELP" suivi de "RETURN" (la grosse touche rouge!) affiche à l'écran l'aide.

Ce qu'il faut également comprendre c'est que les fonctions peuvent être utilisées dans la page "PROGRAMME" d'Hector ou dans la page VIDEO. Le fonctions en page vidéo commences par un V... POKE / VPOKE: écrit un octet dans la mémoire d'Hector. Par exemple: VPOKE C000,FF affichera 4 points jaunes en haut à gauche de l'écran (faite un CLS d'abord si défilement d'écran)

  • PEEK / VPEEK: Lit un octet dans la mémoire d'Hector. VPEEK C000 affichera FF (suite au VPOKE précédent!)
  • SAVE / VSAVE: Permet d'enregistre un fichier du carte SD avec le contenu de la mémoire d'Hector. Par exemple "VSAVE SCREEN C000 3E40" sauvegardera le contenu de l'écran dans un fichier nommé SCREEN
  • LOAD / VLOAD: Charge dans la mémoire d'Hector un fichier de la carte SD. Par exemple "VLOAD SCREEN C000" recharge le fichier en mémoire.
  • CLS: efface l'écran.
  • DIR: affiche le répertoire courant de la SD à l'écran. Les longueurs de fichiers en hexa (et entre parenthèse en décimal).
    La fonction "DIR" offre possibilité de rechercher les 3 derniers caractères des noms de fichier.
    La commande : "DIR CFG" nous retournera les fichiers :
    * TOTO.CFG
    * TYCFG
  • MD: Création d'un répertoire dans la carte SD. Exemple "SD TOTO" créera un répertoire là ou nous en sommes (à la racine de la carte pour l'instant).
  • CD: Entre dans le répertoire. "CD TOTO" entre dans le répertoire TOTO.
  • CD ..: sort du répertoire.
  • RD: Efface le répertoire. "RD TOTO" efface le répertoire TOTO, pensez à d'abord monter d'un cran dans les répertoires avant ("CD ..")
  • TYPE: Affiche à l'écran le contenu d'un fichier - il vaut mieux que ce soit un fichier texte!!)
  • DEL: Efface un fichier de la SD.

Organisation mémoire:

Ce qu'il faut savoir c'est que le micro code se trouve logé en 4002 sur une longueur de 478 octets (pour la version actuelle). De 0000 à 3FFF nous avons la ROM d'Hector, De 4000 à 41FF réservé au microcode et au-delà nous avons la RAM d'Hector. Pour info le logement à 4000 est dû au fait que cette zone est rarement utilisée. Elle est utilisée pour la RAM Vidéo en basse résolution.

Usuellement:

  • une sauvegarde de la RAM entre 4200 et FFE0 permet de sauvegarder les jeux HR (Long. BDE0).
  • une sauvegarde de la RAM entre 4200 et 8000 permet de sauvegarder les jeux BR (Long. 3E00).
  • une sauvegarde de la RAM Vidéo C000 le longueur 3F40 permet de sauvegarder un écran.

Attention ceci à ses limites: Par exemple ASSEMBLEX (Assembleur Z80 pour Hector) se trouve logé entre 4000 et 6000. Il ne peut donc être sauvegardé...

Quelques exemples:

SAVE F1 4200 3E00: Sauvegarde un jeu BR (Formule1!) sur SD Card,

SAVE JEEP 4200 BDE0: Sauvegarde un jeu HR,

VSAVE SCREEN C000 3F40: Sauvegarde l'écran en cours

...

pour recharger:

LOAD F1 4200
LOAD JEEP 4200
VLOAD SCREEN C000

(Les longueurs ne sont pas à indiquer, le programme chargera sur la longueur du fichier et si on déborde, on chargera n'importe quoi...) évidement les SAVE ne sauvent que le contenu de la RAM, il faut donc au préalable charger le jeu via la cassette d'Hector!

Pour éviter cela, il faut utiliser l'émulateur VBHector dans sa dernière version qui permet une compatibilité avec les fichiers produit dans l'émulation de l'HectorDuino. Pour faire cela,

  1. chargez un programme dans l'émulateur (cassette...)
  2. Faire un RESET
  3. Option 4 Disquette pour lancer l'émulation HectorDuino,
  4. Sauvegardez la RAM via SAVE XX 4200 BDE0
  5. Chargez le fichier produit sur la SD Card...maintenant utilisable sur votre Hector !

Have FUN!!!

TELECHARGEMENTS

  • Le sketch Arduino  : HectorDuino.ino
  • Le fichier Micro.bin qui doit être mis en racine de la carte SD : micro.bin
  • Le source du micro.bin : microcode.z80

A suivre...


Framework PHP ©2002-2003 Stéphane Vanlierde