Forum: Mikrocontroller und Digitale Elektronik DAC liefert immer 0V


von Rebi (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe diesen DAC beschalten:(Seite 22 Register)
http://www.ti.com/lit/ds/symlink/dac7634.pdf

Anbei der Schaltplan.

Ich habe mit dem KO nachgemessen, es werden drei Bits gesenden mit den 
richtigen Inhalten. Es sollte eig. alles stimmen ich krieg jedoch bei 
VoutC 0V, anstelle von 2.5V sieht jemand ein fehler?


Das Unterprogramm:
1
unsigned char SPI_exchangeByte(unsigned char byte )
2
{
3
  SPDR = byte;
4
  while( ! (SPSR & (1<<SPIF) ));
5
  return SPDR;
6
}
7
8
void SPI_DAC()
9
{
10
  _delay_ms(1);
11
  PORTB &=~(1<< PB4);      // Chip Select
12
  SPI_exchangeByte(0x80);
13
  SPI_exchangeByte(0xFF);
14
  SPI_exchangeByte(0xFF);
15
  PORTB |=(1<< PB4);      // Chip Select
16
  _delay_ms(1);
17
  
18
}

Das Hauptprogramm:
1
int main(void)
2
{
3
  DDRD = 128;  //8 Bit Ausgang
4
  SPI_Init();
5
  RST = ON;
6
  RSTSEL = OFF;
7
  LDAC = OFF;
8
  LOAD = OFF;
9
  while(1)
10
  {
11
    Taster = (PIND&64)>>6;
12
    
13
    if(Taster == ON)
14
    {
15
      PORTD |= 128;    //LED leuchtet
16
      SPI_DAC();      //Register beschreiben
17
      x = 20;
18
    }
19
    else
20
    {
21
      PORTD &=~(128);    //LED löschen
22
    }
23
    if(x > 10)
24
    {
25
      x++;
26
    }
27
    if(x == 100)
28
    {
29
      x = 0;      
30
      LOAD = ON;      //Register ausgeben
31
      LDAC = ON;      //Register ausgeben
32
    }
33
    _delay_ms(10);
34
    
35
    PORTB = (LDAC << 0) + (LOAD << 1) + (RSTSEL <<2) + (RST << 3);
36
  }
37
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Rebi schrieb:
> Anbei der Schaltplan.
So wie ich das entziffern kann ist da MOSI und MISO vertauscht...

Der MOSI "Master Out, Slave In" muss an SDI "Serial Data IN"
Und MISO "Master In, Slave Out" bekommt Daten vom SDO "Serial Data Out"

> Ich habe mit dem KO nachgemessen
Und? Lass doch mal sehen...

von spess53 (Gast)


Lesenswert?

Hi

Wo ist

>SPI_Init();

?

MfG Spess

von Rebi (Gast)


Lesenswert?

Lothar Miller schrieb:
> Der MOSI "Master Out, Slave In" muss an SDI "Serial Data IN"
> Und MISO "Master In, Slave Out" bekommt Daten vom SDO "Serial Data Out"

Danke hab ich irgendwie vertauscht werde ich gleich ändern.

1
void SPI_Init(void)
2
{
3
  
4
  //Initialisierung SPI
5
  // Direction und IO Initialisierung
6
  PORTB |= (1 << PB0);        //Port definieren
7
  DDRB |= (1 << DDB4);        //Chipselect (SS)
8
  DDRB |= (1 << DDB5);        //MOSI
9
  DDRB &= ~(1 << DDB6);        //MISO (Input)
10
  DDRB |= (1 << DDB7);        //Clock
11
  DDRB |= (1 << DDB0);        //XCK / T0 (Synchroner Slave-Modus)
12
  DDRB |= (1 << DDB3);        //Chipselect Display aktivieren
13
    
14
  SPCR = 0x5F;          // SPI Control Register einstellen
15
  SPSR = 0x00;          // SPI Status Register einstellen
16
  
17
}

Hab beim Schaltplan noch vergessen das bei den Referenzen VREFHAB usw. 
noch ein Spannungsteiler ist, also nur 2.5V

von Rebi (Gast)


Lesenswert?

Funktioniert jetzt, nochmals danke.

von Arduinoquäler (Gast)


Lesenswert?

Rebi schrieb:
> Funktioniert jetzt, nochmals danke.

Rückblickend ist der Thread-Titel mal wieder voll daneben.
Denn der suggeriert ja dass der DAC kaputt ist ......

>> DAC liefert immer 0V

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Arduinoquäler schrieb:
> Denn der suggeriert ja dass der DAC kaputt ist ......
Nein, er suggeriert, dass da nur 0V herauskommen.

Rebi schrieb:
> Funktioniert jetzt, nochmals danke.
Und was wars? Die MISO-MOSI-Sache?

von Arduinoquäler (Gast)


Lesenswert?

Lothar Miller schrieb:
> Nein, er suggeriert, dass da nur 0V herauskommen.

Nein, ein DAC der immer 0V ausgibt muss kaputt sein.

>> DAC liefert immer 0V

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Arduinoquäler schrieb:
> Nein, ein DAC der immer 0V ausgibt muss kaputt sein.
Nun ja, man kann Haare auch der Länge nach spalten...

> ein DAC der immer 0V ausgibt muss kaputt sein.
Durchaus nicht. Es würde ausreichen, wenn er niemals angeschlossen oder 
immer falsch angesteuert wird. Oder er wird korrekt angesteuert, aber in 
einer Art, dass er immer 0V ausgibt...

von Arduinoquäler (Gast)


Lesenswert?

Lothar Miller schrieb:
> Durchaus nicht. Es würde ausreichen, wenn er niemals angeschlossen oder
> immer falsch angesteuert wird. Oder er wird korrekt angesteuert, aber in
> einer Art, dass er immer 0V ausgibt...

Die Aussage "immer" schliesst ja genau all diese anderen Fälle aus.

von Rebi (Gast)


Lesenswert?

Lothar Miller schrieb:
> Und was wars? Die MISO-MOSI-Sache?

Ja daran lag es.

Arduinoquäler schrieb:
> Nein, ein DAC der immer 0V ausgibt muss kaputt sein.

Bevor ich die Leitungen getauscht hatte gab er immer 0V.

von Rebi (Gast)


Lesenswert?

Noch eine Frage:
Wieso funktioniert nur die erste Anweisung? Nach der ersten erhalte ich 
2.5V am Ausgang, nach dem 2ten Tastendruck habe ich immeer noch 2.5V.
Was mache ich falsch?
1
int main(void)
2
{
3
  DDRD = 128;  //8 Bit Ausgang
4
  SPI_Init();
5
6
  while(1)
7
  {
8
    Taster = (PIND&64)>>6;
9
    
10
    if((Taster == ON) && (Taster_alt != Taster)&&(x == 0))
11
    {
12
      x++;
13
      SPI_DAC(0x00FFFF);  //DAC A 2.5V
14
      PORTD |= 128;    //LED leuchtet
15
    }
16
    else if((Taster == ON) && (Taster_alt != Taster)&&(x == 1))
17
    {
18
      x++;
19
      SPI_DAC(0x0070FF);  //DAC A 1.1V
20
      PORTD |= 128;    //LED leuchtet
21
    }
22
    else
23
    {
24
      PORTD &=~(128);    //LED löschen
25
    }
26
    _delay_ms(10);  
27
    
28
    Taster_alt = Taster;
29
  }
30
}
1
void SPI_DAC(unsigned long Wert)
2
{
3
  _delay_ms(1);
4
  PORTB = 8;    //Nur RST High
5
  SPI_exchangeByte(Wert>>16);
6
  SPI_exchangeByte(Wert>>8);
7
  SPI_exchangeByte(Wert & 0xFF);
8
  PORTB |=((1<< PB4) | (1<<PB0) | (1 << PB1));  // Chip Select LDAC und LOAD
9
  _delay_ms(1);
10
}

von Karl H. (kbuchegg)


Lesenswert?

Rebi schrieb:

>   PORTB |=((1<< PB4) | (1<<PB0) | (1 << PB1));  // Chip Select LDAC und
> LOAD

Ich hab jetzt im Datenblatt nicht nachgesehen. Aber meistens sind 
derartige Leitungen flankgesteuert. Damit eine Flanke zustande kommt, 
muss aber eine Leitung, die auf High geht, irgendwann aber auch wieder 
mal auf Low zurück gehen.

Chip Select wird statisch auf High bleiben können. Aber irgendwelche 
'Load' Leitungen reagieren oft auf Flanke und nicht auf Pegel.

von Rebi (Gast)


Lesenswert?

Karl Heinz schrieb:
> Ich hab jetzt im Datenblatt nicht nachgesehen. Aber meistens sind
> derartige Leitungen flankgesteuert. Damit eine Flanke zustande kommt,
> muss aber eine Leitung, die auf High geht, irgendwann aber auch wieder
> mal auf Low zurück gehen.

Stimmt hatte ich vergessen, Danke.

von Rebi (Gast)


Lesenswert?

Noch letze Frage(Hoffentlich)

Jetzt habe ich das Problem wenn ich zuerst DAC A beschreibe und dannach 
DAC B, hat DAC A denn falschen Wert.
Also nach einem Tastendruck DAC A --> 2.5V
zweiter Tastendruck Dac B --> 1.1V und DAC A --> 1.1V
Wieso bleibt DAC A nicht 2.5V? Ich resete ihn nirgends.

Code gleich wie oben ausser:
1
if((Taster == ON) && (Taster_alt != Taster)&&(x == 0))
2
{
3
  x++;
4
  SPI_DAC(0x00FFFF);  //DAC A 2.5V
5
  PORTD |= 128;    //LED leuchte
6
}
7
else if((Taster == ON) && (Taster_alt != Taster)&&(x == 1))
8
{
9
  x++;
10
  SPI_DAC(0x4070FF);  //DAC B 1.1V
11
  PORTD |= 128;    //LED leuchtet
12
}
1
void SPI_DAC(unsigned long Wert)
2
{
3
  _delay_ms(1);
4
  PORTB &= ~(1<<PB4);    //Chip select;
5
  SPI_exchangeByte(Wert>>16);
6
  SPI_exchangeByte(Wert>>8);
7
  SPI_exchangeByte(Wert & 0xFF);
8
  PORTB |=((1<< PB4) | (1<<PB0) | (1 << PB1)); // Chip Select LDAC und LOAD
9
  _delay_ms(1);
10
  PORTB &= ~((1<<PB0)| (1 << PB1));    //LDAC und LOAD löschen;
11
}

von Arduinoquäler (Gast)


Lesenswert?

Rebi schrieb:
> Noch letze Frage(Hoffentlich)

Zitat aus Datenblatt:
---------------------------------------------------------
The first two bits select the input register that is
updated when LOAD goes LOW.
---------------------------------------------------------

Das interpretiere ich so dass du erst deine 24 Bit senden musst,
und dann LOAD auf low setzen, damit der Baustein weiss welcher von
den vier DACs angesprochen werden soll.

Also Funktionseintritt mit LOAD = High
- 24 Bit senden
LOAD = Low
_delay_us (whatever)
LOAD = High
_delay_us (whatever)
LDAC = High

von Rebi (Gast)


Lesenswert?

Arduinoquäler schrieb:
> Das interpretiere ich so dass du erst deine 24 Bit senden musst,
> und dann LOAD auf low setzen, damit der Baustein weiss welcher von
> den vier DACs angesprochen werden soll.

Der Code funktioniert ja, ausser das DAC A (überschrieben?) wird wenn 
ich DAC B beschreibe. Wenn ich LOAD vorher auf HIGH setzt passiert 
nichts, 0V.

von Rebi (Gast)


Lesenswert?

Rebi schrieb:
> Wenn ich LOAD vorher auf HIGH setzt passiert
> nichts, 0V.

Sry hab es falsch gemacht. Hab es vorhin nochmals probiert, funktioniert 
jetzt danke.

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.