Forum: Mikrocontroller und Digitale Elektronik Problem mit DA-Wandler


von Daniel (Gast)


Lesenswert?

Vor kurzem habe ich mir einen DA-Wandler DAC0832LCN zugelegt.
Heute habe ich ein einfaches Programm geschrieben, welches den PORTB bis 
256 hochzählt.
Nur leidet tut das Programm und somit der DA- Wandler nichts.
Den DA wandler habe ich abgeschlossen und nur Leds angeschlossen. Die 
tun auch nichts, obwohl ich früher ein funktionierendes Programm 
geschrieben habe welches den Port hochgefählt hat.

Hier der Quellcode:
1
#include <io.h>
2
3
#define F_CPU 4000000UL
4
#include <delay.h>
5
6
void writeDA(uint16_t v);
7
8
#define CS      (1<<PC0)
9
#define ILE     (1<<PC1)
10
#define WR1     (1<<PC2)
11
#define WR2     (1<<PC3)
12
#define XFER    (1<<PC4)
13
14
15
void writeDA(uint16_t v)
16
{ 
17
  
18
  
19
  
20
  PORTC =  ILE | WR2 | XFER;  //Einlesen in input Register
21
22
  _delay_us(1);
23
24
  PORTB = v; 
25
  
26
  _delay_us(1);                //Uebergabe der Bits an den input Register
27
28
  PORTC = ILE | WR1;   //Sichern der Bits im input Register
29
30
  _delay_us(1);
31
}
32
33
34
35
36
37
int main (void)
38
{
39
40
41
42
DDRC = CS|ILE|WR1|WR2|XFER;
43
DDRB = 0xff;
44
45
46
47
uint16_t i,j;
48
49
while(1)
50
{
51
for(i = 0; i < 256; i = i + 1)
52
53
 { writeDA(i);
54
55
  for(j = 0; j < 5000; j = j +1);
56
 }
57
}
58
59
 return 1;

von Daniel (Gast)


Lesenswert?

Ich muss mich korrigieren, die leds funktionieren doch

von Falk B. (falk)


Lesenswert?

@ Daniel

>Vor kurzem habe ich mir einen DA-Wandler DAC0832LCN zugelegt.
>Heute habe ich ein einfaches Programm geschrieben, welches den PORTB bis
>256 hochzählt.

Das Program sieht OK aus.

Hast du das beachtet?

"Flow-Through Operation

Though primarily designed to provide microprocessor interface
compatibility, the MICRO-DAC’s can easily be configured
to allow the analog output to continuously reflect the
state of an applied digital input. This is most useful in applications
where the DAC is used in a continuous feedback
control loop and is driven by a binary up-down counter, or in
function generation circuits where a ROM is continuously
providing DAC data.
Simply grounding CS, WR1, WR2, and XFER and tying ILE
high allows both internal registers to follow the applied digital
inputs (flow-through) and directly affect the DAC analog
output."

Also du musst CS, WR1, WR2 und XFER auf Masse legen sowie ILE auf VCC. 
Dann sollte dein Programm laufen.

MFG
Falk

von Daniel (Gast)


Lesenswert?

Danke für deine Antwort.
Ich habe gedacht, dass der uP CS, WR1, WR2 und XFER auf masse zieht, 
wenn der ausgang auf LO ist.

von Falk B. (falk)


Lesenswert?

Schreib einfach ein

PORTC = ILE;

An den Anfnag deiner main und lösche die anderen PORTB Aweisungen im 
writeDA. Dann sollte es laufen.

MFG
Falk

von Daniel (Gast)


Lesenswert?

Könnte sich jemand das Programm anschaun?
Am Ausgang von DA_wandler habe ich nur ein Rechtecksignal.

Mfg Daniel

von Daniel (Gast)


Lesenswert?

PortB ist ja mein Ausgang, warum sollte icg den löschen?

von Daniel (Gast)


Lesenswert?

Hast du nicht zufällig PORTC gemeint, welchen ich löschen soll?

von Falk B. (falk)


Lesenswert?

@ Daniel

>PortB ist ja mein Ausgang, warum sollte icg den löschen?

>Hast du nicht zufällig PORTC gemeint, welchen ich löschen soll?

Das schrieb ich doch. Wenn ich dein Programm richtig interpretiere, dann 
hängen an PORTC die Steuerleitungen und an PORTB die Datenleitungen.

Hier mal der überarbeitete Code.
1
#include <io.h>
2
3
#define F_CPU 4000000UL
4
#include <delay.h>
5
6
void writeDA(uint8_t v);
7
8
#define CS      (1<<PC0)
9
#define ILE     (1<<PC1)
10
#define WR1     (1<<PC2)
11
#define WR2     (1<<PC3)
12
#define XFER    (1<<PC4)
13
14
15
void writeDA(uint8_t v)
16
{ 
17
  PORTB = v;
18
}
19
20
int main (void)
21
{
22
23
uint16_t i,j;
24
25
DDRC = CS|ILE|WR1|WR2|XFER;
26
DDRB = 0xff;
27
PORTC = ILE;    // Flow though Modus
28
29
while(1)
30
{
31
  for(i = 0; i < 256; i = i + 1){
32
    writeDA(i);
33
    _delay_ms(1);
34
  }
35
}
36
37
 return 1;
38
}

Und bitte keine selbstgestrickten Delay-Schleifen. Die gehen regelmässig 
schief. Nutze die Funktionen _delay_ms() und _delay_us().

MfG
Falk

von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

Der DA gibt trotzdem irgendwas aus, das Signal zuckelt nur.
Im Anhang gibts das Datenblatt zu dem.
Mfg Daniel

von Andreas Kramer (Gast)


Lesenswert?

Änder doch einfach mal das Delay vieleicht ist das ja zu kurz oder womit 
misst du den Ausgang des DAC ?

Gruß Andreas

von Daniel (Gast)


Lesenswert?

Ich messe den Ausagang mit einem Oszilloskop.

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.