besoin aide CNA R2R 16 bits...

Bonjour =E0 tous,

toujours dans le cadre de mes exp=E9rimentations sonores, je tente de mettre au point un convertisseur num=E9rique>analogique 16 bits =E0 base de r=E9seau R2R, en sorties d'un =B5C PIC...dans le but de reproduction sonore de fichiers audios... (fichiers .wav mono 16b/16Khz stock=E9s sur une SDCard) j'ai commenc=E9 par une version en 8 bits qui fonctionne =E0 merveille (avec des fichiers audios encod=E9s en 8b/16Khz)...bas=E9 sur un r=E9seau R2R c=E2bl=E9 sur les 8 sorties PortB de mon PIC... sch=E9ma R2R 8 bits

formatting link

mais je voudrais passer en "qualit=E9 16 bits"... j'ai donc continu=E9/doubl=E9 mon r=E9seau R2R, en utilisant, en plus du PortB, les 8 sorties du PortD de mon PIC... sch=E9ma R2R 16 bits

formatting link

mais voil=E0, =E7a ne fonctionne pas, le son est horriblement d=E9form=E9, tout juste reconnaissable, avec de tr=E8s gros bruits de fond...

alors voil=E0 mes r=E9flexions; me suis-je tromp=E9 en c=E2blant simplement

2 r=E9seaux R2R 8bits en s=E9ries pour obtenir un r=E9seau 16bits? ou bien dans le c=E2blage entre les PortB et PortD?

n'=E9tant pas un pro dans les r=E9seaux R2R... si vous avez une id=E9e...merci d'avance....

vede ;O]

ps:sur les 2 sch=E9mas, j'utilise des r=E9sistances de 10K pour R et 20K pour R2 ...(...r2r...)...

Reply to
vede
Loading thread data ...

On Jul 15, 3:47 pm, vede

Si ton schema 16 bits est une extension du 8 bits, tout est ok. Le probleme que tu as ne provient pas de ton montage, mais des specifications du format des fichiers RIFF / WAV. Genere une sinusoide numerique, et regarde la sortie du CNA a l'oscilloscope : tu verras un retournement d'amplitude !

En 8 bits, chaque echantillon est un entier *non-signe*, on a donc les correspondances suivantes : valeur -> amplitude 0x00 -> 0 0x7F -> 127 0x80 -> 128 0xFF -> 255

En 16 bits, chaque echantillon est un entier *signe*, on a donc les correspondances suivantes : valeur -> amplitude 0x0000 -> 0 0x7FFF -> +32767 0x8000 -> -32768 0xFFFF -> -1

Tu vois le topo ? Ne me demande pas pourquoi, c'est pas moi qui l'ai fait ! Donc pour chaque mot de 16 bits tu dois juste faire la conversion signe/non-signe avant d'ecrire ce mot vers ton CNA ... au boulot ! Eh ...tiens-nous au courant :-)

Reply to
Jean-Christophe

Ce n'est peut-être pas directement le problème que vous rencontrez mais....avez-vous idée de la précision que doivent avoir les résistances du réseau pour prétendre à une profondeur de 16 bits ?

Vincent

Reply to
Thiernesse Vincent

tu mets un ampli (un AOP en suiveur) apr=E8s ton r=E9seau ? tu sais que la r=E9solution en 8 bits (1/256) correspond =E0 0,5%, donc tu es d=E9j=E0 =E0 la limite pratique de la pr=E9cision de tes r=E9sistances ? Tu sais que le bruit dans l'alimentation caus=E9 par l'activit=E9 du PIC causera des variations plus importantes en sortie que 1 LSB en 16 bits ? Pour passer =E0 16 bits je recommande d'utiliser une puce adapt=E9e, o=F9 les chemins de courant sont =E9quilibr=E9s et diff=E9rentiels. J'avais fait une carte DAC st=E9r=E9o 16 bits il y a longtemps (=E0 base de DAC7642) mais j'avais des soucis de bruit dans la r=E9f=E9rence de tension :-/

formatting link

bonnes bidouilles, yg

--=20

formatting link
/
formatting link

Reply to
whygee

vede se fendait de cette prose :

N'aurais-tu pas tout simplement interverti tes ports ? Ca donnerait ce résultat.

--
LeLapin
Reply to
LeLapin

Bonsoir =E0 tous,

et merci beaucoup pour toutes vos infos...

alors pour commencer, LeLapin, j'y avais pens=E9... si j'inverse LSB-MSB c'est encore pire (son inreconnaissable)...

apr=E9s oui, j'ai un AOP LM386 en sortie... d'ailleurs =E7a fonctionne impec. en 8 bits....

et je suis conscient qu'avec mes resistances "=E0 deux balles" "entendre" le bit 7 du LSB sera illusoire...mais del=E0 =E0 entendre actuellement une esp=E8ce de "bouillie" audio...=E0 la place du son...

j'ai pens=E9 =E0 une puce adapt=E9e, mais j'en ai pas sous la main, j'ai commenc=E9 =E0 regarder, mais les r=E9fs que j'ai vu sont hors de prix (+ de 20 dollars)...

donc suis all=E9 chercher du c=F4t=E9 du format de fichier .wav,

formatting link
et donc je vais tenter, dans les prochaines heures, une conversion sign=E9 > non-sign=E9 comme me proposait Jean Christophe...

au d=E9part je pensait avoir "mal" c=E2bl=E9 les 2 r=E9seaux R2R (sur PertB et PortD) entre eux...style il aurait manqu=E9 un diviseur de tension en sortie du R2R du LSB ...

n'h=E9sitez pas si vous aves plus d'infos, je vous tiens au, jus, vede ;O]

Reply to
vede

vede a écrit :

tu n'aurais pas inversé les 2 paquets de 8 bits (poids forts et poids faibles )??

JJ

Reply to
jj

vede a écrit :

Les 2 ports sont-ils mis à jour en même temps ? Car si un port est rafraichi avant l'autre, ca pourrait peut-être expliquer ton pb ...

Reply to
Chevalier S.

Bonsoir =E0 tous,

non pas exactement, mais en moins de 0.3=B5s... je ne pense pas que le probl=E8me vienne de l=E0, mais j'ai test=E9 (inversion rafraichissement LSB-MSB) sans succ=E8s...

vede ;O]

Reply to
vede

On Jul 15, 6:55 pm, vede

Oui : tu aurais bien de la distorsion, mais pas a ce point.

J'avais ecrit un programme C pour generer des fichiers WAV ... tout allait bien en 8 bits mono et stereo, puis ca s'est mis a merder en mode 16 bits ... j'ai rame un moment avant de realiser que si le 8 bits est bien *non-signe*, le 16 bits est *signe* # 8-bit stored as unsigned bytes, 0 to 255 # 16-bit stored as 2-complement signed integers, -32768 to 32767.

formatting link

Fais gaffe aussi a mettre a jour les deux blocs de 8 bits au meme instant, ou au moins, avec un delai maxi equivalent a une seule instruction (les deux ports toujours en sortie, pour ne pas avoir besoin de reecrire les directions TRISx) ecrire le MSB d'abord, puis ensuite le LSB, a la volee. En ASM c'est ok, mais en C, le compilo peut te jouer de mauvais tours a ce niveau ... a surveiller.

Reply to
Jean-Christophe

C'est parce-que dans un WAV le 16 bits est *signe*

formatting link
Sois pas tetu :op

Reply to
Jean-Christophe

Bonsoir,

La réponse qu'a donné Jean-Christophe (datée du 15/7 à 17h41) est la bonne (j'ai été confronté moi même à ce problème, en plus de celui de travailler sur du materiel Motorola). Pourquoi l'ignorez-vous?

Antoine

Reply to
Antoine Rouchet

On Jul 15, 8:54 pm, "Antoine Rouchet"

la bonne

de travailler

Intel/Motorola ... je devine une inversion MSB/LSB, aka BigEndian ?

Il fait le fier ... ils sont commeu ca, les Toulousaings !

Reply to
Jean-Christophe

Salut,

Oui, j'ai eu le même problème lors d'une programmation. Sur le 8bits on va de 0 à 255 où 127 est la valeure du silence. Pour le 16bits (en fait, 15bits) on a un signage à partir du silence 0v et 15bits en positif / 15bits en négatif. Il faut donc doubler le convertisseur pour le positif et les négatif. On obtient alors un circuit mirroir avec une variation à partir de

0v et non à partir de -vcc. Le 16bits non signé est rare... mais certains programmes audio Tu peux regardé sur vb81 xur ... ou plutôt dans ZxSpectape... Mais je crois que la version des sources est boguée en 16bits! ... si ça peut t'aider... Xav.
Reply to
GzavSnap

Exactement :) en plus le CNA était un 15 bits, et j'en étais à mes débuts d'éléctronicien (en BTS II) d'où un petit gratage de tête en regle. Mais c'était amusant :)

Curieuse idée que d'ignorer la bonne réponse. Il devrait animer un jeu télévisé ce garçon, ça serait amusant :)

Antoine

Reply to
Antoine Rouchet

Bonsoir =E0 tous,

bon ben =E7a ne fonctionne pas encore ;O] j'ai pourtant t=E9st=E9 en manipulant les octets msb et lsb dans tous les sens...

je pense que je suis pas au point au niveau de la conversion unsigned>signed... me suis inspir=E9 de ces formules:

formatting link

le code donne =E7a: ' d=E9clarations des variables dim caracter, mymsb, mylsb as byte dim data as longint

' je r=E9cup=E9re les 2 octets Mmc_Fat_Read(caracter) mymsb =3D caracter Mmc_Fat_Read(caracter) mylsb =3D caracter

' que je transforme en longint (data 16 bits) data =3D mymsb * $FF data =3D data + mylsb

' que je transforme en 16bits sign=E9s? data =3D data + $8000 if data >=3D $10000 then data =3D data - $10000 end if

' je r=E9cup=E9re mes 2 octets dans le 16bits mymsb =3D data DIV $FF mylsb =3D data MOD $FF

' and play ;O] PORTD=3Dmymsb PORTB=3Dmylsb

voil=E0.... merci si vous avez une id=E9e... sur une erreur de conversion unsigned>signed... ou autre...erreur... vede ;O]

Reply to
vede

Ce serait plutôt data = mymsb * $100

Et sur ces deux, une question se pose : est-ce que mymsb sont bien interprétés comme des valeurs non-signées ? Si c'est interprété comme des valeurs signées, ça va faire n'importe quoi.

Ça, ça me semble bon.

Et là, ça serait plutôt mymsb = data DIV $100 mylsb = data MOD $100

Sinon, il reste les problèmes électroniques, comme le manque de linéarité avec des résistances classiques (même des 1 %), ou le changement non synchrone de PORTB et PORTD...

Bonne nuit,

Nicolas

Reply to
Nicolas Boullis

oh mon dieu :-/

oui je sais, je r=E2le alors que j'ai aussi =E9crit du code comme =E7a dans ma jeunesse. Mais j'ai vite appris que =E7a n'=E9tait pas viable ...=

ouh l=E0 d=E9j=E0 =E7a a d=E9j=E0 l'air bien lent...

Aussi, je vois que tu charges d'abord le MSB, donc en format BIG ENDIAN, as-tu essay=E9 d'inverser l'ordre ? tu as dit "oui" pr=E9c=E9demment mais pas comment.

naaaaaannn ! ouinnnnnn.... c'est affreux :-/

donc tu passes par une variable de taille diff=E9rente, sur laquelle tu fais des op=E9rations arithm=E9tiques LOURDES pour ton pauvre PIC qui n'est pas fait pour =E7a, en plus tu lui demandes de travailler sur 32 bits alors que

16 devraient suffire... et encore !

Comme dit avant : changer d'abord le LSB.

Ensuite : toute conversion est inutile. Tu remarqueras, en faisant les exp=E9riences sur papier que la seule chose qui distingue un entier sign=E9 d'un non sign=E9, c'est JUSTE le MSB ... tout ce que tu as =E0 faire c'est d'inverser sa valeur :-D

en gros :

Mmc_Fat_Read(caracter) mylsb =3D caracter ' LSB first : little endian Mmc_Fat_Read(caracter) mymsb =3D caracter xor $80 ' note : character + $80 devrait aussi fonct= ionner, c'est strictement la m=EAme chose dans ce cas. PORTB=3Dmylsb PORTD=3Dmymsb

Disclaimer : non test=E9, peut faire pleuvoir des poireaux, ou entendre des bruits sataniques dans le chaos sonore g=E9n=E9r=E9, enfin bref, c'est juste des suggestions. J'esp=E8re au moins que =E7a fait avancer le schmilblick :-)

bon courage,

yg

--=20

formatting link
/
formatting link

Reply to
whygee

ionner, c'est strictement la m=EAme chose dans ce cas.

Bonsoir =E0 tous,

bon ben...;O[

et :

- non je n'ai pas encore tent=E9 la transformation de chaque octet en Little vers Big Endian...mais juste des inversion msb-lsb des 2 octets des 16bits (mot)...

et

- je viens d'essayer :

sans succ=E9s (bouillie...reconnaissable...)...

je continue demain, et vous tiens au jus, bon'nuit, vede ;O]

Reply to
vede

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.