trinity4711
10.02.2009, 08:27
Hallo zusammen,
ich habe folgendes Problem. Ich lese eine analoge Spannung ein. Da diese nicht linear ist, wandele ich diese um und möchte diesen gewandelten Wert wieder als Analogwert ausgeben. Als DAC verwende ich den MAX5154
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 64 ' default use 32 for the hardware stack
$swstack = 64 ' default use 10 for the SW stack
$framesize = 64 ' default use 40 for the frame space
'------------ Led-Ausgänge -----------------------
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.4 = Output
Led1 Alias Portb.0
Led2 Alias Portb.1
Led3 Alias Portb.4
'------------- Config für LCD -------------------
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.1 , Rs = Portd.0
Config Lcd = 16 * 2
Config Lcdmode = Port
Initlcd
Cursor Off
Cls
'------------- SPI Schnittstelle fuer MAX 5145 konfigurieren ---
Const Control = &H4000 ' Lade Eingangsregister A, DA-Register wird aktualisiert
Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
Spiinit
Ss Alias Portb.2
Ss = 1
'------------- Config für ADC -------------------
Config Adc = Single , Prescaler = Auto , Reference = Off
Config Portc = Input
Enable Interrupts
Start Adc
'------------- Variablen deklarieren ------------
Dim Wert As Word
Dim R As Single
Dim Entfernung As Single
Dim Ana As Word
Dim W As Word
Dim X As Byte
Dim Y As Byte
Dim V As Single
Dim Vref As Single
Vref = 2.56
Dim Spannung As Word
Dim Daten As Byte
Dim Da_data As Word
Dim B(2) As Byte At Da_data Overlay
Dim Vref2 As Single
Dim Voltage As Single
Declare Sub Set_dac(da As Word)
'------------- Start-Routine --------------------
Locate 1 , 1
Lcd " DISTANZMESSUNG "
Locate 2 , 1
Lcd ""
Wait 2
Cls
'------------- Hauptprogramm --------------------
Main:
Do
Wert = 0
Spannung = 0
Wert = Getadc(0)
Spannung = Getadc(1)
Locate 1 , 1
Lcd Wert ; " "
Locate 2 , 1
'R =(2914 /(wert + 5)) - 1
Ana = Wert + 5
R = 2914 / Ana
R = R - 1
V = Vref / 1024
V = V * Spannung
V = Da_data
Lcd Fusing(r , "#.##") ; "cm "
'----------- Ledauswertung -----------------------
If Wert < 70 Then
Portb.0 = 1
Else
Portb.0 = 0
If Wert > 577 Then
Portb.1 = 1
Else
Portb.1 = 0
If Wert >= 70 And Wert <= 580 Then
Toggle Portb.4
End If
End If
End If
'----------- Ende Ledauswertung -----------------
'---------------- D/A Max 5145 -------------------
Vref2 = 2.49
Voltage = Vref2 * Da_data
Voltage = Voltage / 4096
Voltage = Voltage * 2
Locate 1 , 5
Lcd "DAC = " ; Voltage ; " V"
Call Set_dac(da_data)
Sub Set_dac(da As Word)
Shift Da , Left , 1 ' Platz für Bit S0 machen
Da = Da Or Control ' Kommandobits überlagern
Ss = 0
Waitms 10
Spiout B(2) , 1
Spiout B(1) , 1
Ss = 1
End Sub
Goto Main
Loop
Mein Programm funktioniert nicht ganz richtig, denn es läuft nur bis zur DA-Wandlung und bleibt dann hängen. Eigentlich sollte es durchlaufen, damit ich Entfernungsänderungen angezeigt bekomme.
Wer kann mir weiter helfen ?
Gruss Michael
ich habe folgendes Problem. Ich lese eine analoge Spannung ein. Da diese nicht linear ist, wandele ich diese um und möchte diesen gewandelten Wert wieder als Analogwert ausgeben. Als DAC verwende ich den MAX5154
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 64 ' default use 32 for the hardware stack
$swstack = 64 ' default use 10 for the SW stack
$framesize = 64 ' default use 40 for the frame space
'------------ Led-Ausgänge -----------------------
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.4 = Output
Led1 Alias Portb.0
Led2 Alias Portb.1
Led3 Alias Portb.4
'------------- Config für LCD -------------------
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.1 , Rs = Portd.0
Config Lcd = 16 * 2
Config Lcdmode = Port
Initlcd
Cursor Off
Cls
'------------- SPI Schnittstelle fuer MAX 5145 konfigurieren ---
Const Control = &H4000 ' Lade Eingangsregister A, DA-Register wird aktualisiert
Config Spi = Hard , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1
Spiinit
Ss Alias Portb.2
Ss = 1
'------------- Config für ADC -------------------
Config Adc = Single , Prescaler = Auto , Reference = Off
Config Portc = Input
Enable Interrupts
Start Adc
'------------- Variablen deklarieren ------------
Dim Wert As Word
Dim R As Single
Dim Entfernung As Single
Dim Ana As Word
Dim W As Word
Dim X As Byte
Dim Y As Byte
Dim V As Single
Dim Vref As Single
Vref = 2.56
Dim Spannung As Word
Dim Daten As Byte
Dim Da_data As Word
Dim B(2) As Byte At Da_data Overlay
Dim Vref2 As Single
Dim Voltage As Single
Declare Sub Set_dac(da As Word)
'------------- Start-Routine --------------------
Locate 1 , 1
Lcd " DISTANZMESSUNG "
Locate 2 , 1
Lcd ""
Wait 2
Cls
'------------- Hauptprogramm --------------------
Main:
Do
Wert = 0
Spannung = 0
Wert = Getadc(0)
Spannung = Getadc(1)
Locate 1 , 1
Lcd Wert ; " "
Locate 2 , 1
'R =(2914 /(wert + 5)) - 1
Ana = Wert + 5
R = 2914 / Ana
R = R - 1
V = Vref / 1024
V = V * Spannung
V = Da_data
Lcd Fusing(r , "#.##") ; "cm "
'----------- Ledauswertung -----------------------
If Wert < 70 Then
Portb.0 = 1
Else
Portb.0 = 0
If Wert > 577 Then
Portb.1 = 1
Else
Portb.1 = 0
If Wert >= 70 And Wert <= 580 Then
Toggle Portb.4
End If
End If
End If
'----------- Ende Ledauswertung -----------------
'---------------- D/A Max 5145 -------------------
Vref2 = 2.49
Voltage = Vref2 * Da_data
Voltage = Voltage / 4096
Voltage = Voltage * 2
Locate 1 , 5
Lcd "DAC = " ; Voltage ; " V"
Call Set_dac(da_data)
Sub Set_dac(da As Word)
Shift Da , Left , 1 ' Platz für Bit S0 machen
Da = Da Or Control ' Kommandobits überlagern
Ss = 0
Waitms 10
Spiout B(2) , 1
Spiout B(1) , 1
Ss = 1
End Sub
Goto Main
Loop
Mein Programm funktioniert nicht ganz richtig, denn es läuft nur bis zur DA-Wandlung und bleibt dann hängen. Eigentlich sollte es durchlaufen, damit ich Entfernungsänderungen angezeigt bekomme.
Wer kann mir weiter helfen ?
Gruss Michael