mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik VS1011 die 100ste [ich weiß nicht weiter]


Autor: Ben .. (lightning)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich habe ein kleines Problem mit meinem VS1011 aber wer hat das nicht.
Ich habe auch schon sämtliche VS10xx Beiträge in diesem Forum 
durchgeackert
und einen Fehler ausmärzen können aber es funktioniert nachwievor nicht 
richtig.
Der Code scheint eigentlich zu funktionieren da ich dem VS1011 bis jetzt 
2x
den Sinuston des Testes entlocken konnte aber ich habe das Gefühl, dass
dies nur aus Zufall geschah da es zustande kam als ich die Kondensatoren
am Audioausgang umsteckte(Oszi).

Ich betreibe den VS1011 mit folgenden Spezifikationen:

~ Neuer SDI-Modus (VS1002 kompatibel)
~ kein SDI-Share
~ je 100nF Kondensatoren vor den Stromversorgunen (AVDD, DVDD)
~ je 100µF Kondensatoren an den Audioausgängen´

Ich betreibe das ganze mit einem ATmega8L @ 8MHz und bei 3,3V
sowie ohne die Pegelwandlerwiderstände (1,8k und 3,3k) die oft
in VS10xx Beschaltungen zu sehen sind.
Die Quarzbeschaltung ist im Bild zu sehen.


*Und hier noch der Code:*
//============================================
// Functions:
//============================================
    void vs1011_init (void);
    void delay_ms (uint16_t xTime);

    void vs1011_sine_test(uint8_t loops);
//============================================

int main(void) {

    //init control/data port/pins
VS1011_DDR = (1<<xRESET) | (1<<xCS) | (1<<xDCS); // DREQ = input


    delay_ms(200);


    //init SPI
    SPI_Initialize();

    delay_ms(100);

    //Init VS1011
    vs1011_init();

    delay_ms(100);

    vs1011_sine_test(10);


while(1){asm volatile("nop");}
return 0;
}



//*************************************************************************
// Function: delay_ms
// Parameters: Delay in milliseconds
// Returns: none
//
// Description: Delays n milliseconds
//*************************************************************************
void delay_ms(uint16_t xDelay){
    while(xDelay != 1){
        _delay_ms(1);
        xTime--;
    }
}





//*************************************************************************
// Function: vs1011_init
// Parameters: none
// Returns: none
//
// Description: Initialize the VS1011 with some settings
//*************************************************************************
void vs1011_init(void){

    //deactivate xCD and xDC
    //sbi(VS1011_PORT, xCS);
    //sbi(VS1011_PORT, xDCS);


//-----------------------------------
// HW-Reset
//-----------------------------------
    // clear xreset pin -> hardware reset
    cbi(VS1011_PORT, xRESET);
    delay_ms(10);
    // set xreset pin -> vs1011 will go out of hardware reset state
    sbi(VS1011_PORT, xRESET);
//-----------------------------------


    // wait until DREQ goes high
    loop_until_bit_is_set(VS1011_PIN, DREQ);


    delay_ms(100);


//-----------------------------------
// Set Mode - 1002 native mode
//-----------------------------------
    sbi(VS1011_PORT, xDCS); //xDCS disable
    cbi(VS1011_PORT, xCS);  //xCS enable

    delay_ms(10);

    SPI_Send_Byte(VS1011_WRITE);    //write data
    SPI_Send_Byte(VS1011_MODE);
    SPI_Send_Byte(0x08);            //SM_SDINEW + SM_TESTS
    SPI_Send_Byte(0x20);            //

    sbi(VS1011_PORT, xCS); //xCS disable
//-----------------------------------
}





//*************************************************************************
// Function: vs1011_sine_test
// Parameters: Number of beeps to play
// Returns: none.
//
// Description: Play sine wave beeps on VS1011
//*************************************************************************
void vs1011_sine_test(uint8_t loops){

uint8_t ES[8] = {0x53, 0xEF, 0x6E, 0x7E, 0x00, 0x00, 0x00, 0x00};
//uint8_t DS[4] = {0x45, 0x78, 0x69, 0x74};


//-----------------------------------
// Set Mode - Sine test
//-----------------------------------
    sbi(VS1011_PORT, xDCS); //xDCS disable
    cbi(VS1011_PORT, xCS); //xCS enable

    delay_ms(50);

    SPI_Send_Byte(VS1011_WRITE);    //write data
    SPI_Send_Byte(VS1011_MODE);
    SPI_Send_Byte(0x08);            //SM_SDINEW + SM_TESTS
    SPI_Send_Byte(0x20);            //

    delay_ms(50);

    sbi(VS1011_PORT, xCS); //xCS disable
//-----------------------------------

    delay_ms(50);

    cbi(VS1011_PORT, xDCS);

    //for(uint8_t x=0; x<loops; x++){


        for (uint8_t i=0; i<8; i++){
            SPI_Send_Byte( ES[i] );
        }


        /*
        delay_ms(500);


        for (uint8_t a=0; a<4; a++){
            SPI_Send_Byte( DS[a] );
        }

        delay_ms(500);

    }
    */

    //sbi(VS1011_PORT, xDCS);

}


*Hier noch die SPI-Funktionen:*
//*************************************************************************
// Function: SPI_Send_Byte
// Parameters: Byte to send
// Returns: none
//
// Description: Send byte over SPI
//*************************************************************************
void SPI_Send_Byte(uint8_t nByte)
{

  //Send a byte...
  SPDR = nByte;

  //Wait until sending is completed...
  while( !(SPSR & (1<<SPIF)) );
}





//*************************************************************************
// Function: SPI_Initialize
// Parameters: none
// Returns: none
//
// Description: Initialize the SPI function
//*************************************************************************
void SPI_Initialize(void)
{
    // configure SPI pins - set PB4(SS) HIGH for SPI operations!
    SPI_DDR |= (1<<SPI_MOSI) | (1<<SPI_SCK);  // config SPI pins
    SPI_PORT |= (1<<SPI_MOSI) | (1<<SPI_SCK);

    SPI_DDR |= (1<<SPI_SS);    // set SS output
    SPI_PORT |= (1<<SPI_SS);   // set SS high to enable SPI operations

    // enable SPI in master mode and set clock speed
    // SPI clock must be at least 3MHz with 12.288MHz crystal
    SPCR = (1<<MSTR) | (1<<SPE);  // Master mode, SPI enable, clock speed MCU_XTAL/4

#if F_CPU > 10000000UL
    SPCR |= (1<<SPR0);   // set clock speed MCU_XTAL/16
#endif
    SPSR = (1<<SPI2X);   // set clock speed MCU_XTAL/2
}

Autor: Ben .. (lightning)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Opps das Bild von der Quarzbeschaltung vergessen

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du schreibst leider nicht was jetzt genau dein Problem ist.

Autor: Ben .. (lightning)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja entschuldigung, habe ich im Eifer des Gefechts glatt vergesen :)

Das Problem ist, dass ich mir nicht sicher bin ob die Übertragung der 
Daten
für z.B. den Sinustest zum VS1011 korrekt funktioniert bzw. er die Daten
dann umsetzt.

Ich habe wie schon beschrieben zweimal die Situation erreicht, dass der 
VS1011 den Sinuston abspielt aber da habe ich etwas herumgesteckt und 
plötzlich kam er. Auch als ich dann den RESET des AVR betätigte 
wiederholte
sich die Ausgabe des Sinustones.
Dann versuchte ich den AVR zu löschen und mit dem gleichen Programm neu
zu beschreiben und die Folge davon war, dass der Sinustest nichtmehr
zu hören war.

Die Datenübertragung zu den Kontrollregistern funktioniert einwandfrei.
Ich habe es mit dem Volume-Test aus der Appnote getestet und es waren
deutliche Klicker zu hören.

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist Du sicher, daß Deine "Klicker" ein ausreichendes Indiz für die 
korrekte Datenübertragung waren?

Versuch mal Folgendes:

1) Volume-Register mit einem beliebigen Wert beschreiben (vielleicht 
nicht gerade 00 oder FF)

2) Ein anderes Register beschreiben

3) Volume-Register lesen - es muß der gleiche Wert wie bei 1) 
zurückkommen.

Ist das so?

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Code sieht ok aus auf den ersten Blick.
Wette das es am Quarz liegt , der nit anschwingt. Bringe den mal so nah 
wie möglich ans Platinchen, am besten auf die Platine.


Gruß

Autor: Ben .. (lightning)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab das jetzt getestet und es funktioniert einwandfrei das
Volume Register zu beschreiben und auszulesen.
Ich habe es auch auf fehler überprüft indem ich es mit andren Werten als
mit den vergleichswerten beschrieben habe und dann kam wie erwartet
der Fehler.

Also funktioniert das Beschreiben der Register so wie es sollte.
Nur die Daten wollen nicht.

Autor: Ben .. (lightning)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Fabian Ostner

Nunja ich weiß nicht ob das das Problem ist denn wie schon
im letzten Post erwähnt funktioniert das Schreiben/Lesen der
Register einwandfrei.

Aber ich werde es trotzdem mal versuchen.
Soll ich den Widerstand und die Kondensatoren auch mit dreuflöten ?

Autor: Jean Player (fubu1000)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

>Aber ich werde es trotzdem mal versuchen.
>Soll ich den Widerstand und die Kondensatoren auch mit dreuflöten ?

Besser iss.

habe dir mal zum testen meine VS1002 Routinen angehangen. Musst 
natürlich die Register anpassen, weil für Atmega32 geschrieben.
Wenn die nit gehen liegts definitiv an der Hardware irgendwo.

Gruß

Autor: Ben .. (lightning)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Fabian

leider hat dein code nicht funktioniert. Es kann abermauch sein, dass
ich einen Fehler bei der Anpassung an den ATmega8 gemacht habe.
Die Funktion jedoch ist jedoch in etwa gleich wie bei meinem Code.

Ich werde nun mal den Quarz direkt an die Adapterplatine drannlöten
und schauen ob es dann geht.

Gruß Lightning

Autor: Ben .. (lightning)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Interne RC-Oszi des ATmgea8L arbeitet schon mit 8MHz bei nur 3,3V
Betriebsspannung oder ?
(Natürlich mit den richtigen FUSEs)

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ben .. wrote:
> Der Interne RC-Oszi des ATmgea8L arbeitet schon mit 8MHz bei nur 3,3V
> Betriebsspannung oder ?
> (Natürlich mit den richtigen FUSEs)

Ja, steht im Datenblatt.

Zeig doch mal ein Schema deiner gesamten Schaltung.

Gruß

Autor: filzlaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Genau das Problem hatte ich auch immer. Bei mir wars auch der Quarz, der 
nicht Schwingen wollte. Starte mal dein Programm und berühr dann mit 
einem feuchten Finger die Beinchen des Quarz...

Autor: Ben .. (lightning)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs gfunden!! hurraaam VIELEN DANK AN EUCH! :)
Mann dass ja mal ein gemeiner Fehler, das erklärt auch warum ich durch
Zufall die zwei Sinustests zum Laufen brachte.

Ich wollte gerade den Quarz an die Platine löten und habe die beiden
33pF Kondensatoren ausgesteckt. Dabei habe ich irgendwie den AVR Reset
ausgelöst und plötzlich piepte es fröhlich vor sich hin.
Auch weitere Tests haben funktioniert.

Nun steht der Quarz da völlig nackt nur mit einem 1M Ohm Wid. drinn.
Ohne die Kondensatoren kann das doch eigentlich gar kein richtiger
Schwingkreis sein oder ?
Ich kann mir nicht vorstellen, dass die Kondensatoren falsch sind denn
im Datenblatt des VS1011 werden sie auch verwendet. Möglicherweise liegt 
es an ihren langen Beinchen.

Was mein ihr ?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich kann mir nicht vorstellen, dass die Kondensatoren falsch sind denn
>im Datenblatt des VS1011 werden sie auch verwendet. Möglicherweise liegt
>es an ihren langen Beinchen.
>
>Was mein ihr ?

Ne, eher an deinem Steckbrett. Das hat auch Kapazitäten.
Mit den Kondensatoren könnten sie zu groß geworden sein.
Oder die blaue Schiene liegt bei dir nicht wirklich
an Masse. Nachmessen!

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Steckbrentt soll angeblich schon genug Kapazität sein sodass ein 
Quarz anschwingt. Da ich nicht so der Steckbrettmensch bin kann ich das 
weder bestätigen noch verneinen, hab es aber schon häufig im Forum 
gelesen.

Autor: Ben .. (lightning)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jupp eindeutig das Steckbrett :)
hinzu kommen wohl noch meine 100nF Kondensatoren die
überall auf dem Brett die Spannung stabilisieren sollen.
Die haben natürlich enormen Einfluss. Naja hauptsache
er funktioniert, in der fertigen Schaltung muss ich dann
wie es aussieht den Quarz etwas weiter weg setzen und mit
einer sehr sauberen Masse füttern.

Dank euch allen nochmal für die Hilfe!

Ich melde mich dann wieder wenn was ist :)

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

freut moch das du das Teil zum laufen gebracht hast. Die Quarze die du 
hast sind mit 18pF laut Hersteller zu beschalten. Sorry, hätte ich dir 
auch mitteilen können.

Gruß

Thorsten

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ben .. (lightning) wrote:
> ... in der fertigen Schaltung muss ich dann wie es aussieht den Quarz
> etwas weiter weg setzen...

sicher nicht, es sei denn du möchtest dir einen neuen Fehler 
einhandeln...

Autor: Ben .. (lightning)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
> Ben .. (lightning) wrote:
>> ... in der fertigen Schaltung muss ich dann wie es aussieht den Quarz
>> etwas weiter weg setzen...
>
> sicher nicht, es sei denn du möchtest dir einen neuen Fehler
> einhandeln...

Ich meinte sehr nahe an den VS1011 aber so weit weg von den anderen
Bauteilen wie möglich damit nichts reinstört.
Aber danke für den Tipp.

@Thorsten
18pF ? Da muss ichmir dann wohl ein paar zulegen. Danke für die Info.

Gruß Lightning

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.