Forum: Mikrocontroller und Digitale Elektronik VS1011 an PIC18F252 Audio-Probleme


von Gast (Gast)


Lesenswert?

Hallo allerseits,
ich weiß, dass der altbekannte VS1011er hier schon x-Fach 
durchdiskutiert wurde, habe aber bisher keine einzige passende Antwort 
bzw. Lösung für meine Probleme gefunden...

Problem Nr.1:
Die Initialisierung scheint nicht immer richtig zu klappen... Ich muss 
mein Board mehrfach ein und ausschalten, biss beispielsweise der 
Sinustest klappt. Desweiteren klickt der VS beim ersten einschalten ein 
wenig dumpf. beim wiederholten einschalten ist es ein "besseres" 
knacken. (klingt doof, ich weiß ^^). Also fast so, als wären 
irgendwelche Elkos noch nicht geladen... Aber auch mit nem riesigen 
Delay vor der ersten init. knackt es iwie dumpf... Hier mein init-code:

void VS1011_HardReset(void)
{
  XCS=1; XDCS=0;
  Delay_ms(50);

  do {
    VS_R=0;
    VS_R_In();
    Delay_ms(1);
    VS_R=1;
    VS_R_Out();
    VS_R=1;
    Delay_ms(20);
    XDCS=1;            //laut App.Note ist ein lo-hi wechsel nötig
    XDCS=1;
    Delay_ms(1);
    while(!DREQ);
    VS1011_Null(32);
    VS1011_Write(0x00,0x00,0x04);
    Delay_ms(1);
  //  while(!DREQ);
  }while(!DREQ);

  VS1011_Write(0x00,0x08,0x00);
  while(!DREQ);
  VS1011_Write(0x0B,0x20,0x20);
  while(!DREQ);
//  Delay_ms(200);
}


Problem Nr.2:
Bei der Wiedergabe einer MP3 gibt es je nach Bitrate bestimmte 
Aussetzer: Bei kleiner Bitrate setzt der Song aus und springt 
Stückweise... Bei hoher Bitrate setzt es ebenfalls aus und es wird in 
die länge gezogen.

Den Effekt mit der hohen Bitrate kann ich mir erklären: Mit 1,5Mhz 
SPI-Takt kommen schlicht und ergreifend zu wenig Daten pro Sekunde an.
Aber das mit der niedrigen ist seltsam... Es wirkt als würde ich Dreq 
nicht handlen, aber genau das tue ich. Anbei der Code:

void VS1011_WriteBlock(void)
{
  unsigned int i=0;

  XDCS=0;

  for(i=0;i<512;i++) {
    VS1011_MP3Data(SD_Data[i]);     //SD_Data ist das globale Array mit 
den Daten von der SD-Karte
    if((i % 32)==0) {
      while(DREQ==0)  {
      Nop();
      }
    }
  }

  XDCS=1;
}


Ich bin für jeden Tipp und jede Hilfe sehr dankbar!

mfg guest ;-)

von Jean P. (fubu1000)


Angehängte Dateien:

Lesenswert?

Zu 1.) Das ist normal, weil die Elkos schlagartig geladen werden. 
Deswegen gibt es in der Application Note von VLSI die Schaltung im 
Anhang, um das ploppen zu verhindern.


Zu 2.)Ich wette deine Register Einstellungen vom Takt sind falsch. 
Deswegen mit was für einem Takt läuft dein VLSI (nur wenn du nen 
24,576Mhz Quarz dran hast brauchste nit einstellen).

Aso und ich hoffe das deine Funktion vier Bytes schickt 
("VS1011_Write(0x0B,0x20,0x20);") --> 0x02 , 0x0B , 0x20 , 0x20.

von Gast (Gast)


Lesenswert?

Hallo,

1:
das ploppen an sich ist nicht das Problem. Seltsam ist nur, dass wenn 
das "dumpfe" knacken kommt, der VS dann definitiv nicht funktioniert. Er 
läuft nur, und auch dann nur manchmal, wenn dieses helle knacksen kommt.

2:
Ich wette dagegen ;-) ich hab nämlich genau den 24,576 MHz Quarz ^^ Ich 
hab das Datasheet eig recht gut studiert...

3:
Jop, in meiner Funktion ist das Byte 0x02 fest implementiert...

Vielen Dank für die Hilfe.

Allerdings bleiben die Probleme ja noch offen... ich kanns mir nicht 
wirklich erklären... ich warte ganz regulär auf DREQ und trotzdem 
springt die mp3 mit niedriger bitrate... bei 128kbit/s ist es fast 
super... es wird weder zu langsam gespielt, noch springt er extrem... 
aber die kleinen sprünge nerven trotzdem und Sinn der Sache ist es ja 
auch nicht...

gruß guest

von Jean P. (fubu1000)


Lesenswert?

Hallo, probiers mal so.
Also erst High-->warten-->Low-->warten-->High-->warten-->DREQ high-->OK
An PB0 ist der Reset Pin vom VLSI:

unsigned char VS_init()
{
  SPCR = 0x51;
  SPSR = 0x01;

  PORTB |= (1 << PB0);
  _delay_us(1);

  PORTB &= ~(1 << PB0);
  _delay_us(7);

  PORTB |= (1 << PB0);
  _delay_ms(5);

  unsigned char DREQ = 0x00;
  DREQ = PINB;
  DREQ = DREQ & 0x02;

  unsigned char Status = 0;
  if(DREQ == 0x02)
  {
    Status = 1;
  }

  return Status;

}

von Bit-Pfriemler (Gast)


Lesenswert?

jetzt bin ich mal wie viele bei threads von mir:

Nimm nen STA013, da funktioniert das leicht...

von Gast (Gast)


Lesenswert?

@Fabian Ostner

werds gleich ausprobieren

@Bit-Pfriemler

das scheint mir nicht so ganz das gelbe vom Ei ;-) ich arbeite lieber an 
meinen Problemchen ^^

gruß guest

von Gasr (Gast)


Lesenswert?

@Fabian Ostner

hat leider keinen erfolg gebracht... Ich denke das init-problem kann ich 
vlt dadurch umgehen, dass ich nach der initialisierung ein register 
beschreibe und dies dann nochmal vergleichen lasse. bei fehler wird 
nochmal initialisiert...

das mp3-problem besteht weiterhin....

gruß guest

von Jean P. (fubu1000)


Lesenswert?

Deswegen gebe ich ja den return-Wert zurück in meiner Funktion ! Es wird 
solange die Funktion aufgerufen , bis return-Wert = 1 ist.

Zu deinem Wiedergabe Problem: Ist denn der VLSI genau so beschaltet wie 
im datasheet Seite 16 ! Also alle GPIO's mit 100K auf Masse und der 
Test-Pin auf VCC ?

Gruß

von Gast (Gast)


Lesenswert?

hallo,
jop, die beschaltung stimmt. ich kanns mir langsam echt nicht mehr 
erklären...

zu dem anderen problem: kann denn DREQ nach 5ms nach reset überhaupt 
schon 1 sein? war da nicht was mit 50000 cycles?

von Jean P. (fubu1000)


Lesenswert?

Hallo,
50000 cycles bei 24,576Mhz = 2,03ms

Haste noch nen anderen VLSI da, nur um auszuschliessen daß das Ding putt 
ist.
Bzw. Schaltung noch mal komplett überprüfen nach schlechten Lötstellen 
etc.

Gruß

von Gast (Gast)


Lesenswert?

Hallo,
die Schaltung habe ich bereits mehrfach geprüft. Nen zweiten VS1011 habe 
ich leider nicht... Wäre aber wirklich ärgerlich, wenn er die Probleme 
verursachen würde...

Ich werde morgen nochmal nach der Init schauen... Dann wäre ich 
zumindest ein Stückchen weiter...

gruß guest

von Jean P. (fubu1000)


Lesenswert?

Hmmm,
Ist das ein 24,576 Mhz Grundtonquarz ?
Gib mal Link zu dem Quarz (nit böse gemeint) !

Gruß und moin.

von Gast (Gast)


Lesenswert?

Guten Morgen
Jop, ist ein Grundtonquarz. Ich hatte in der Tat erst einen blöden 
Obertonquarz von Reichelt drin... Den Grundtonquarz habe ich dann bei 
Conrad gekauft und getauscht.
gruß guest

von Gast (Gast)


Lesenswert?

Hat sonst keiner eine pasende idee? oder vielleicht source der bei euch 
läuft? auch avr source. nur irgendwas...

gruß guest

von Andreas K. (ergoproxy)


Lesenswert?

Hi sry das ich so OT dazwischenfrage aber ich wollte mir auch in ner 
woche von Reichelt die Bauteile für mein MP3-Player Projekt holen nur 
seh ich grade das es den Quarz dort nicht gibt wie Fabian oben schon 
erwähnte gibts da nur den 3ten Oberton als Quarz. Kann man einen anderen 
bei R. nehmen so das es geht oder geht es nur mit einem genauen 24,576 
Grundton ? Wollte eigendlich nicht wegen einem Quarz noch bei nem 
anderen Versender bestellen wenn ich den gesammten rest bei R. bekomme.

Was mir zum Thema noch einfällt ist die Versorgung gut gepuffert? Die 
Ganzen Kondis ziehen ja am anfang ziemlich Strom und da könnte deine 
Spannung absacken, wodurch es zu netten Fehler beim init kommen kann. 
Notfalls lass dem Chip doch einfach etwas Zeit nach dem Einschalten so 
10 ms z.b. oder mach 2 inits also init reset init. Dann sollten alle C´s 
schon geladen sein und fehler bei der 2ten init dürften dann nicht 
auftreten. Das ist jetzt nur ne idee ^^.

Grüße ErgoProxy

von Jean P. (fubu1000)


Angehängte Dateien:

Lesenswert?

Hallo,

@Andreas : nimm nen 12,288 MHZ Quarz

@Gast: siehe Anhang und poste mal Code sowie Schaltplan.

von Gast (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
im Anhang die beiden Files. zum Thema Schaltplan fällt mir ne 
Zwischenfrage ein: wo gibts bei Eagle die GND und VDD Signal-Verbinder?
Da würde meiner nämlich erheblich übersichtlicher werden ;-)
gruß gast

von Gast (Gast)


Angehängte Dateien:

Lesenswert?

Hmm,
der Schaltplan wollte wohl nicht...
gruß Gast

von Jean P. (fubu1000)


Lesenswert?

Hallo,
ich weiss gar nicht wo ich anfangen soll !!!
Also dein Schaltplan ist schon mal Mist ! Ich frag einfach nochmal nach, 
ist der VLSI so verschaltet wie im Datasheet auf Seite 15.

1.) alle GPIO's mit 100K gegen Masse und TestPin auf VCC ?
2.) Pulldown am Reset Eingang ? RX auf VCC mit 100K ?
3.) 1 MegaOhm parallel zum Quarz ?
4.) RCAP mit 100nF gegen Masse ?
5.) Spannungsversorgungen sauber ?


So nun zum Code:
Erstmal eine Frage vorne weg. Du benutzt ja kein FAT , woher weisst Du 
das die Daten alle Sektor auf Sektor folgen ?

1.) Übernimm bitte 1:1 meine Reset Routine, deine ist ....
2.) in deiner Softreset Funktion setzt du den PIN SM_TESTS , ganz 
schlecht
3.) Und schließlich das aller schlimmste. Bei SD_readblock benutzt du 
die Funktion SD_writecmd , in der der Chipselect auf NULL gesetzt und 
anschliessend wieder auf EINS, ganz schlecht, da du den Chipselect 
mitten in der ReadRoutine aus machst. Kann also zu fehlern führen !


So das wars erstmal und genug für dich zu tun.
Gruß

von Gast (Gast)


Lesenswert?

Hallo,
der Schaltplan ist mies, das muss ich zugeben. Ich hab seitdem auch 
etliche Verbsserungen vorgenommen:

A2) Pulldown hab ich. RX PullUp -> Welches RX? da hab ich nix im 
Datasheet gesehen...
A3) Hab ich
A4) Hab ich
A5) Ich versorge das Ding mit einem Spannungswandler IC von TI. Die 
SPannung ist auch bei exakt 3.3V

Zum Thema Sektor: Ich habe die Daten mit r-linux direkt auf den ersten 
Sektor geschrieben. Sollte zumindest eine Testlösung sein.

B1) Werd ich, sobald ich kann... Hoffe in den nächsten paar Tagen Zeit 
zu haben... Meine Routine besteht aus etlichen Versuchen, zum Teil 
zusammengewürfelt ^^
B2) Ja, das war noch, als ich die Sinus-Tests implementiert hatte... 
Wird aber z.Z. sowieso nicht aufgerufen, wird aber geändert.
B3) Werde auch das Ausprobieren, aber im Großen und Ganzen scheint es 
nicht am SPI-Transfer zu liegen, aber natürlich prüf ich das.

Vielen Dank auf jeden Fall, für die Arbeit, die du dir gemacht hast 
thumbs up ^^

gruß gast

von holger (Gast)


Lesenswert?

Im Schaltplan sind einige AVDDx und DVDDx nicht angeschlossen.
Ich hoffe doch das sie bei dir angeschlossen sind.
Die Pins hat der Hersteller nicht ohne Grund aus dem
Gehäuse geführt.

von Gast (Gast)


Lesenswert?

Hallo,
ich setze gleich die code-änderungen um.
Ja, ich hab alle VDD's und GND's angeschlossen.
gruß gast

von Gast (Gast)


Lesenswert?

Hallo,
hier die Ergebnisse:
1) Deine Init hat leider kein erfolg gebracht... Hier meine Umsetzung:

void VS1011_HardReset(void)
{
  uchar i=0;
  do {
    VS_R=1;
    VS_R_Out();
    Delay_ms(1);
    VS_R=0;
    VS_R_In();
    Delay_ms(7);
    VS_R=1;
    VS_R_Out();
    Delay_ms(5);
  } while(DREQ==0);

  VS1011_SoftReset();
}

2) Das mit dem ReadBlock habe ich umgesetzt. Es scheint sich etwas 
geändert zu haben, bin mir aber nicht sicher... Insgesamt allerdings 
immernoch das selbe Problem -.-
gruß Gast

von Jean P. (fubu1000)


Lesenswert?

Hallo, vollständigen neuen Code posten bitte.

Gruß

von Tobias P. (hubertus)


Lesenswert?

Du weisst, dass dr Core mmax. 2.5V verträgt? Hast du den etwa auch mit 
3.3V versorgt?

von Jean P. (fubu1000)


Lesenswert?

@Gast: Aso RX gibts beim VS1011 gar nit, mein Fehler.
Wie sieht es denn mit dem Sinustest aus ? MAch den mal ohne dein 
VS1011_StopSine Funktion. Dann sollte ein Pfiepen zu hören sein.
Wenn das auch aussetzt, ist es ein Hardware Fehler, ansonsten iss was is 
deiner Software. Wenn Sinustest klappt, poste deinen neuen 
vollständingen Code. Andernfalls den Schaltplan.


@Tobias: Blödsinn ! Er hat nen 1011 und keinen 1003 oder 1033.


Gruß

von Gast (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
anbei die main.c. Deine Init-Routine habe ich mittlerweile wieder 
auskommentiert...
Habe auch das mit dem schreib-lese-test implementiert. init wird jedoch 
trotzdem nur einmal durchlaufen, also hängt es scheinbar nicht mit dem 
SCI-Teil zusammen... Werde mal nen SDI-Schreibtest implementieren 
müssen...

laut datasheet sind für analog und digital-vdd ein spannungsbereich von 
2,5-3,3V angegeben?!

gruß gast

von Gast (Gast)


Lesenswert?

Hallo,
der Sinustest klappte ebenfalls nur manchmal -> selbes symptom...

von Jean P. (fubu1000)


Lesenswert?

Also der Sinustest ohne deine StopSine-Funktion setzt auch aus?

Gruß

von Tobias P. (hubertus)


Lesenswert?

Au shit!
sorry. Ich hab erst grad gesehen dass du den VS1011 hast....
ich hab das Datasheet vom 33er angeguckt.

von Jean P. (fubu1000)


Lesenswert?

Hmmm,
mal ne Frage, weil ich keine PICS kenne, aber was macht VS_R_Out() und 
VS_R_In() ??? Ich hoffe nicht auf Ausgang und Eingang schalten.

Außerdem konnte die Reset Funktion, die du von mir übernommen hast, nur 
funktionieren, wenn du danach den Sinustest gemacht hast. Denn in deiner 
SoftReset Methode ist immer noch SM_TESTS_Bit gesetzt !

Gruß

von Gast (Gast)


Lesenswert?

Hallo,
der Sinustest fing manchmal gar nicht erst an. Eben errst nach 
mehrmaligen Aus- und Einschalten.
VS_R_Out() und In schalten Tatsächlich auf Ausgang und Eingang. Als 
Eingang Ist der PIC ja im High-Impedance Modus -> also müsste der 
Pulldown den VS auch auf Reset setzen. Oder liegt da mein Denkfehler?
Ich habe Deine Reset-Funktion wie angegeben übernommen. Bis zum 
Softreset kam es ja gar nicht, da der VS bzw. ununterbrochen Resetted 
hat. Dadurch kam nur ein unangenehmes Rattern zustande. Zumal ich das 
SM_Tests-Bit ja aus der SoftReset schon entfernt habe...

Bin langsam am verzweifeln...

gruß gast

von Thorsten (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

anbei mein Code für den VS1011. Läuft auf einem PIC 18F87J10 (CCS 
Compiler )

Viel Spaß

Gruß

Thorsten

von Thorsten (Gast)


Lesenswert?

Hier der zweite Teil

von Thorsten (Gast)


Angehängte Dateien:

Lesenswert?

Ups

von Jean P. (fubu1000)


Lesenswert?

@Gast: du schaltest den PIN vom µC auf AUSGANG (nix mit Eingang) an dem 
der Reset ist und der bleibt auch AUSGANG!!! Und toggelst auf High , 
wartest kurz , wieder LOW, kurz warten und letztlich auf High und kurz 
warten, voila VS1011 ist Resetet und startbereit. Und dann teste mal obs 
Unterbrechungen gibt bei while(1) { VS1011_SineTest; } . Wenn nicht 
Hardware Ok, andernfalls ....


@Thorsten: Ich würde an deiner Stelle bei write Data mal den DREQ 
abfragen ob der überhaupt Daten will ! Außerdem ist die max. SPI Clock 
bei SCI reads auf XTAL/6 im Datenblatt angegeben , also statt deiner 
5Mhz , so um die 4Mhz.
KAnn funktionieren also, aber muss halt nicht.

von Thorsten (Gast)


Lesenswert?

Das mit dem SPI ist klar, aber da es geht warum ändern?
Der DREQ Ausgang wird abgefragt, allerdings nicht für jedes Datenbyte 
sondern  bevor ich den Puffer fülle. ( In einer anderen Datei zu finden 
)

Gruß

von Jean P. (fubu1000)


Lesenswert?

@Thorsten: nicht für jedes Datenbyte ^^ , aber nach jedem 32Byte 
Häppchen sollte er abgefragt werden ob der Puffer schon voll ist und er 
überhaupt noch Daten will, wenn nicht , warten bis DREQ wieder auf High 
!
Und das mit den 5Mhz SCI-read schrieb ich ja schon kann funzen muss aber 
nicht. Beim nächsten VLSI klappts vielleicht nicht.

Gruß

von Thorsten (Gast)


Lesenswert?

Wird auch genau so gemacht!

Gruß

von Gast (Gast)


Lesenswert?

Hallo,
Änderungen umbesetzt... Leider hängt der VS in der Hardreset-schleife 
fest...
gruß gast

von Jean P. (fubu1000)


Lesenswert?

Poste mal deinen neuen Code, wie soll man sonst was sagen.
Noch besser du nimmst nen AVR , dann kannste nen Code 1:1 übernehmen von 
mir (Poste ihn dann)^^. Wenns dann nit läuft würde ich auf ein Hardware 
Problem tippen, was ich mittlerweile eh tue.

P.S: Was ist denn damit, wenn dein VLSI mal den Reset schafft
-----> while(1) { VS1011_SineTest; } ??????????????
Gibts da auch Aussetzer oder nit ???

von Gast (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
wenn der VS mal den Reset schafft (war bisher nur mit meiner Routine der 
Fall) genügt es, wenn nur ein einziges mal die Sinus-Funktion aufgerufen 
wird. Dann piept er fröhlich bis die Hölle zufriert ^^
Ich habe nochmal 2 VS-chips bei Reichelt bestellt. Werde einen auf jeden 
Fall wechseln... Die Hardware überprüfe ich nochmals beim Einbau des 
neuen Chips...
gruß Gast

von Gast (Gast)


Lesenswert?

Nochwas:
Den "Reset schaffen" sollte ich genauer definieren:
Mit meiner Compare-Funktion läuft der Reset genau ein mal ab. Dann kann 
es aber dennoch sein, dass er weder Sinustest, noch MP3-Daten abspielt. 
Nach mehrmaligen aus- und einschalten spielt er iwann alles ab...
In meinem obigen Code fehlt das Bit SM_Tests ist mir gerade aufgefallen, 
aber das würde auch nichts daran ändern, dass er Deine Reset-Routine nie 
verlässt... Der alte VS ist schon rausgeschnitten, also werd ich sowieso 
auf die neuen warten... Ich würde gern langsam Ergebnisse erzielen ;-)
gruß Gast

von Jean P. (fubu1000)


Lesenswert?

Also wir sollten uns erstmal nur um den Reset und den Sinustest kümmern, 
wenn das ordentlich läuft, sollten wir uns um andere Sachen kümmern.
Das meine ResetRoutine nit geht wundert mich sehr. Die funzt auf ca. 6 
Stück (von VS1011 bis 1033) MP3-Decodern und zwar IMMER beim 
einschalten. Mach mal nen ordentlichen Schaltplan. Notfalls male ihn auf 
nen Dina4 und scanne das Dingen ein. Mit allen Bauteil Bezeichnungen.

Also bi denne wenn deine neuen Chips da sind^^.

Gruß

von Gast (Gast)


Lesenswert?

Einen schönen guten Morgen allerseits,
also die neuen VS sind gekommen und ich hab gleich einen eingebaut. Die 
Probleme sind allerdings die selbe wie vorher auch...
gruß Gast

von Gast (Gast)


Lesenswert?

Ich komme einfach nicht weiter... Ich habe die Hardware x-fach 
gecheckt... Wenn mir jemand sagt, wo es bei Eagle die Masse und VDD 
Verbinder gibt zeichne ich nochmal einen Schaltplan zum angucken...
gruß Gast

von Thorsten (Gast)


Lesenswert?

Hi,

miss auch mal am PIN RCAP. Dort sollten ca. 1.3V anliegen, ansonsten 
stimmt was mit der Beschaltung nicht.

Gruß

Thorsten

von ... .. (docean) Benutzerseite


Lesenswert?

Gast wrote:
>  Wenn mir jemand sagt, wo es bei Eagle die Masse und VDD
> Verbinder gibt zeichne ich nochmal einen Schaltplan zum angucken...

Ich mein einfach nach vcc oder gnd suchen bei den Bauteilen (mit * 
dahinter)

oder den supply Zweig suchen....

von Gast (Gast)


Lesenswert?

Am Rcap liegen die 1,3V an, das habe ich schon einmal gemessen...
Ich werde bei Gelegenheit mal den schaltplan überarbeiten...

von Gast (Gast)


Lesenswert?

Hallo allerseits,

entschuldigt, dass ich dieses uralte Thema ausgrabe, aber ich möchte 
euch noch mitteilen wo der Hase im Pfeffer lag:

#define DREQ    LATCbits.LATC1

müsste:

#define DREQ    PORTCbits.RC1

sein.

Das wars auch schon... Dieses blöde LAT Register ist memory mapped und 
nur zum schreiben gedacht -.- beim lesen werden die zuletzt 
geschriebenen werte gelesen und nicht der Pegel am Port...

Das Projekt ist übrigens mittlerweile fertig ^^

mfg Gast

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.