www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit DA-Wandler


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <io.h>

#define F_CPU 4000000UL
#include <delay.h>

void writeDA(uint16_t v);

#define CS      (1<<PC0)
#define ILE     (1<<PC1)
#define WR1     (1<<PC2)
#define WR2     (1<<PC3)
#define XFER    (1<<PC4)


void writeDA(uint16_t v)
{ 
  
  
  
  PORTC =  ILE | WR2 | XFER;  //Einlesen in input Register

  _delay_us(1);

  PORTB = v; 
  
  _delay_us(1);                //Uebergabe der Bits an den input Register

  PORTC = ILE | WR1;   //Sichern der Bits im input Register

  _delay_us(1);
}





int main (void)
{



DDRC = CS|ILE|WR1|WR2|XFER;
DDRB = 0xff;



uint16_t i,j;

while(1)
{
for(i = 0; i < 256; i = i + 1)

 { writeDA(i);

  for(j = 0; j < 5000; j = j +1);
 }
}

 return 1;

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss mich korrigieren, die leds funktionieren doch

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel (Gast)
Datum:

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

Mfg Daniel

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PortB ist ja mein Ausgang, warum sollte icg den löschen?

Autor: Daniel (Gast)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.
#include <io.h>

#define F_CPU 4000000UL
#include <delay.h>

void writeDA(uint8_t v);

#define CS      (1<<PC0)
#define ILE     (1<<PC1)
#define WR1     (1<<PC2)
#define WR2     (1<<PC3)
#define XFER    (1<<PC4)


void writeDA(uint8_t v)
{ 
  PORTB = v;
}

int main (void)
{

uint16_t i,j;

DDRC = CS|ILE|WR1|WR2|XFER;
DDRB = 0xff;
PORTC = ILE;    // Flow though Modus

while(1)
{
  for(i = 0; i < 256; i = i + 1){
    writeDA(i);
    _delay_ms(1);
  }
}

 return 1;
}

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

MfG
Falk

Autor: Daniel (Gast)
Datum:
Angehängte Dateien:

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

Autor: Andreas Kramer (Gast)
Datum:

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

Gruß Andreas

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich messe den Ausagang mit einem Oszilloskop.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.