[Thomson] Vidéo avec son en streaming

Cette catégorie traite de développements récents destinés à nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Daniel
Messages : 17401
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Vidéo avec son en streaming

Message par Daniel »

Quand l'Arduino et le MO5 sont "chauds" (deux heures de fonctionnement) on peut enlever la résistance, l'erreur disparait. A comparer avec la copie d'écran deux posts plus haut, réalisée exactement dans les mêmes conditions mais quand le matériel venait tout juste d'être mis sous tension. Le bit 6 était alors à 1 avant le début de la boucle. A chaud le bit 6 reste à 0. Pourquoi ?
synchro_ok_sans_resistance.png
synchro_ok_sans_resistance.png (48.73 Kio) Consulté 3841 fois
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7961
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Vidéo avec son en streaming

Message par __sam__ »

On voit que ca oscille ente 0 et 4.8V. Je n'arrive pas bien à estimer la période, mais elle semble bien précise: je compte 10 periodes par division, soit une période de 100µs (10khz).
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17401
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Vidéo avec son en streaming

Message par Daniel »

La période mesurée est exactement 120 µs : 2x60 en général et 64+56 en fin de secteur. De ce côté il n'y a pas de surprise, c'est cohérent avec les cycles du 6809 et conforme à la mesure de l'analyseur logique.
synchro_periode.png
synchro_periode.png (51.65 Kio) Consulté 3830 fois
Daniel
L'obstacle augmente mon ardeur.
Daniel
Messages : 17401
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Vidéo avec son en streaming

Message par Daniel »

D'après la datasheet du 6821, CA2 est par défaut en entrée, et reste en entrée tant que le bit 5 de CRA est à zéro. A priori ce bit est toujours à zéro, donc CA2 est en entrée avec une résistance de pull-up.

Le bit de synchronisation (b6 du PORTB) est relié directement à CA2. Si PB6 est en sortie et à zéro, le bit de synchronisation est à zéro. Mais il y a deux autres cas de figure :
1) Si à l'initialisation de l'ordinateur PB6 est en lecture, sa résistance de pull-up plus celle de CA2 le mettent à 1.
2) S'il est en lecture et à 1, quand la procédure d'initialisation du port PB le met en écriture, passe-t-il à 0 ou reste-t-il à 1 ?

C'est probablement dans ces subtilités qu'il faut chercher l'origine du problème. Je vois une solution possible : initialiser le port en sortie avec PB6 forcé à zéro, puis lancer le programme Arduino, puis lancer le programme Thomson. Je vais faire des tests en ce sens, mais ce n'est pas facile car l'erreur est aléatoire, il est donc difficile de savoir si elle est corrigée ou pas.

Code : Tout sélectionner

* init ports d'entree/sortie 
  CLRA            A=$00
  CLRB            B=$00
  STD   <$CE      selectionne DDRA et DDRB
  LDB   #$7F      B=$7F
  STD   <$CC      PA b0-7 en entree, PB b0-6 en sortie
  ORA   #$04      set b2
  STA   <$CE      selectionne PORTA
  STA   <$CF      selectionne PORTB
[Edit 18:30]
J'ai modifié le programme assembleur SDANIM7 pour améliorer l'initialisation des ports et la rendre indépendante du reste du programme. Le programme Basic de lancement appelle d'abord l'initialisation des ports, puis demande d'initialiser l'Arduino et d'appuyer sur une touche, et enfin lance l'affichage de la vidéo. Ainsi le bit de synchronisation est bien à zéro au début, et l'Arduino attend la réception du premier bit à 1 pour commencer la boucle.

Les premiers tests sans la résistance de 1K ont tous bien fonctionné, mais le caractère aléatoire de l'ancienne erreur me rendent prudent. J'attends quelques jours de tests intensifs pour considérer que la modification a bien résolu le problème.
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7961
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Vidéo avec son en streaming

Message par __sam__ »

0
Daniel a écrit :La période mesurée est exactement 120 µs : 2x60 en général et 64+56 en fin de secteur. De ce côté il n'y a pas de surprise, c'est cohérent avec les cycles du 6809 et conforme à la mesure de l'analyseur logique.
En effet.. Je pensais que tu avais capturé analogiquement les oscillation que tu avais trouvé numériquement avec l'analyseur logique (http://forum.system-cfg.com/viewtopic.p ... 62#p106862). Pour l'instant tu n'as donc plus ces fameuses oscillations ?

(Encore un coup du téléphone mobile qui reçoit un SMS et fait réagit tout ce qui ressemble à une antenne à coté?)
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17401
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Vidéo avec son en streaming

Message par Daniel »

Depuis l'arrivée de l'oscilloscope je doute de plus en plus de l'explication par des parasites. A mon avis l'envoi du bit 1 intempestif se produit avant ou pendant l'initialisation des ports du 6821. Je ne comprends pas exactement le mécanisme, ni la nature apparemment aléatoire du phénomène, mais je suis de plus en plus persuadé de cette origine.

En initialisant les ports d'abord, l'Arduino ensuite, j'ai pu enlever la résistance de pull-down et rétablir l'alimentation 5V normale sur l'entrée VCC. Depuis deux heures j'ai fait de nombreux tests, à chaud et à froid, sans jamais reproduire l'erreur. Je vais poursuivre les tests, à la fois sur MO5 et sur TO8, pendant deux ou trois jours, avant de conclure définitivement.

Voici le nouveau programme Basic, pour ceux qui veulent essayer. Vous remarquerez qu'il y a maintenant deux ayants droits, car j'ai écrit quelques lignes de code supplémentaire :wink:

Code : Tout sélectionner

1 'SDANIM7 2015.08.21
2 'Samuel Devulder - Daniel Coulom 
10 CLEAR,&H8FFF
20 COLOR7,0:SCREEN,,0:CLS:LOCATE0,0,0
30 READ A$:IF LEN(A$)=4 THEN A=VAL("&H"+A$):GOTO 30
40 IF A$="**" THEN EXEC A ELSE POKE A,VAL("&H"+A$):A=A+1:GOTO 30
50 PRINT"SDANIM7 2015.08.21
51 PRINT"Initialisez l'Arduino"
52 PRINT"puis appuyez sur une touche...";
60 A$=INPUT$(1):CLS
70 FORI=0TO199:PSET(0,I),2^(I MOD3):PSET(0,I),-1:NEXT
80 EXEC A
90 DATA 9000
100 DATA 34,7F,1A,50,8E,1F,40,E6
101 DATA 84,63,84,E1,84,27,0A,63
102 DATA 84,CE,A7,C0,8E,00,00,20
103 DATA 06,CE,E7,C3,8E,40,00,BF
104 DATA 90,9A,BF,90,AE,1F,30,1F
105 DATA 8B,7D,90,45,26,18,4F,5F
106 DATA DD,CE,C6,7F,DD,CC,8A,04
107 DATA 97,CE,97,CF,C6,1F,D7,CD
108 DATA 7C,90,45,20,35,00,A6,C4
109 DATA 84,FE,A7,C4,86,C8,A7,E2
110 DATA A6,80,C6,27,A7,80,5A,26
111 DATA FB,A6,E0,4A,26,F0,6C,C4
112 DATA CE,90,B8,8E,0C,60,A6,C8
113 DATA D4,A7,C0,30,1F,26,F7,86
114 DATA 7E,A7,C0,CC,90,7C,ED,C4
115 DATA 20,12,35,FF,96,CC,97,CD
116 DATA 34,32,35,32,34,36,35,36
117 DATA 21,F0,2C,EE,96,CC,97,CD
118 DATA D6,CC,27,05,3A,96,CC,20
119 DATA 07,8E,40,00,96,CC,20,00
120 DATA D6,CC,ED,84,D6,CC,27,05
121 DATA 3A,96,CC,20,07,8E,40,00
122 DATA 96,CC,20,00,D6,CC,ED,84
200 DATA 9000,**
sdanim7.png
sdanim7.png (666 octets) Consulté 3794 fois
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7961
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Vidéo avec son en streaming

Message par __sam__ »

Il y a donc deux appels à $9000 ?

Je me demande si on ne pourrait pas profiter de l'attente de l'appui sur une touche pour choisir le mode couleur ou N&B. Le mode N&B est bien adapté à certaines vidéos.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17401
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Vidéo avec son en streaming

Message par Daniel »

Oui, il y a deux appels à la même adresse. C'est subtil n'est-ce pas ?
La première fois le programme initialise les ports, positionne un flag et retourne au Basic.
La deuxième fois le flag est positionné, le programme saute l'initialisation des ports et lance la vidéo.

Code : Tout sélectionner

/**************************************************\
*                 S D A N I M 7                    * 
*    (c) 2015 - Samuel Devulder, Daniel Coulom     *
*           http://dcmoto.free.fr/                 *
*           http://forum.system-cfg.com/           *
*--------------------------------------------------*
* Ce code est distribue gratuitement dans l'espoir *
* qu'il sera utile, mais sans aucune  garantie  et *
* sans  engager  la  responsabilité  de  l'auteur. *
* Vous  pouvez  l' utiliser,  le  modifier  et  le *
* diffuser librement, en conservant cette  licence *
* et les références des auteurs dans   toutes  les *
* copies. L'exploitation commerciale est interdite.*
\**************************************************/

* Ce programme affiche une vidéo avec son à 16667 Hz.
* Les données sont lues sur carte SD par un Arduino
* et envoyées à l'ordinateur Thomson par les ports
* manettes à la vitesse de 116667 octets par seconde.
* Pour chaque echantillon de son il y a 6 octets
* d'image, soit trois fois plus que SDANIM3 et six
* fois plus que SDANIM2. 

/**************************************************\
*                Version 2015.08.21                *
\**************************************************/
* Historique
* 2015.08.21 retour au Basic apres initialisation des ports
* 2015.07.12 premiere version operationnelle

  ORG   $9000
 
*------------------------------------------------------
* Point d'entree
*------------------------------------------------------ 
INI
  PSHS  U,Y,X,DP,B,A,CC  empile les registres
  ORCC  #$50      masque les interruptions
  LDX   #$1F40    adresse pour test RAM ou ROM
  LDB   ,X        lecture adresse X
  COM   ,X        tente de modifier adresse X
  CMPB  ,X        test modification adresse X
  BEQ   INIT1     pas de difference -> TO
  COM   ,X        retablissement adresse X
  LDU   #$A7C0    port A du PIA systeme
  LDX   #$0000    adresse dans ecran
  BRA   INIT2     suite des initialisations   
INIT1
  LDU   #$E7C3    port A du PIA systeme
  LDX   #$4000    adresse dans ecran
INIT2
  STX   NEWPICa+1 adresse debut ecran
  STX   NEWPICb+1 adresse debut ecran
  TFR   U,D       extraction base $E7/$A7
  TFR   A,DP      initialisation DP
  TST   PORTS     test ports initialises 
  BNE   LINE0     oui : suite du programme 

*------------------------------------------------------
* INITIALISATION PORTS D'ENTREE/SORTIE
* ET RETOUR AU BASIC
*------------------------------------------------------
  CLRA            A=$00
  CLRB            B=$00
  STD   <$CE      selectionne DDRA et DDRB
  LDB   #$7F      B=$7F
  STD   <$CC      PA b0-7 en entree, PB b0-6 en sortie
  ORA   #$04      set b2
  STA   <$CE      selectionne PORTA
  STA   <$CF      selectionne PORTB
  LDB   #$1F      valeur d'initialisation PORTB
  STB   <$CD      b6=0, CNA=$1F 
  INC   PORTS     set flag initialisation
  BRA   SORTIE    retour au Basic
PORTS
  FCB   $00       flag d'initialisation des ports
  
*------------------------------------------------------
* recopie des attributs couleurs
*------------------------------------------------------
LINE0
  LDA   ,U        port A du PIA systeme
  ANDA  #254      clear bit 0 (couleur)
  STA   ,U        passage en video forme
  LDA   #200      200 lignes
LINE1 
  STA   ,-S       sauvegarde compteur ligne
  LDA   ,X+       lecture 1er octet ligne
  LDB   #39       compteur colonne
LINE2
  STA   ,X+       ecriture colonne suivante
  DECB            decrementation cpt col.
  BNE   LINE2     toutes les colonnes faites ?
  LDA   ,S+       recup compteur ligne
  DECA            une ligne de faite
  BNE   LINE1     finie ?
  INC   ,U        set bit 0 (forme)

* Mise en place du block play 73 fois
  LDU   #FINPLAY7 fin block PLAY 7
  LDX   #72*(FINPLAY7-PLAY7)
RECOPIE
  LDA   <(PLAY7-FINPLAY7),U
  STA   ,U+
  LEAX  -1,X
  BNE   RECOPIE
* mise en place "JMP FINBLOC"
  LDA   #$7E      "JMP"
  STA   ,U+
  LDD   #FINBLOC
  STD   ,U
 
*------------------------------------------------------
* JOUE LA VIDEO ET LA MUSIQUE
* Boucle de 60 cycles = 16666.67 Hz
*------------------------------------------------------
  BRA   PLAY7
 
*------------------------------------------------------
* RETOUR AU BASIC
*------------------------------------------------------
SORTIE 
  PULS  CC,A,B,DP,X,Y,U,PC   
* retour a l'assembleur
* SWI

* fin de bloc 512: son + attente (5+56 cycles)
FINBLOC
* echantillon son (8 cycles)
  LDA   <$CC      (4) lecture echantillon son avec B6 alternant
  STA   <$CD      (4) joue le son et acknowledge   

* compensation, lecture inter-bloc (45)
  PSHS  X,Y,A     (10)
  PULS  X,Y,A     (10)
  PSHS  X,Y,D     (11)
  PULS  X,Y,D     (11)
  BRN   SORTIE    (3) 

* rebouclage (7 cycles)
  BGE   SORTIE    (3) sortie?

*------------------------------------------------------
* lecture d'un bloc de 7 octets 8+(17+9)*2=60 cycles
*
* <son> <depA> <vidA1> <vidA2> <depB> <vidB1> <vidB2>
*------------------------------------------------------
PLAY7
* echantillon son (8 cycles)
  LDA   <$CC      (4) lecture echantillon son avec B6 alternant
  STA   <$CD      (4) joue le son et acknowledge   
 
* lecture octet depl + video1 = 17 cycles
  LDB   <$CC      (4) lecture octet deplacement
  BEQ   NEWPICa   (3) nouvelle image
  ABX             (3) ajout de l'increment
  LDA   <$CC      (4) lecture octet video1
  BRA   PLAYa     (3) octet video

* retour debut ecran + video1 = 10 cycle
NEWPICa
  LDX  #$4000     (3) retour debut ecran
  LDA   <$CC      (4) lecture octet video1
  BRA  PLAYa      (3) poursuite image
   
* sortie video = 9 cycles
PLAYa
  LDB   <$CC      (4) lecture octet video2
  STD   ,X        (5) affiche l'octet image

* lecture octet depl + video3 = 17 cycles
  LDB   <$CC      (4) lecture octet deplacement
  BEQ   NEWPICb   (3) nouvelle image
  ABX             (3) ajout de l'increment
  LDA   <$CC      (4) lecture octet video3
  BRA   PLAYb     (3) octet video

* retour debut ecran + video3 = 10 cycle
NEWPICb
  LDX  #$4000     (3) retour debut ecran
  LDA   <$CC      (4) lecture octet video3
  BRA  PLAYb      (3) poursuite image
   
* sortie video = 9 cycles
PLAYb
  LDB   <$CC      (4) lecture octet image
  STD   ,X        (5) affiche l'octet image
FINPLAY7
 
  RMB   72*(FINPLAY7-PLAY7)
 
* envoi fin bloc 512
*  JMP   FINBLOC   (4)
 
  END   INI
Dans l'initialisation des ports j'ai forcé le PORTB en sortie à $1F, il y a donc la certitude d'avoir le bit 6 à zéro.

[Edit 22/08/2016]
Ce matin j'ai ajouté l'option noir et blanc dans le programme Basic (voir ci-dessous).
Les nouveaux tests avec le MO5 "froid" ont tous bien fonctionné. La correction d'hier semble efficace.

Code : Tout sélectionner

1 'SDANIM7 2015.08.22
2 'Samuel Devulder - Daniel Coulom 
10 CLEAR,&H8FFF
20 COLOR7,0:SCREEN,,0:CLS:LOCATE0,0,0
30 READ A$:IFLEN(A$)=4THENA=VAL("&H"+A$):GOTO30
40 IF A$="**"THENEXECA ELSEPOKEA,VAL("&H"+A$):A=A+1:GOTO30
50 PRINT"SDANIM7 2015.08.22
51 PRINT
52 PRINT"Initialisez l'Arduino, puis appuyez"
53 PRINT"sur C pour la video en couleurs"
54 PRINT"sur N pour la video en noir et blanc..."
60 A$=INPUT$(1):CLS:IFA$="N"THEN80
61 IFA$<>"C"THEN50
70 FORI=0TO199:PSET(0,I),2^(I MOD3):PSET(0,I),-1:NEXT
80 EXECA:END
90 DATA 9000
100 DATA 34,7F,1A,50,8E,1F,40,E6
101 DATA 84,63,84,E1,84,27,0A,63
102 DATA 84,CE,A7,C0,8E,00,00,20
103 DATA 06,CE,E7,C3,8E,40,00,BF
104 DATA 90,9A,BF,90,AE,1F,30,1F
105 DATA 8B,7D,90,45,26,18,4F,5F
106 DATA DD,CE,C6,7F,DD,CC,8A,04
107 DATA 97,CE,97,CF,C6,1F,D7,CD
108 DATA 7C,90,45,20,35,00,A6,C4
109 DATA 84,FE,A7,C4,86,C8,A7,E2
110 DATA A6,80,C6,27,A7,80,5A,26
111 DATA FB,A6,E0,4A,26,F0,6C,C4
112 DATA CE,90,B8,8E,0C,60,A6,C8
113 DATA D4,A7,C0,30,1F,26,F7,86
114 DATA 7E,A7,C0,CC,90,7C,ED,C4
115 DATA 20,12,35,FF,96,CC,97,CD
116 DATA 34,32,35,32,34,36,35,36
117 DATA 21,F0,2C,EE,96,CC,97,CD
118 DATA D6,CC,27,05,3A,96,CC,20
119 DATA 07,8E,40,00,96,CC,20,00
120 DATA D6,CC,ED,84,D6,CC,27,05
121 DATA 3A,96,CC,20,07,8E,40,00
122 DATA 96,CC,20,00,D6,CC,ED,84
200 DATA 9000,**
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7961
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Vidéo avec son en streaming

Message par __sam__ »

Fichier SD pour tester le mode N&B: http://www.cjoint.com/doc/15_08/EHwhQtm ... rt-HD-.zip
(ca fonctionne aussi en mode couleur)
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17401
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Vidéo avec son en streaming

Message par Daniel »

Je connaissais cette vidéo, elle est excellente :D
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7961
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Vidéo avec son en streaming

Message par __sam__ »

c'est du plein écran 266x200 à 18 fps. La moyenne des images est de 5922 octets, ce qui est bien moins que les 6481 octets disponibles en 1/18 sec (7*1000000/(60*18)). Bref toutes les images tiennent dans le débit imparti. :D

La même en couleur (et qui marche aussi très bien en N&B): http://www.cjoint.com/doc/15_08/EHwmj3n ... n-Low-.zip
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17401
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Vidéo avec son en streaming

Message par Daniel »

La vidéo est encore mieux en couleurs ! Reste à contacter les ayants droits, qui veut s'en charger ? :wink: :wink: :wink:

Plus sérieusement : les dernières modifications ont supprimé toutes les erreurs. La mise au point du hard et du soft arduino est terminée. Il n'y a plus de résistance de pull-down et l'alimentation 5V est logiquement sur la broche VCC de l'Arduino. Il y a eu beaucoup de suppositions faites sur les problèmes rencontrés, certaines étaient justes et d'autres fausses. Oublions tout, voici la synthèse :

- Le bit de synchronisation PB6 (relié aussi à CA2) est en lecture à l'initialisation de l'ordinateur. Dans ce cas les résistances de pull-up de 5,6K du 6821 le mettent à 5V et le programme Arduino envoie prématurément les 6 premiers octets vidéo. Ensuite le port est initialisé en sortie, le programme Thomson passe le bit alternativement à 1 et à 0, mais le décalage initial provoque des anomalies.

- Quand on arrêtait la démo sans réinitialiser l'ordinateur, il pouvait arriver que PB6 reste à zéro (une chance sur deux). Dans ce cas l'exécution suivante du programme était bonne. Mais pas forcément celle d'après (toujours une chance sur deux).

- En ajoutant une résistance pull-down de 1K, la tension de PB6 en lecture tombe à 0,9V, c'est largement sous le seuil de l'état haut de l'Arduino, le bit est lu à zéro, il n'y a plus de décalage et la vidéo fonctionne bien. Sauf que cette résistance de 1K fait chuter la tension des vrais bits 1 à 2,8V. Pour l'Arduino alimenté en 5V c'est une zone d'incertitude, d'où les erreurs aléatoires. En diminuant la tension d'alimentation de l'Arduino à 4,8V on baisse le seuil, le bit 1 est toujours lu à 1, il n'y a plus aucune erreur.

- Pour compliquer encore le diagnostic, le décalage initial du premier cas de figure n'était pas toujours visible. Je suppose (sans certitude) que dans certain cas, après la désynchronisation, le programme se resynchronisait automatiquement et on ne voyait pas l'erreur. Ce phénomène ajoutait un aléa de plus au comportement déjà aléatoire, c'est pourquoi il a été si long et si difficile de trouver la solution.

Un fait est certain : sans analyseur logique je n'aurais jamais pu trouver les bonnes temporisations du programme Arduino, et sans oscilloscope je n'aurais jamais pu comprendre les causes des anomalies.

Maintenant tout est au point, je prépare une page pour présenter le matériel et les programmes à la section Bricolage du site dcmoto. Si vous avez besoin de conseils ou d'aide pour construire l'interface, nous pouvons en discuter à la section Bricolage du forum. Ci-dessous le schéma définitif :
sdanim7_20150822.png
sdanim7_20150822.png (22.51 Kio) Consulté 3736 fois
Notez que la limitation à 120 Ko/s est celle du programme Thomson. L'Arduino peut lire la carte SD à plus de 400 Ko/s.
Il est possible d'augmenter encore le débit avec une transmission sur 16 bits : un LDD est plus rapide que deux LDA. Il faudrait pour cela ajouter un 6821 supplémentaire. J'ai peur que ce soit un peu trop compliqué pour le bricoleur moyen, et l'augmentation de débit ne sera pas spectaculaire.
Daniel
L'obstacle augmente mon ardeur.
Daniel
Messages : 17401
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Vidéo avec son en streaming

Message par Daniel »

Perfectionnement de l'application :
Actuellement le sketch Arduino lit le fichier SDANIM7.SD. Pour jouer une vidéo, il faut la renommer avec ce nom. Avec le nombre de démos créées par __sam__ on se lasse vite de connecter la carte au PC, renommer le fichier, remettre la carte côté Thomson.

J'ai donc imaginé un moyen simple de choisir le fichier vidéo à jouer, en listant sur l'écran Thomson le répertoire principal de la carte, fichier par fichier. Après l'affichage du nom, on peut taper ENTREE pour jouer le fichier, ou une autre touche pour afficher le nom suivant.

Dans un premier temps j'ai testé seulement le programme de choix du fichier. Reste à l'intégrer au programme de lecture vidéo, côté Arduino et côté Thomson. Il ne devrait pas y avoir de difficulté particulière.

Sketch Arduino

Code : Tout sélectionner

/**************************************************\
*                   S D D I R                      * 
*           (c) 2015 - Daniel Coulom               *  
*           http://dcmoto.free.fr/                 *
*           http://forum.system-cfg.com/           *
*--------------------------------------------------*
* Ce code est distribue gratuitement dans l'espoir *
* qu'il sera utile, mais sans aucune  garantie  et *
* sans  engager  la  responsabilité  de  l'auteur. *
* Vous  pouvez  l' utiliser,  le  modifier  et  le *
* diffuser librement, en conservant cette  licence *
* et les références de l'auteur dans   toutes  les *
* copies. L'exploitation commerciale est interdite.*
\**************************************************/

/***************************************************
*                Version 2015.08.28                *
****************************************************
Historique
2015.08.28 premiere version operationnelle

Communication parallele avec un ordinateur Thomson
Lecture de la directory d'une carte SD
Envoi des octets sur le port D a destination du
port manettes de l'ordinateur Thomson.

Connexion module Catalex pour carte micro SD
 GND --> GND
 SCK --> D13
MISO --> D12
MOSI --> D11
 VCC --> VCC (5V)
  CS --> D10

Connexion DB9 de la manette 0
   1 --> D0 (RX)
   2 --> D1 (TX)
   3 --> D2
   4 --> D3
   5 --> non connecte
   6 --> D8
   7 --> non connecte
   8 --> non connecte
   9 --> GND
   
Connexion DB9 de la manette 1
   1 --> D4
   2 --> D5
   3 --> D6
   4 --> D7
   5 --> VCC (+5V)
   6 --> non connecte
   7 --> non connecte
   8 --> non connecte
   9 --> non connecte
 
 This sketch uses the SimpleSDAudio library for SD card access.
 Visit SimpleSDAudio website for more information:
 http://www.hackerspace-ffm.de/wiki/index.php?title=SimpleSDAudio
*/

#include <sd_l0.h>
#include <sd_l1.h>
#include <sd_l2.h>

void setup()
{
 uint8_t string[512];     // buffer de lecture de la carte
 uint8_t name[32];        // nom de fichie
 SD_L2_File_t AudioFileInfo; 
 
 //Initialisations
 //Serial.begin(9600);      // serial communication 9600 bauds
 noInterrupts();          // desactiver les interruptions
 pinMode(8, INPUT);       // configurer pin8 en entree (bit de synchronisation)
 DDRD = 0xff;             // configurer port D en sortie
 PORTD = 0x00;            // initialiser port D a zero
 SD_L0_CSPin = 10;        // definir CS de la carte SD en D10
 SD_L2_Init(string);      // initialiser la carte SD
 SD_L0_SpiSetHighSpeed(); // frequence d'horloge maxi 

/**
 * Prints a directory.
 * Callback must point to a function that prints one string. 
 *
 * Works only over one cluster of directory information. If 
 * SD_L2_ERROR_DIR_EOC is returned call function again with next
 * cluster number. 
 *
 * Set cluster to 0 to access root directory.
 *
 * Deleted files and long name entries are not shown generally.
 *
 * Only files are printed that has their attributes set/unset regarding maskSet/maskUnset.
 * Examples for maskSet, maskUnset:
 *  Ouput everything:           0x00, 0x00
 *  Shortname files only:       0x00, 0x18
 *  Shortname files and dirs:   0x00, 0x08
 *  Shortname dirs:             0x10, 0x08
 *  Volume name:                0x08, 0x10
 *
 * Mask bits: B7 = 0, B6 = 0, B5 = archive, B4 = directory, 
 *            B3 = volume name, B2 = system, B1 = hidden, B0 = read only
 */
 SD_L2_Dir(0x00, 0x00, 0x18, dir_callback);
 PORTD = 0xff;  // fin de transmission
}

void loop(void) {
}

void dir_callback(char *filename)
{
 int i; 
 for(i = 0; i < strlen(filename); i++) send_char(filename[i]);
 send_char(0x0d);
 send_char(0x0a);
}

void send_char(char c)
{
 PORTD = c;                  // caractere du nom de fichier
 while((PINB & 0x01) == 1);  // attente bit de synchro à 0  
 while((PINB & 0x01) == 0);  // attente bit de synchro à 1  
}
Programme MO5 (adaption TO à faire) :

Code : Tout sélectionner

/**************************************************\
*                   S D D I R                      * 
*           (c) 2015 - Daniel Coulom               *  
*           http://dcmoto.free.fr/                 *
*           http://forum.system-cfg.com/           *
*--------------------------------------------------*
* Ce code est distribue gratuitement dans l'espoir *
* qu'il sera utile, mais sans aucune  garantie  et *
* sans  engager  la  responsabilité  de  l'auteur. *
* Vous  pouvez  l' utiliser,  le  modifier  et  le *
* diffuser librement, en conservant cette  licence *
* et les références de l'auteur dans   toutes  les *
* copies. L'exploitation commerciale est interdite.*
\**************************************************/

* Ce programme utilise l'interface de streaming
* compose d'un Arduino et d'une carte SD
* pour lire et afficher la directory de la carte.

/**************************************************\
*                Version 2015.08.28                *
\**************************************************/
* Historique
* 2015.08.28 premiere version operationnelle

*------------------------------------------------------
* DEBUT DU PROGRAMME
*------------------------------------------------------
  ORG   $9E00 

*------------------------------------------------------
* Initialisations
*------------------------------------------------------
INIT
  PSHS  U,Y,X,DP,B,A,CC  sauvegarde des registres du Basic
  ORCC  #$50
  LDX   #$1F40        adresse pour test RAM ou ROM
  LDB   ,X            lecture adresse X
  COM   ,X            tente de modifier adresse X
  CMPB  ,X            test modification adresse X
  BEQ   INIT1         pas de difference -> TO
  COM   ,X            retablissement adresse X
  LDA   #$A7          valeur initialisation DP pour MO
  BRA   INIT2         suite des initialisations
INIT1
  LDA   #$E7          valeur initialisation DP pour TO
INIT2
  TFR   A,DP          initialisation DP

*------------------------------------------------------
* INITIALISATION PORTS D'ENTREE/SORTIE
*------------------------------------------------------
  CLRA            A=$00
  CLRB            B=$00
  STD   <$CE      selectionne DDRA et DDRB
  LDB   #$40      B=$40
  STD   <$CC      PA b0-7 en entree, PB b6 en sortie
  ORA   #$04      set b2
  STA   <$CE      selectionne PORTA
  STA   <$CF      selectionne PORTB
  STB   <$CD      PB6=1 

*------------------------------------------------------
* Lecture et affichage de la directory
*------------------------------------------------------
DIR
  SWI             appel fonction moniteur
  FCB   $0C       scrutation rapide clavier
  BNE   DIR       attente touche relachee
DIR1
  LDB   <$CC      lecture caractere
  COM   <$CD      clear bit synchro 
  COM   <$CD      set bit synchro
  CMPB  #$FF      test fin de repertoire
  BEQ   RETOUR    retour au Basic
  SWI             appel fonction moniteur
  FCB   $02       affichage caractere 
  CMPB  #$0A      nouvelle ligne
  BNE   DIR1      lecture caractere suivant
DIR2
  SWI             appel fonction moniteur
  FCB   $0A       lecture du clavier
  BEQ   DIR2      attente touche enfoncee
  CMPB  #$0D      test touche entree
  BEQ   RETOUR    retour au Basic
  BRA   DIR       suite de la directory

*------------------------------------------------------
* RETOUR AU BASIC
*------------------------------------------------------
RETOUR 
  PULS  CC,A,B,DP,X,Y,U,PC   

  END
Lancement en Basic :

Code : Tout sélectionner

1 '================================
2 ' SDDIR - Daniel Coulom - 2015
3 '================================
20 CLEAR,&H9DFF:A=&H9E00
30 READX$:IFX$="**"THEN99
40 POKEA,VAL("&H"+X$):A=A+1:GOTO30
99 EXEC&H9E00:END
100 DATA 34,7F,1A,50,8E,1F,40,E6
101 DATA 84,63,84,E1,84,27,06,63
102 DATA 84,86,A7,20,02,86,E7,1F
103 DATA 8B,4F,5F,DD,CE,C6,40,DD
104 DATA CC,8A,04,97,CE,97,CF,D7
105 DATA CD,3F,0C,26,FC,D6,CC,03
106 DATA CD,03,CD,C1,FF,27,10,3F
107 DATA 02,C1,0A,26,F0,3F,0A,27
108 DATA FC,C1,0D,27,02,20,E2,35
109 DATA FF,**
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7961
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Vidéo avec son en streaming

Message par __sam__ »

Est-il possible d'imaginer un mode "transparent" pour l'arduino et un mode "parallèle/super boost" ?

Dans le mode "transparent", actif au démarrage, l'arduino ne fait que transférer le SPI entre le TO et la carte SD dans les deux sens (il recopie les bits). A ce moment là: le contrôleur CD91-280 marche naturellement permettant de choisir un fichier SD. Puis à un moment si on envoi une commande "à nous" (une super CMD18) via le SPI, l'arduino la reconnait lors de la recopie des bits, et il transmet alors un CMD18 sur la carte SD et passe en mode parallèle.

Plus tard pour revenir en mode transparent, il suffit de resetter l'arduino.

Ca parait jouable ce genre de protocole ?

(bon sinon pour le code C du convertisseur: les vacances se terminent, et je n'ai pas eu le courage de démarrer le portage. C'est vraiment très curieux. Je ne pense pas être devenu allergique au C puis que j'en ait fait plein sur amiga (des modifs et optim de code existant). Non je doit être allergique à refaire de zéro un truc que j'ai déjà fait avec un langage de haut niveau... ouais: grosse flemme car le script marche bien. Mais bon ce n'est pas fini: il reste les soirée au retour du boulot à présent ;) )
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17401
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Vidéo avec son en streaming

Message par Daniel »

On peut tout imaginer, mais après, pour développer, il faut des dizaines ou des centaines d'heures de travail. L'arduino a un mode SPI "hard", utilisé pour communiquer avec la carte SD. Mais on peut faire aussi du SPI par soft, pour communiquer avec le Thomson. Après il faut faire communiquer les deux SPI, c'est sûrement possible, mais bon courage à qui s'y lancera :wink:

Une autre idée serait de faire un contrôleur de disquette communiquant avec la carte SD en parallèle par l'intermédiaire de l'Arduino. On pourrait atteindre des débits 10 fois plus élevés qu'avec le contrôleur CS91-280. Et pourquoi pas, sur la lancée, imaginer des disquettes à 64000 pistes en gardant le système de fichier Thomson pour rester compatible avec les logiciels existants. J'en ai rêvé, mais j'ai déjà beaucoup donné, et je ne me sens pas le courage de repartir dans une nouvelle aventure. Il est clair maintenant que ces petits bricolages n'intéressent personne, sauf leur créateur.

C'est surtout une question de motivation : au début, il y avait l'exploration d'un domaine inconnu : la communication avec une carte SD. Avec la gestion de la liaison SPI par le 6809 c'était 6 Ko/s. Aujourd'hui, avec l'Arduino, nous sommes à 120 Ko/s, et sans la limitation du 6809 nous pourrions monter à 400 Ko/s. On peut charger toute la mémoire d'un TO8D en moins de deux secondes, contre deux minutes avec une disquette et 45 minutes ou plus avec une cassette. C'est un exploit, mais qui l'utilisera ? Personne. Rien que d'y penser, ça me coupe toute envie de le faire.

Pour le streaming vidéo, ce que nous sommes arrivés à faire tous les deux est tellement extraordinaire qu'il faut continuer à améliorer les programmes pour les rendre facile à utiliser. La procédure de génération des vidéos et le choix du fichier dans un répertoire vont rendre le système accessible à tous. Et, qui sait, donner envie à des créateurs de composer des oeuvres originales.
Daniel
L'obstacle augmente mon ardeur.
Répondre