Problem mit R/2R DA- Wandlung

Gast #532509
Ich habe mir ein 8 Bit R/2R DA - Wandler gabaut. Es ist alles richtig 
angeschlossen. Er funktioniert nur zu einem Bstimmten Grad richtig:

Wenn ich an den Ausgang die Bits langsam hochzähle, kann ich eine 
ansteigende Spannung am Voltmeter erkennen. Ab einem bestimmten Wert 
~128, fällt die Spannung ab, auf die Hälfte der ref. Spannung (5V) und 
ab da wird weitergezählt.

Mfg Daniel
Gast
@Daniel

>Ich habe mir ein 8 Bit R/2R DA - Wandler gabaut. Es ist alles richtig
>angeschlossen. Er funktioniert nur zu einem Bstimmten Grad richtig:

>Wenn ich an den Ausgang die Bits langsam hochzähle, kann ich eine
>ansteigende Spannung am Voltmeter erkennen. Ab einem bestimmten Wert
>~128, fällt die Spannung ab, auf die Hälfte der ref. Spannung (5V) und
>ab da wird weitergezählt.

Klingt entweder nach vertauschten Bits in der Verdrahtung (MSB) oder 
Einer-Zweierkomplement Verwechselung.

MFG
Falk
Gast
@Daniel

>Die Verdrahtung stimmt, ich zähle einfach mit einer for -schleife hoch
>die Zahl, die hochgezählt wird, gebe ich an den Port aus.

In C? Ist deine Zählvariable als unsigned definiert? Zeig mal den Code.
Du kannst auch die Bits einzeln setzen und prüfen. Das LSB wackelt nur 
wenig, das MSB um VCC/2.

MfG
Falk
Gast
Hier der Code
1
int main (void)
2

3
{
4
  uint16_t  j,l,m,i;
5
  
6

7
  DDRB = 0xff;
8

9
  while(1)
10
  {
11
    for( i = 0; i < 257; i = i + 1) //Abzählen der Ports aufwärts
12
    {  
13
    
14
      PORTB = i;
15
      
16

17
      for(j=0; j < 1; j = j+1);
18
        
19
            //Abwarten
20
    }
21

22
 for( l = 257; l > 0; l = l -1) //Abzählen der Ports abwärts
23
    {
24
      PORTB = l;
25
      
26

27
      for(m=0; m < 1; m = m+1);
28
        
29
            //Abwarten
30
    }
31

32

33

34

35

36

37

38
  }
39

40

41

42

43
  return 1;
44
}
Gast
@Daniel

>Hier der Code

Soweit OK (naja ein paar Schnitzer sind drin), aber dein Abwarten wird 
rausoptimiert bzw. ist soo kurz, dass du da nichts sehen kannst. Womit 
misst du? Mit nem Oszi? Ich tippe immer noch auf verdrehte Verdrahtung. 
Hast du einen Schaltplan?
Hier mal die etwas aufgeräumte Version. Du brauchst dafür die include 
der delay Macros

#include <avr/delay.h>

int main (void)

{
  uint16_t  j,l,m,i;

  DDRB = 0xff;

  while(1)
  {
    for( i = 0; i < 256; i++) //Abzählen der Ports aufwärts
    {
      PORTB = i;
    _delay_us(1);
    }

 for( l = 255; l > 0; l--) //Abzählen der Ports abwärts
    {
      PORTB = l;
      _delay_us(1);
    }
  }
  return 1;
}

MFG
Falk

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.