[Thomson] Streaming à 58824 octets/seconde

Placez ici vos trucs et astuces, étalez sans retenue votre savoir-faire et votre science qui va nous permettre de redonner une apparence neuve et fonctionnelle à nos bouzes.

Modérateurs : Papy.G, fneck, Carl

Daniel
Messages : 11701
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

[Thomson] Streaming à 58824 octets/seconde

Message par Daniel » 10 mai 2015 21:26

La lecture de musique en streaming à partir d'une carte SD par un ordinateur Thomson plafonne aujourd'hui à cinq ou six mille octets par seconde. Cette limite ne peut pas être dépassée en lisant la carte en mode SPI avec génération du signal d'horloge par le 6809. Vous me direz que c'est déjà pas mal, il n'y a qu'à écouter les démos de musique de __sam__ pour s'en convaincre.

Mais les fous que nous sommes veulent toujours faire mieux, et j'étudie plusieurs pistes pour atteindre des fréquences plus élevées. Une de mes idées est la lecture de 8 bits en parallèle sur un port d'entrée/sortie, et je viens de réussir aujourd'hui à atteindre 14000 Hz. Ce n'est qu'un début, car le programme n'est pas du tout optimisé. Quand __sam__ sera passé par là, nous dépasserons probablement 20000 Hz, et alors à nous la vidéo en couleur sonorisée :D

L'idée est toute simple : un 6821 sert d'interface avec un arduino. L'arduino lit un fichier sur la carte SD et envoie chaque octet sur un port de 8 bits. La communication est gérée par une ligne en entrée et une ligne en sortie, et nécessite moins de dix lignes de code sur l'arduino et une douzaine d'instructions assembleur sur Thomson. C'est donc très simple et peu coûteux, puisque le matériel visible sur la photo revient à moins de 10 € (non compris le TO8D et la carte microSD).

Pour les tests j'ai utilisé le 6821 de l'interface manettes, mais on peut envisager un contrôleur indépendant intégrant le 6821, l'arduino et le connecteur de carte SD.
streaming_14000hz.jpg
streaming_14000hz.jpg (79.46 Kio) Vu 1941 fois
Modifié en dernier par Daniel le 19 mai 2015 10:38, modifié 3 fois.
Daniel
L'obstacle augmente mon ardeur.

Avatar du membre
Papy.G
Modérateur
Messages : 1912
Enregistré le : 10 juin 2014 13:40
Localisation : Haute-Garonne/Gers

Re: [Thomson] Streaming à 20000 octets/seconde

Message par Papy.G » 10 mai 2015 22:05

Ah, voilà enfin, intéresse de près par ce projet, je suivais les indices depuis longtemps, et bien qu'ayant vaguement compris qu'il s'agissait de lire une SD en parallèle, je me demandais comment tu comptais t'y prendre.
Pour mon projet Minitel, je me demandais comment accéder rapidement et de façon plus économique en terme de cycles qu'en série, mais sans aller jusqu'à déléguer le protocole:

- En SPI avec une logique d'horloge et des registres à décalage.
- En mode quatre bits, et en faisant en sorte de tamponner/aiguiller, on doit pouvoir lire en parallèle.

Deux techniques trop complexes en matériel pour le projet et mon niveau technique.

- Via adaptateur sd/cf en mode ide.

En déléguant, sinon, il y a le CH376 et l'autre encore en test, ou encore la solution microcontrôleur avec programme dédié, mais on est potentiellement moins flexible vis-à-vis des formats(moins dans le dernier cas).
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.

Avatar du membre
6502man
Messages : 9421
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [Thomson] Streaming à 20000 octets/seconde

Message par 6502man » 10 mai 2015 22:22

Je pensais que tu avais essayé cette solution depuis longtemps :wink:

En tout cas bravo et vivement les prochaines démos :D
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.

Fool-DupleX
Messages : 1090
Enregistré le : 06 avr. 2009 12:07

Re: [Thomson] Streaming à 20000 octets/seconde

Message par Fool-DupleX » 11 mai 2015 09:04

C'est louable et je salue l'effort, mais utiliser un Arduino environ 40 fois plus puissant qu'un TO8 tout entier alors qu'une simple logique SIPO suffirait ...

Avatar du membre
Papy.G
Modérateur
Messages : 1912
Enregistré le : 10 juin 2014 13:40
Localisation : Haute-Garonne/Gers

Re: [Thomson] Streaming à 20000 octets/seconde

Message par Papy.G » 11 mai 2015 09:21

C'est aussi un peu ce qui me gênait dans mon projet, mais pour certaines choses où l'on a besoin de rapidité absolument (wifi, ethernet...) on n'a pas forcément le choix. :/
Soyez exigeants, ne vous contentez pas de ce que l'on vous vend.
Demandez-en plus, ou faites-le vous-même.

Daniel
Messages : 11701
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Streaming à 20000 octets/seconde

Message par Daniel » 11 mai 2015 10:16

D'après les tests effectués ce matin, la vitesse de transfert n'est pas limitée par le TO8D, mais par l'arduino qui ne réagit pas assez vite. Il faut que j'investigue de ce côté. L'arduino est certes plus rapide que le TO8, mais programmé en C avec des bibliothèques standard, il est loin d'être aussi optimisé que les programmes Thomson.

Le choix de l'arduino est dicté par sa simplicité de mise en oeuvre et son coût (1,80 € port compris l'arduino mini chinois sur ebay). Avec les bibliothèques SD et SPI, il faut 3 instructions pour lire un fichier : initialisation de la carte, ouverture du fichier, boucle de lecture. En ajoutant 3 ou 4 instructions pour contrôler la transmission l'application est écrite. Il m'a fallu 10 minutes pour mettre au point le programme.

Côté Thomson c'est aussi simple : une douzaine d'instructions.

Mais s'il y a moyen de faire mieux, plus simple et moins cher, je renoncerai volontiers à l'arduino :wink:
J'espère voir d'autres réalisations thomsonistes, mais en attendant je continue à étudier ma solution pour l'optimiser au maximum. Ce matin j'ai atteint 18000 Hz, c'est mieux que les 14000 Kz d'hier mais il doit être possible de progresser encore.
Daniel
L'obstacle augmente mon ardeur.

__sam__
Messages : 4621
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Streaming à 20000 octets/seconde

Message par __sam__ » 11 mai 2015 11:31

Daniel a écrit :L'idée est toute simple : un 6821 sert d'interface avec un arduino. L'arduino lit un fichier sur la carte SD et envoie chaque octet sur un port de 8 bits. La communication est gérée par une ligne en entrée et une ligne en sortie, et nécessite moins de dix lignes de code sur l'arduino et une douzaine d'instructions assembleur sur Thomson. C'est donc très simple et peu coûteux, puisque le matériel visible sur la photo revient à moins de 10 € (non compris le TO8D et la carte microSD).
Bravo pour la manip! Tous ces fils font peur, mais ce n'est qu'une maquette je présume.

Chez moi j'ai un PI que j'utilise peu. Sur le papier il devrait pouvoir fournir les mêmes services que l'arduino je présume (et même un peu plus).
Samuel.
A500 Vampire V2+, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.

Avatar du membre
Carl
Modérateur
Messages : 10602
Enregistré le : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: [Thomson] Streaming à 20000 octets/seconde

Message par Carl » 11 mai 2015 11:58

Bravo Daniel pour ce nouveau défi dans le monde du TO !

Carl

Daniel
Messages : 11701
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Streaming à 20000 octets/seconde

Message par Daniel » 11 mai 2015 13:39

Suite des tests :
En essayant diverses temporisations dans le programme Thomson, j'ai pu déterminer expérimentalement la fréquence à partir de laquelle l'arduino décroche : 27000 Hz. C'est mieux que les 20000 Hz espérés. Si l'arduino ne limitait pas, le programme Thomson tel que je l'ai écrit pourrait jouer à 58824 Hz.
Pour garder une marge de sécurité, je joue les fichiers .wav à 22222 Hz. C'est incontestablement meilleur que les démos de musique à 5,6 kHz, mais il reste quelques petits craquements (probablement au changement de secteur sur la carte SD).

Ci-dessous le programme Thomson :

Code : Tout sélectionner

/**************************************************\
*         L E C T U R E    A R D U I N O           * 
*           (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.*
\**************************************************/

* Communication parallele 8 bits avec un Arduino

/**************************************************\
*                Version 2015.05.11                *
\**************************************************/
* Historique
* 2015.05.11 suppression du test arduino ready
* 2015.05.10 debut du projet


*------------------------------------------------------
* LECTURE SEQUENTIELLE
*------------------------------------------------------
  ORG   $9000     
  ORCC  #$D0      (3) masque les interruptions
  LDA   #$E7      (2) valeur pour dp
  TFR   A,DP      (6) initialisation dp
LECT0
  ANDA  #$3F      (2) clear bit 6
  STA   <$CD      (4) request to send
  LDA   <$CC      (4) lecture octet avec b6=1
  STA   <$CD      (4) acknowledge
  BSR   TEMPO     (28) temporisation
  BRA   LECT0     (3) nouvelle lecture

*------------------------------------------------------
* TEMPORISATION
* 12 cycles (BSR + RTS) + 2 cycles par NOP
*  4 NOP: 37 cycles pour la boucle --> 27027 Hz
*  5 NOP: 39 cycles pour la boucle --> 25641 Hz
*  6 NOP: 41 cycles pour la boucle --> 24390 Hz
*  7 NOP: 43 cycles pour la boucle --> 23255 Hz
*  8 NOP: 45 cycles pour la boucle --> 22222 Hz
*  9 NOP: 47 cycles pour la boucle --> 21276 Hz
* 10 NOP: 49 cycles pour la boucle --> 20408 Hz
* 11 NOP: 51 cycles pour la boucle --> 19607 Hz
*------------------------------------------------------
TEMPO
  NOP             (2)
  NOP             (2)
  NOP             (2) 
  NOP             (2)
  NOP             (2)
  NOP             (2)
  NOP             (2) 
  NOP             (2)
  RTS             (5)
   
  END
Etapes suivantes :
Je vais étudier la bibliothèque SD de l'arduino pour voir s'il est possible d'optimiser la vitesse de lecture, et également essayer de mettre en place un buffer d'une dizaine d'octets pour masquer le changement de secteur.
Daniel
L'obstacle augmente mon ardeur.

__sam__
Messages : 4621
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [Thomson] Streaming à 20000 octets/seconde

Message par __sam__ » 11 mai 2015 15:13

Si je comprends bien le code, tu signale à l'aduino que tu es pret à lire en passant b6 à 0. Là tu lis un échantillon dont le b6 est à 1 et tu renvoie ce b6 à 1 pour signaler à l'arduino que tu as fini de lire, c'est ca ?

Du coup tu perds 1 bit de données sur les 8 utiles. J'imagine que c'est pour tester la vitesse maxi. En pratique les 2 bits en plus sur l'échantillon seraient utiles (par exemple pour lire des données brutes sur 8 octets), il te suffirait d'utiliser le registre B avec un b6 à 1 pour rendre le même service.

Est-ce que tu prévois un protocole assez riche en échange TO<->Arduino avec envoi depuis le TO du début des secteurs à lire ? Si c'est le cas, il est imaginable d'avoir une version du controlleur floppy virtuel qui irait au minimum 5x plus vite que l'actuel. Mieux, j'imagine qu'avec un arduino, il n'y aurait pas besoin de mettre 512 octets par secteurs, et qu'il serait possible de monter directement des fichiers FD sans conversion :D

J'ai hâte de lire la suite de l’expérimentation.
Samuel.
A500 Vampire V2+, A1200(030@50mhz/fpu/64mb/cf 8go),
GVP530 (MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.

Daniel
Messages : 11701
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Streaming à 20000 octets/seconde

Message par Daniel » 11 mai 2015 15:53

Oui, tu as tout compris :D
Dans un premier temps l'objectif est de jouer de la musique 6 bits, il y a deux bits libres par octet et j'en utilise un. C'est uniquement pour gagner un ORA #$40. Je pourrais très bien m'en passer, car par ailleurs il y a une boucle de temporisation de 28 cycles.

D'après ce que j'ai lu sur internet, il n'y a pas de moyen simple d'aller plus vite en lecture si on utilise les bibliothèques standard de l'arduino. Ce sera encore plus long en écriture, et pour l'instant je n'envisage pas d'essayer. Il ne faut pas non plus espérer émuler des disquettes avec l'arduino, il est trop limité, à la fois par la vitesse du processeur et la taille de la RAM (2 Ko).

Par contre j'aimerais bien pouvoir éviter les irrégularités de vitesse de lecture lors des changements de secteur. La seule solution serait d'avoir un buffer en réserve côté Thomson, alimenté par les bits 6 et 7 de chaque octet, comme dans les précédentes démonstrations.
Daniel
L'obstacle augmente mon ardeur.

Fool-DupleX
Messages : 1090
Enregistré le : 06 avr. 2009 12:07

Re: [Thomson] Streaming à 20000 octets/seconde

Message par Fool-DupleX » 11 mai 2015 16:59

Les raisons du choix de l'Arduino sont exactement celles-la : simplicité de mise en oeuvre et coût.

Corollaire : gaspillage hallucinant de puissance pour rien. L'Atmel utilisé sur l'Arduino developpe 20 MIPS, soit autant qu'un 386 cadencé à 16 MHz. Mais la librairie Arduino est extremement mal faite. C'est d'ailleurs pour cela que j'ai toujours prefere le Teensy qui est exactement la même chose au niveau de hardware mais nettement mieux concu au niveau soft.

Tu devrais te souvenir Daniel que ton premier emulateur MO5 tournait sur 386. On mesure le chemin parcouru en terme de gaspillage.

Pas de reproche ici, c'est bien d'experimenter, simplement je ne partage pas cette approche. Quelques portes logiques suffiraient a faire la même chose. La complexité de l'Arduino est source d'erreur, d'instabilité et ... de lenteur.

Daniel
Messages : 11701
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Streaming à 20000 octets/seconde

Message par Daniel » 11 mai 2015 18:04

Nous sommes parfaitement d'accord : l'arduino est un jouet pour enfant, simple et pas cher. Il y a des solutions bien meilleures. Mais ces solutions nécessitent des connaissances, du matériel, une formation et un temps de développement non négligeable. Et comme il n'y a aucun enjeu commercial, les projets restent presque toujours au stade de la conception.

Les projets arduino débouchent très vite sur des montages opérationnels : par exemple l'interface souris PS/2 de 6502man, ou son interface manette, ou mon système de streaming (moins d'une demi-journée pour la conception et la réalisation d'un prototype opérationnel). Les autres projets, par exemple l'émulation d'un lecteur de cassette Thomson avec un micro-contrôleur, ne débouchent sur rien de concret. J'ai envisagé un instant de le faire avec un arduino. Il me faudrait au maximum un jour ou deux, mais j'ai tellement râlé en public contre la lenteur de l'interface cassette que j'ai préféré m'abstenir.

En tapant ce message j'écoute de la musique en streaming à 22222 Hz, jouée par le TO8D derrière moi. Quand j'entendrai un autre système plus simple faire aussi bien ou mieux, j'abandonnerai l'arduino. Pareil pour l'émulation de disquette avec un contrôleur nanoréseau. Elle ne va que 20% plus vite que le lecteur Thomson, mais elle fonctionne parfaitement bien, ce n'est pas une vue de l'esprit. On peut sûrement envisager des systèmes bien supérieurs, mais comme dit le proverbe "Un tiens vaut mieux que deux tu l'auras". Alors je continue modestement à jouer avec l'arduino en attendant sans grand espoir la concrétisation de projets plus ambitieux.
Daniel
L'obstacle augmente mon ardeur.

Daniel
Messages : 11701
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [Thomson] Streaming à 20000 octets/seconde

Message par Daniel » 11 mai 2015 22:15

Conclusion des dernières investigations :

- En utilisant la bibliothèque SD de l'arduino on peut lire la carte à environ 27000 octets par seconde, mais pas de manière régulière, pour deux raisons :
1) La lecture utilise un buffer de secteur de 512 octets, et pendant la lecture du secteur le programme utilisateur doit attendre
2) A chaque changement de cluster la FAT est lue pour déterminer l'adresse du nouveau cluster, c'est encore un délai supplémentaire

Pour avoir un débit continu, il faudrait utiliser directement la transmission SPI, mais alors on perdrait toutes les fonctions de traitement de la FAT et de gestion des fichiers. Il faudrait tout programmer à bas niveau, comme je l'ai fait avec l'interface SDMOTO. Si quelqu'un a le courage, je lui laisse ce plaisir. Pour ma part j'ai déjà donné :wink:

En guise de conclusion, l'arduino est une solution simple pour lire ou écrire la carte SD quatre fois plus vite que sdmoto, mais moins régulièrement. C'est intéressant pour certains types de démonstrations, on pourrait aussi l'utiliser pour la simulation de disquette, mais ce n'est pas l'idéal pour la musique en streaming.
Modifié en dernier par Daniel le 12 mai 2015 08:52, modifié 1 fois.
Daniel
L'obstacle augmente mon ardeur.

Avatar du membre
6502man
Messages : 9421
Enregistré le : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [Thomson] Streaming à 20000 octets/seconde

Message par 6502man » 11 mai 2015 22:54

Il y a déjà une grosse amélioration par rapport au mode SPI, c'est même énorme la différence, mais tu veux aller encore plus vite :lol:

Le TO8 va plus pouvoir suivre :lol: :lol:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.

Répondre