[MZ-SD2CMT] Mise au point du mode ULTRA-FAST

C'est la catégorie reine de l'ordinophile, 8 bits et pas un de plus!
Single board ou bus S-100 acceptés.

Modérateurs : Carl, Papy.G, fneck

Répondre
hlide
Messages : 387
Enregistré le : 29 nov. 2017 10:23

[MZ-SD2CMT] Mise au point du mode ULTRA-FAST

Message par hlide » 17 juil. 2018 16:29

Actuellement, j'ai crée une organisation appellée SHARPENTIERS dans GitHub dont le but est d'ajouter les réalisations logicielles et matérielles en open-source en raport avec la série SHARP MZ. J'ai travaille tout particulièrement sur le projet MZ-SD²CMT qui n'avance que durant les weekends - et encore, quand je suis dessus.

Ce projet ne contient pas encore mes toutes dernières corrections pour la lecture normale d'un fichier binaire du type MZF/M12/MZT traduit en système PWM SHARP (comme pour les vraies cassettes) qui m'a donné pas mal de fil à retordre. Le résultat est que cela fonctionne parfaitement et que plus rien ne paraît paradoxale.

En effet :

1) les signaux READ et WRITE ont un inverseur qui faut prendre en compte : c'est la période basse de la pulsation émise par l'arduino qui doit être précise. Je pensais au début que c'était juste des diodes pour empêcher l'inversion du sens du courant.

2) j'utilise maintenant un "One-Shot Pulse" via une sortie PWM du timer3B. L'avantage est que la pulsation est émise en position bas durant la période précise voulue puis repasse en position haute pour le reste du temps jusqu'à l'on émette à nouveau une pulsation. Le plus important : une fois la pulsation programmée, c'est le hardware qui prend en charge et donc je peux déjà commencer à chercher l'octet suivant si nécessaire, à faire d'autres opérations en parallèle comme pour l'IHM dès le début de la pulsation qui est immédiate à la programmation. A la prochaine pulsation programmée, on attend quand même si le temps passé entre la pulsation précédente et celle à venir n'est pas en dessous de la période totale du signal à encoder en 1 ou 0 au cas où les opérations parallèles auraient été plus rapides à finir. Notez bien que les interruptions n'auront aucun effet sur la période basse de la pulsation - la précision de cette période est très importante car c'est elle qui déterminera un signal 1 ou 0.

Alors du coup je suis passé au mode ULTRAFAST : j'utilise le signal READ (/PC5) en signal pour SDO (serial data output)pour émettre les bits des octets d'un bloc de données. Et j'utilise le signal MOTOR (PC4, /SENSE) en signal SCK (serial clock) de la façon qui pourrait ressembler à ça :

Code : Tout sélectionner

   ____         _____         _____         _____         _____
SCK    \   0   /  1  \   0   /  1  \   0   /  1  \   0   /  1  \  ...
        \_____/       \_____/       \_____/       \_____/       \
     
      |-|++++++|-|++++|-|++++|-|++++|-|++++|-|++++|-|++++|-|++++| ...
   __         _____  _____                _____         _____
SDO  \   0   /  1  \/  1  \   0      0   /  1  \   0   /  1  \  ...
      \_____/              \_____/\_____/       \_____/       \
      |           6h              |           5h              |
L'arduino commence par changer d'abord SDO puis très rapidement SCK. Le MZ-700 peut lire PC5 et PC4 dans un seul octet et donc il n'a qu'a vérifié un changement de niveau de SCK pour prendre en compte le bit PC5 dans l'octet à composer en lecture.

Sauf que ça ne passe pas si bien.

Le signal SENSE n'est pas directement raccordé à PC4. Voic le schéma :
mz8255-mzcmtArduino.png
mz8255-mzcmtArduino.png (41.72 Kio) Vu 204 fois
En fait, le signal PC4 (MOTOR) n'est pas un signal carré ! il dessinne plutôt des dents de requins qui en fonction des périodes peuvent être catastrophiques. La récupération des octets ne semblent complète que si la période est au-delà de, disons, 3 ms. Plus je baisse cette période, plus j'ai des chances de rater des bits. Avec une période très courte (genre 100ms), je ne lis aucun bit et pour cause le signal de PC4 est en dent de scie dont la tension maximale ne doit pas atteindre la tension logique à 1 (on est en NMOS !).

Bref, il semblerait que tel quel, le mode ULTRAFAST se soit transformé en mode ULTRASLOW.

Néanmoins, je ne veux pas m'avouer vaincu. je peux accéder aux broches du 8255 - j'ai des pinces fines pour ça - et tout particulièrement au PC4.

Précisions:

1) Quand l'Arduino ne fait pas transfert normal, SENSE est à 1 en sortie et donc PC4 à 0 en entré.

2) Quand l'arduino fait un tranfert normal, SENSE est à 0 en sortie et donc PC4 à 1 en entrée.

3) Quand l'arduino fait un tranfert ULTRAFAST, je prévois de mettre SENSE à 1 pour que PC4 recoive 0 en entrée si aucune pince n'est accrochée.

4) J'utilise un nouveau pin autre que celui du SENSE de l'arduino que j'accroche au PC4 avec une pince.

5) J'utilise ce nouveau pin comme SCK et je le fais alterner entre 0 et 1 pour faire alterner PC4 entre 0 et 1 avec un signal bien carré et sans delai.

6) Eventuellement, je peux changer l'entrée Arduino MOTOR en sortie à 0 pour bloquer l'arrivé du signal SCK de ce côté-ci.

Question :

A) Pensez-vous que cela peut fonctionner ainsi ? je présume que l'IC 7E (LS74) ne laissera pas entrer du courant vers Q et donc le signal SCK ira principalement vers PC4.

B) Quoiqu'il y ait aussi l'IC 8C (7417) qui pourrait laisser conduire le signal SCK vers le signal MOTOR de l'Arduino. Pour l'Arduino, ce n'est pas vraiment un problème. Mais est-ce bon de laisser ça ? sachant que j'imagine que j'aurais la même tension en PC4 et l'Arduino MOTOR ?

C) En mode normal, je place SCK en entrée.

Voici le schéma que je veux réaliser :

Code : Tout sélectionner

_____
     |      
     |                            IC 3C CD4069    
  PC5+-<------------------------------0<|-------------------------------<- Arduino: READ / SDO en sortie        
     |
  PC4+-<--------------------------------+-------------------------------<- Arduino: SCK en sortie       
     |                                  |
     |                                  |
     |       _________________          |
     |      |                 |         |            IC 8C 7417
     |      |                Q+->-------+----------------|>------------->- Arduino: MOTOR en entrée
     |      |   IC 7E+1B+1C   |
     |      | LS74+LS00+LS04  |
     |      |               CK+-<----------------------------------------- Arduino: SENSE forcé à 1 en sortie
     |      |_________________|
IC 8E|
8255 |      
_____|
Eventuellement, je peux mettre le signal Arduino MOTOR en signal 0 en sortie durant le transfert ULTRAFAST dans l'espoir que le signal SCK ira directement vers PC4 et que Q et MOTOR en sortie avec tension 0 ne peuvent recevoir ce signal.

Code : Tout sélectionner

_____
     |      
     |                            IC 3C CD4069    
  PC5+-<------------------------------0<|-------------------------------<- Arduino: READ / SDO      
     |
  PC4+-<--------------------------------+-------------------------------<- Arduino: SCK     
     |                                  |
     |                                  |
     |       _________________          |
     |      |                 |         |            IC 8C 7417
     |      |                Q+->-------+----------------|>-------------<- Arduino: MOTOR en sortie
     |      |   IC 7E+1B+1C   |
     |      | LS74+LS00+LS04  |
     |      |               CK+-<----------------------------------------- Arduino: SENSE forcé à 1 en sortie
     |      |_________________|
IC 8E|
8255 |      
_____|
Modifié en dernier par hlide le 19 juil. 2018 12:16, modifié 1 fois.

hlide
Messages : 387
Enregistré le : 29 nov. 2017 10:23

Re: [MZ-SD2CMT] Mise au point du mode ULTRA-FAST

Message par hlide » 18 juil. 2018 10:33

J'ai rajouté dans le schéma les raccords à l'Arduino pour mieux voir ce que je souhaite faire.

hlide
Messages : 387
Enregistré le : 29 nov. 2017 10:23

Re: [MZ-SD2CMT] Mise au point du mode ULTRA-FAST

Message par hlide » 18 juil. 2018 18:24

Et pour les curieux qui se demandent de quoi je parle, j'obtiens ce signal rouge au lieu du bleu quand je veux faire basculer l'état de PC4 depuis l'Arduino :
PC4.png
PC4.png (26.5 Kio) Vu 184 fois
Ce signal m'oblige à utiliser une période beaucoup trop longue pour être viable. Donc je cherche à "bypasser" ça sans charcuter la carte mère.

hlide
Messages : 387
Enregistré le : 29 nov. 2017 10:23

Re: [MZ-SD2CMT] Mise au point du mode ULTRA-FAST

Message par hlide » 21 juil. 2018 07:54

Bon, il semblerait que surveiller le signal SENSE au lieu de MOTOR était une très mauvaise idée de ma part. J'ai bien un signal carré sur PC4 mais toujours des pertes de bit à l'émission. Entre temps, je me suis apperçu que le signal READ (PC5) était toujours à plat quand je stoppe le timer du one-shot pulse même si je change l'état de PC5 "à la main". J'ai trouvé la parade en n'arrêtant pas le timer et en inversant ou non le niveau hors pulsation à chaque émission du bit et j'obtiens bien maintenant des octets mais avec toujours des ratés au niveau des bits. Donc, pas la peine de tenter de bypasser le PC4. Je vais peut-être avoir besoin du signal WRITE pour une synchro des deux côtés.

hlide
Messages : 387
Enregistré le : 29 nov. 2017 10:23

Re: [MZ-SD2CMT] Mise au point du mode ULTRA-FAST

Message par hlide » 22 juil. 2018 00:52

Affaire réglée : avec ou sans le signal WRITE pour synchro (MZ qui demande à l'Arduino de passer au suivant) et sans l'ajoût du cable bleu sur le PC4, j'obtiens un transfert rapide de 19797 baud. J'ai galéré avec les synchronisations initiales qui me bloquaient tantôt du côté MZ tantôt du côté Arduino. Je garde la synchro WRITE car ça me donne la meilleure vitesse sans besoin de "tuner" les "timings" sans elle (l'Arduino risque d'aller trop vite) et surtout parce que c'est compatible avec toute la famille issue du MZ-80 K dont les fréquences peuvent varier.

Répondre