DAC liefert immer 0V

Gast #4047050
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
}
Angehängte Dateien:
Gast #4047065
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
Moderator (Firma: Titel) Persönliche Seite #4047177
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...
Gast #4047354
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
}
#4047369
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.
Gast #4047376
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.
Gast #4047402
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
}
Gast #4047435
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
Gast #4048109
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.