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
@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
Die Verdrahtung stimmt, ich zähle einfach mit einer for -schleife hoch die Zahl, die hochgezählt wird, gebe ich an den Port aus. Mfg. Daniel
@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
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 | }
|
Verstehe ich da jetzt was falsch? 128 ist die Hälfte von 256 -> Halbe Referenzspannung am Ausgang
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.