Olle_Filzlaus
28.01.2007, 14:34
Hallo,
habe einen R2R-DA Wandler gebaut und jetzt an meinen Atmega 16 angeschloßen.
Link zur Erklärung: http://www.mikrocontroller.net/articles/DA-Wandler
Da das Teil vielseitig anwendbar ist, wollte ich den halt mal ausprobieren.
Die Hardware ist so easy, die muss richtig sein. habe ich auch nach gemessen. die stimmt.
Habe dann ein kleines Programm geschrieben um eine Zahl in einen Binärwert umzusetzten.
Ach als Widerstände habe ich 4,7k und 10k Ohm verwendet.
$regfile = "m16def.dat"
$crystal = 8000000
$baud = 9600
'******************* LC Display ************************************************
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Porta.6 , Rs = Portb.0
Config Lcdbus = 4
Config Lcd = 16 * 2
Dim A As Byte , B1 As Byte , C As Byte , D As Byte , B2 As Byte , B3 As Byte
Dim B4 As Byte , B5 As Byte , B6 As Byte , B7 As Byte , B8 As Byte , B0 As Byte
Dim H0 As Byte , H1 As Byte , H2 As Byte , H3 As Byte , H4 As Byte , H5 As Byte,
Dim H6 As Byte , H7 As Byte,
Config Porta.1 = Input
Config Porta.0 = Input
Config Porta.2 = Output
Config Porta.3 = Output
Config Portd.7 = Output
Config Portd.6 = Output
'Werteübergabe an die einzelnen Pins
Da0 Alias Portc.1 'Z0
Da1 Alias Portc.0 'Z1
Da2 Alias Portd.7 'Z2
Da3 Alias Portd.6 'Z3
Da4 Alias Portd.5 'Z4
Da5 Alias Portd.4 'Z5
Da6 Alias Portd.3 'Z6
Da7 Alias Portd.2 'Z7
Portd = &B11000000
Portb = &B11111111
Porta = &B11001111
Portc = &B11111111
Declare Sub Umrechnen()
A = 163 'ca. 2,5V
Do
Cls
'Taste für Hochzählen
If Pina.0 = 0 Then 'Tastenabfrage der Powertaste
Waitms 50 'entprellen
If Pina.0 = 0 Then
Incr A
End If
End If
'Taste für Runterzählen
If Pina.1 = 0 Then 'Tastenabfrage der Powertaste
Waitms 50 'entprellen
If Pina.1 = 0 Then
Decr A
End If
End If
'eingestellter Wert auf lcd ausgeben
Locate 1 , 1
Lcd ; A;
'Zahl umrechnen in binärwert
Call Umrechnen
'ausgabe des Binärwerts
Locate 2 , 1
Lcd ; H7;
Lcd ; H6;
Lcd ; H5;
Lcd ; H4;
Lcd ; H3;
Lcd ; H2;
Lcd ; H1;
Lcd ; H0;
'Übergabe des Binärwerts zu den Ports
Da0 = H7
Da1 = H6
Da2 = H5
Da3 = H4
Da4 = H3
Da5 = H2
Da6 = H1
Da7 = H0
Print A
Loop
End
'*************** Umrechnen ************************************************** ***
Sub Umrechnen()
B0 = A / 2
B1 = B0 / 2
B2 = B1 / 2
B3 = B2 / 2
B4 = B3 / 2
B5 = B4 / 2
B6 = B5 / 2
B7 = B6 / 2
H0 = A Mod 2
H1 = B0 Mod 2
H2 = B1 Mod 2
H3 = B2 Mod 2
H4 = B3 Mod 2
H5 = B4 Mod 2
H6 = B5 Mod 2
H7 = B6 Mod 2
End Sub
Das Problem dabei ist aber das die eingestellt Spannung bei mir immer sehr stark springt.
Also bei einem Wert von 1 kann ich am DA Wandler 1,79V messen. bei 2 = 1,57V. bei 5 = 2,4V und so weiter.
Habe die Ausgabeports schon ein paarmal angepasst, aber es funzt immer noch nicht.
jetzt vermutet ich ein fehler in meinem Decimal in Binär umwandlungsprogramm.
Könnt ihr bitte mal schaun ob ich mich irgendwo vertan habe. Rein theoretisch sollte die Differenz zwischen den DA Wandler werten bei 20mV liegen. Ic probiere schon seit 2 Tagen rum.
thx Arno
habe einen R2R-DA Wandler gebaut und jetzt an meinen Atmega 16 angeschloßen.
Link zur Erklärung: http://www.mikrocontroller.net/articles/DA-Wandler
Da das Teil vielseitig anwendbar ist, wollte ich den halt mal ausprobieren.
Die Hardware ist so easy, die muss richtig sein. habe ich auch nach gemessen. die stimmt.
Habe dann ein kleines Programm geschrieben um eine Zahl in einen Binärwert umzusetzten.
Ach als Widerstände habe ich 4,7k und 10k Ohm verwendet.
$regfile = "m16def.dat"
$crystal = 8000000
$baud = 9600
'******************* LC Display ************************************************
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Porta.6 , Rs = Portb.0
Config Lcdbus = 4
Config Lcd = 16 * 2
Dim A As Byte , B1 As Byte , C As Byte , D As Byte , B2 As Byte , B3 As Byte
Dim B4 As Byte , B5 As Byte , B6 As Byte , B7 As Byte , B8 As Byte , B0 As Byte
Dim H0 As Byte , H1 As Byte , H2 As Byte , H3 As Byte , H4 As Byte , H5 As Byte,
Dim H6 As Byte , H7 As Byte,
Config Porta.1 = Input
Config Porta.0 = Input
Config Porta.2 = Output
Config Porta.3 = Output
Config Portd.7 = Output
Config Portd.6 = Output
'Werteübergabe an die einzelnen Pins
Da0 Alias Portc.1 'Z0
Da1 Alias Portc.0 'Z1
Da2 Alias Portd.7 'Z2
Da3 Alias Portd.6 'Z3
Da4 Alias Portd.5 'Z4
Da5 Alias Portd.4 'Z5
Da6 Alias Portd.3 'Z6
Da7 Alias Portd.2 'Z7
Portd = &B11000000
Portb = &B11111111
Porta = &B11001111
Portc = &B11111111
Declare Sub Umrechnen()
A = 163 'ca. 2,5V
Do
Cls
'Taste für Hochzählen
If Pina.0 = 0 Then 'Tastenabfrage der Powertaste
Waitms 50 'entprellen
If Pina.0 = 0 Then
Incr A
End If
End If
'Taste für Runterzählen
If Pina.1 = 0 Then 'Tastenabfrage der Powertaste
Waitms 50 'entprellen
If Pina.1 = 0 Then
Decr A
End If
End If
'eingestellter Wert auf lcd ausgeben
Locate 1 , 1
Lcd ; A;
'Zahl umrechnen in binärwert
Call Umrechnen
'ausgabe des Binärwerts
Locate 2 , 1
Lcd ; H7;
Lcd ; H6;
Lcd ; H5;
Lcd ; H4;
Lcd ; H3;
Lcd ; H2;
Lcd ; H1;
Lcd ; H0;
'Übergabe des Binärwerts zu den Ports
Da0 = H7
Da1 = H6
Da2 = H5
Da3 = H4
Da4 = H3
Da5 = H2
Da6 = H1
Da7 = H0
Print A
Loop
End
'*************** Umrechnen ************************************************** ***
Sub Umrechnen()
B0 = A / 2
B1 = B0 / 2
B2 = B1 / 2
B3 = B2 / 2
B4 = B3 / 2
B5 = B4 / 2
B6 = B5 / 2
B7 = B6 / 2
H0 = A Mod 2
H1 = B0 Mod 2
H2 = B1 Mod 2
H3 = B2 Mod 2
H4 = B3 Mod 2
H5 = B4 Mod 2
H6 = B5 Mod 2
H7 = B6 Mod 2
End Sub
Das Problem dabei ist aber das die eingestellt Spannung bei mir immer sehr stark springt.
Also bei einem Wert von 1 kann ich am DA Wandler 1,79V messen. bei 2 = 1,57V. bei 5 = 2,4V und so weiter.
Habe die Ausgabeports schon ein paarmal angepasst, aber es funzt immer noch nicht.
jetzt vermutet ich ein fehler in meinem Decimal in Binär umwandlungsprogramm.
Könnt ihr bitte mal schaun ob ich mich irgendwo vertan habe. Rein theoretisch sollte die Differenz zwischen den DA Wandler werten bei 20mV liegen. Ic probiere schon seit 2 Tagen rum.
thx Arno