Forum: Mikrocontroller und Digitale Elektronik Mp3 Wiedergabe - AT89C51SND1C


von Manuel Fegerl (Gast)


Lesenswert?

Hallo an alle

wie vielleicht schon aus älteren Threads bekannt versuche ich einen
MP3-Player mithilfe des AT89C51SND1C zu realisieren. Gelesen werden die
Daten von einer üblichen IDE-Festplatte, das funktioniert schon
einwandfrei.. kontrolliert über visuelle ausgabe bestimmter datensätze
am LCD..

Leider tut jedoch der MP3-Dekoder nicht was ich will. Er tut nämlich
garnichts. Nach aktivierung fordert er ein Frame an, und ladet so lange
Bytes bis das Frame komplett ist, danach treten sofort Layer, Sync. und
CRC Fehler auf.

Woran das genau liegt ist mir unklar.. für mich gäbe es 2 Ansätze:

1.) Wir geben ihm das gesammte MP3-File.. ist das so richtig? oder muss
ich den reinen Datenstrom herausfiltern und ihm diesen geben? also ohne
ID3-Tags etc..?

2.) Die Dekoderfrequenz... ergibt sich durch Teilung des PLL-Taktes.
Leider war es mir anhand des Datenblatts nicht möglich hier konkrete
Frequenzen herauszufinden, das einzige was angegeben ist sind
Mindestfrequenzen. Reichen diese aus, oder muss man sich bei bestimmten
bitraten,samplingfrequenzen etc an eine bestimmte dekoderfrequenz
halten.. und falls ja wie errechnet man diese?

Vielen Dank für eure Hilfe

Schöne Grüße
Manuel

von Tobias Schneider (Gast)


Lesenswert?

Hi,
wenn deine dateien id3v2 tags am anfang haben darfst du die nicht dem
dekoder geben. der versteht die nicht. bei den frequnezen musst du bei
dem dekoder nur ueber dem minimum bleiben. das interface zum audio-dac
braucht aber eine bestimmte frequenz(passend zu samplingrate der
dateien), damit die audio daten in der richtigen geschwindigkeit
rausgehen.

Gruß tobias

von Manuel Fegerl (Gast)


Lesenswert?

Hi Tobias, danke für die schnelle Antwort

weißt du zufällig wie ich einfach und effektiv den ID3V2 header
wegschneiden kann? hab mir verschiedene dateien angesehen, und das
sieht oft ganz anders aus.. hab da noch keine wirkliche übereinstimmung
gefunden.. vielleicht hast du da ne idee?

übrigens: hast du vielleicht ne andre kontaktmöglichkeit als dieses
forum? falls du sie nicht im forum posten magst kannst mir gern auch ne
email schicken.

von Tobias Schneider (Gast)


Lesenswert?

Hi,
warum nicht im forum? Nur so koenen auch andere leute was davon haben.

Es ist eigendlich relativ einfach den ID3 heder wegzuschneiden. Du
musst einfach nur nach dem ersten gueltigen mp3 frame suchen. das
beginnt immer mit 0xFF und 0XFA oder 0XFB.

Ich hab diesen java code benuzt um ihn die position in der datei zu
ermitteln:
RandomAccessFile mp3In = new RandomAccessFile(file,"r");
while((temp=mp3In.read())!=-1){
  if(temp == 0xFF){
    temp = mp3In.read();
      if(temp==0xfb || temp==0xfa){
        mp3In.seek(mp3In.getFilePointer()-2);
        ltemp=mp3In.getFilePointer();
        break;
      }
  }
}

sollte leicht auf c portierbar sein

Gruß Tobias

von Manuel Fegerl (Gast)


Lesenswert?

hast ansich recht, weiß nur nicht wie oft du hier reinschaust.. aber
scheinbar eh häufig :)

danke nochmals

zusammenfassend:

der MP3-Dekoder Takt ist egal, solange er mindestens der
Mindestfrequenz laut Datenblatt entspricht.

Das erste Frame bekomme ich durch einfaches suchen nach FF FA/FB, wobei
dieses FF FA/FB dann zum ersten frame schon dazugehören (oder?)

Der Audio-Ausgang-Clock ist von der samplingrate abhängig.. hast du da
vielleicht genauere anhaltspunkte für mich.. eventuell ne formel oder
ne umrechnungstabelle? als dac verwend ich einen AD1858.

Vielen Dank

grüße
Manuel

von Tobias Schneider (Gast)


Lesenswert?

Hab mir damals ueber ein kleines java programm( :) ) die werte fuer
20mhz und 44.1khz(gibt eh kaum andere raten) ausgerechnet.

Hier das ergebnis:

/*
Clock = 20000.0
nDiv = 125.0 rDiv = 568.0 PLLClock = 90317.46
aDiv = 7.0 AudioClock = 11289.683
mDiv = 3.0 MP3Clock = 22579.365
*/

void InitMP3()
{
  MP3CLK=3;
  MP3VOL = MP3VOR = 0x0F;
  MP3CON=0xA0;
}

void InitAudio()
{
  AUDCLK=7;
  AUDCON0=0x86;
  AUDCON1=0x40;
  wait_10ms(1);
  AUDCON1=0x41;
}

void InitPLL()
{
  PLLNDIV=125;
  PLLRDIV=0x8E;
  PLLCON=0x02;
  while(!(PLLCON & 0x01));
}

Ich habe damals aber einen PCM1728 genommen(Ich schaetze mal genauso
ein Sample wie dein AD :) )

Ich glaube der hate eine 386fache sample rate. weis es aber leider
nicht mehr genau.

Gruß Tobias

von Tobias Schneider (Gast)


Lesenswert?

ok 11289.683KHz / 44.1 KHz = 256,002 also 256fache samplerate. ich
denke, dass du deinen dac darauf einstellen kannst.

von Manuel Fegerl (Gast)


Lesenswert?

ja meinen dac kann man in beiden betriebsarten betreiben

ok danke erstmal, werd das alles testen (komm leider erst kommenden
donnerstag dazu)

meld mich dann wieder :)

von Manuel Fegerl (Gast)


Lesenswert?

Hey :)

Danke erstmal, der MP3 Dekoder funktioniert nun (jippie)

jetzt fehlt praktisch nur noch der DAC.. könntest du mir vielleicht
erklären wie du die frequenzen für ihn berechnet hast? damit ich das
mit meinem DAC nachvollziehen kann

vielen dank

grüße
Manuel

von Stefan M. (skysurfer)


Lesenswert?

Hi,

ich bastel auch grad etwas mit dem 89C51snd1c rum und hänge grade etwas.
Wie hast du die IDE Platte an den Chip angeschlossen?
Über Levelconverter? Wenn ja über welchen?

Gruß Stefan

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.