Problem mit DA-Wandler

Gast #538988
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;
#539091
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
#539156
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren