![]() | Login | ![]() | ![]() |
![]() | Sasfépu | ![]() | ![]() |
![]() | Interviews | ![]() | ![]() |
![]() | Emulateurs | ![]() | ![]() |
![]() | Projets | ![]() | ![]() |
![]()
Liste du matériel
Ici le choix s'impose de lui-même: Il faut une platine MEGA 2560:
Pourquoi ce choix? Deux raisons: 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! L'intérêt de la DB25 femelle était dans l'utilisation d'une prise à visser pour les essais. Maintenant j'ai gardé cet ensemble (Cordon Centronics 36
Le schémaDétail sur le raccordement du 74LS74: ExplicationsPA0 à 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:
Remarque: J'ai utilisé un lecteur qui ne possède ni de buffer ni d'adaptation de signaux (5V 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 ![]() LogicielIl 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 Arduino2De 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 ){
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 * 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 ){
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... 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)) {
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 ![]() UtilisationLancement 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)
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:
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 (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,
Have FUN!!! TELECHARGEMENTS
A suivre... | |||||||||||||||||||||
Framework PHP ©2002-2003 Stéphane Vanlierde |