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 |
Sauf que ça ne passe pas si bien.
Le signal SENSE n'est pas directement raccordé à PC4. Voic le schéma :
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 |
_____|
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 |
_____|