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


von Ben (lightning)


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:*
1
//============================================
2
// Functions:
3
//============================================
4
    void vs1011_init (void);
5
    void delay_ms (uint16_t xTime);
6
7
    void vs1011_sine_test(uint8_t loops);
8
//============================================
9
10
int main(void) {
11
12
    //init control/data port/pins
13
VS1011_DDR = (1<<xRESET) | (1<<xCS) | (1<<xDCS); // DREQ = input
14
15
16
    delay_ms(200);
17
18
19
    //init SPI
20
    SPI_Initialize();
21
22
    delay_ms(100);
23
24
    //Init VS1011
25
    vs1011_init();
26
27
    delay_ms(100);
28
29
    vs1011_sine_test(10);
30
31
32
while(1){asm volatile("nop");}
33
return 0;
34
}
35
36
37
38
//*************************************************************************
39
// Function: delay_ms
40
// Parameters: Delay in milliseconds
41
// Returns: none
42
//
43
// Description: Delays n milliseconds
44
//*************************************************************************
45
void delay_ms(uint16_t xDelay){
46
    while(xDelay != 1){
47
        _delay_ms(1);
48
        xTime--;
49
    }
50
}
51
52
53
54
55
56
//*************************************************************************
57
// Function: vs1011_init
58
// Parameters: none
59
// Returns: none
60
//
61
// Description: Initialize the VS1011 with some settings
62
//*************************************************************************
63
void vs1011_init(void){
64
65
    //deactivate xCD and xDC
66
    //sbi(VS1011_PORT, xCS);
67
    //sbi(VS1011_PORT, xDCS);
68
69
70
//-----------------------------------
71
// HW-Reset
72
//-----------------------------------
73
    // clear xreset pin -> hardware reset
74
    cbi(VS1011_PORT, xRESET);
75
    delay_ms(10);
76
    // set xreset pin -> vs1011 will go out of hardware reset state
77
    sbi(VS1011_PORT, xRESET);
78
//-----------------------------------
79
80
81
    // wait until DREQ goes high
82
    loop_until_bit_is_set(VS1011_PIN, DREQ);
83
84
85
    delay_ms(100);
86
87
88
//-----------------------------------
89
// Set Mode - 1002 native mode
90
//-----------------------------------
91
    sbi(VS1011_PORT, xDCS); //xDCS disable
92
    cbi(VS1011_PORT, xCS);  //xCS enable
93
94
    delay_ms(10);
95
96
    SPI_Send_Byte(VS1011_WRITE);    //write data
97
    SPI_Send_Byte(VS1011_MODE);
98
    SPI_Send_Byte(0x08);            //SM_SDINEW + SM_TESTS
99
    SPI_Send_Byte(0x20);            //
100
101
    sbi(VS1011_PORT, xCS); //xCS disable
102
//-----------------------------------
103
}
104
105
106
107
108
109
//*************************************************************************
110
// Function: vs1011_sine_test
111
// Parameters: Number of beeps to play
112
// Returns: none.
113
//
114
// Description: Play sine wave beeps on VS1011
115
//*************************************************************************
116
void vs1011_sine_test(uint8_t loops){
117
118
uint8_t ES[8] = {0x53, 0xEF, 0x6E, 0x7E, 0x00, 0x00, 0x00, 0x00};
119
//uint8_t DS[4] = {0x45, 0x78, 0x69, 0x74};
120
121
122
//-----------------------------------
123
// Set Mode - Sine test
124
//-----------------------------------
125
    sbi(VS1011_PORT, xDCS); //xDCS disable
126
    cbi(VS1011_PORT, xCS); //xCS enable
127
128
    delay_ms(50);
129
130
    SPI_Send_Byte(VS1011_WRITE);    //write data
131
    SPI_Send_Byte(VS1011_MODE);
132
    SPI_Send_Byte(0x08);            //SM_SDINEW + SM_TESTS
133
    SPI_Send_Byte(0x20);            //
134
135
    delay_ms(50);
136
137
    sbi(VS1011_PORT, xCS); //xCS disable
138
//-----------------------------------
139
140
    delay_ms(50);
141
142
    cbi(VS1011_PORT, xDCS);
143
144
    //for(uint8_t x=0; x<loops; x++){
145
146
147
        for (uint8_t i=0; i<8; i++){
148
            SPI_Send_Byte( ES[i] );
149
        }
150
151
152
        /*
153
        delay_ms(500);
154
155
156
        for (uint8_t a=0; a<4; a++){
157
            SPI_Send_Byte( DS[a] );
158
        }
159
160
        delay_ms(500);
161
162
    }
163
    */
164
165
    //sbi(VS1011_PORT, xDCS);
166
167
}


*Hier noch die SPI-Funktionen:*
1
//*************************************************************************
2
// Function: SPI_Send_Byte
3
// Parameters: Byte to send
4
// Returns: none
5
//
6
// Description: Send byte over SPI
7
//*************************************************************************
8
void SPI_Send_Byte(uint8_t nByte)
9
{
10
11
  //Send a byte...
12
  SPDR = nByte;
13
14
  //Wait until sending is completed...
15
  while( !(SPSR & (1<<SPIF)) );
16
}
17
18
19
20
21
22
//*************************************************************************
23
// Function: SPI_Initialize
24
// Parameters: none
25
// Returns: none
26
//
27
// Description: Initialize the SPI function
28
//*************************************************************************
29
void SPI_Initialize(void)
30
{
31
    // configure SPI pins - set PB4(SS) HIGH for SPI operations!
32
    SPI_DDR |= (1<<SPI_MOSI) | (1<<SPI_SCK);  // config SPI pins
33
    SPI_PORT |= (1<<SPI_MOSI) | (1<<SPI_SCK);
34
35
    SPI_DDR |= (1<<SPI_SS);    // set SS output
36
    SPI_PORT |= (1<<SPI_SS);   // set SS high to enable SPI operations
37
38
    // enable SPI in master mode and set clock speed
39
    // SPI clock must be at least 3MHz with 12.288MHz crystal
40
    SPCR = (1<<MSTR) | (1<<SPE);  // Master mode, SPI enable, clock speed MCU_XTAL/4
41
42
#if F_CPU > 10000000UL
43
    SPCR |= (1<<SPR0);   // set clock speed MCU_XTAL/16
44
#endif
45
    SPSR = (1<<SPI2X);   // set clock speed MCU_XTAL/2
46
}

von Ben (lightning)


Angehängte Dateien:

Lesenswert?

Opps das Bild von der Quarzbeschaltung vergessen

von Gast (Gast)


Lesenswert?

du schreibst leider nicht was jetzt genau dein Problem ist.

von Ben (lightning)


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.

von CAnfänger (Gast)


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?

von Jean P. (fubu1000)


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ß

von Ben (lightning)


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.

von Ben (lightning)


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 ?

von Jean P. (fubu1000)


Angehängte Dateien:

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ß

von Ben (lightning)


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

von Ben (lightning)


Lesenswert?

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

von Jean P. (fubu1000)


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ß

von filzlaus (Gast)


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...

von Ben (lightning)


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 ?

von holger (Gast)


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!

von Läubi .. (laeubi) Benutzerseite


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.

von Ben (lightning)


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 :)

von Thorsten (Gast)


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

von Gast (Gast)


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...

von Ben (lightning)


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

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.