Der Drucksensor läuft jetzt auch. Ich frage den EOC pin ab und errechne die Höhe so schnell wie der Sensor kann. Da das Signal ziemlich stark verrauscht ist bilde ich danach den Mittelwert aus 8 Messungen. Dann ist es immer noch verrauscht, aber vielleicht reicht es ja.
Also laufen eigentlich alle Sensoren, ich werde bald mal die einzelnen Code-Stückchen zusammenfügen. Dann kann ich bald auch mit der Programmierung der Regelung anfangen.
Code vom Drucksensor (modifiziert nach kh-gps.de):
Code:
'===CHIP SETTINGS===
$regfile = "m328pdef.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 8000000
$baud = 38400
Config Pind.2 = Input 'eoc
Dim Ac1 As Single
Dim Ac2 As Single
Dim Ac3 As Single
Dim Ac4 As Long
Dim Ac5 As Long
Dim Ac6 As Long
Dim B1 As Single
Dim B2 As Single
Dim B3 As Long
Dim B4 As Long
Dim B4a As Single
Dim B5 As Single
Dim B6 As Single
Dim B7 As Long
Dim Mb As Single
Dim Mc As Single
Dim Md As Single
Dim Ut As Long
Dim Up As Long
Dim X1 As Single
Dim X2 As Single
Dim X3 As Single
Dim Zwr1 As Single
Dim Zwr2 As Single
Dim Zwr3 As Single
Dim Zwr4 As Single
Dim T As Single
Dim T_str As String * 4
Dim P As Single
Dim P2 As Single
Dim Po As Single
Dim A As Single
Dim A2(8) As Word
Dim Mittelwert As Word
Dim Averaging As Byte
Dim I As Byte
Dim Adres As Byte
Dim Value As Byte
Dim Result As Integer
Dim Hi As Long
Dim Lo As Long
Dim Xlo As Long
$lib "i2c_twi.lbx" ' we do not use software emulated I2C but the TWI
Config Scl = Portc.5 ' we need to provide the SCL pin name
Config Sda = Portc.4 ' we need to provide the SDA pin name
I2cinit
Declare Sub Write_bmp(byval Adres As Byte , Byval Value As Byte)
Declare Sub Read_bmp(byval Adres As Byte , Value As Byte)
Declare Sub Read_reg
Const Addressw = &B11101110 'slave write address
Const Addressr = &B11101111 'slave read address
'hole Kalibrierungsdaten
'-------------------------------------------------------------------------------
Adres = &HAA 'Startadresse calibration data
Call Read_reg
Ac1 = Result
Call Read_reg
Ac2 = Result
Call Read_reg
Ac3 = Result
Call Read_reg
Ac4 = Result
Call Read_reg
Ac5 = Result
Call Read_reg
Ac6 = Result
Call Read_reg
B1 = Result
Call Read_reg
B2 = Result
Call Read_reg
Mb = Result
Call Read_reg
Mc = Result
Call Read_reg
Md = Result
Averaging = 1
Do
'hole Rohdaten Temperatur
'-------------------------------------------------------------------------------
If Averaging = 1 Then 'datasheet: would be enough to get temp every second
Call Write_bmp(&Hf4 , &H2E)
While Pind.2 < 1 'wait until EOC is 1 ca. 5ms
Waitms 1
Wend
Call Read_bmp(&Hf6 , Value) 'read it back
Hi = Value * 256
Call Read_bmp(&Hf7 , Value) 'read it back
Ut = Hi + Value
End If
'hole Rohdaten Luftdruck
'-------------------------------------------------------------------------------
'Call Write_bmp(&Hf4 , &HF4) 'ultra-high precision mode
'Call Write_bmp(&Hf4 , &H34) 'normal mode
Call Write_bmp(&Hf4 , &HB4) 'high precision mode
While Pind.2 < 1 ''wait until EOC is 1 ca. 26 ms in ultra high precision mode
Waitms 1
Wend
Call Read_bmp(&Hf6 , Value) 'read it back
Hi = Value * 256
Call Read_bmp(&Hf7 , Value) 'read it back
Up = Hi + Value
'kalkuliere tatsaechliche Temperatur
'-------------------------------------------------------------------------------
Zwr1 = Ut - Ac6
Zwr2 = 2 ^ 15
Zwr2 = Ac5 / Zwr2
X1 = Zwr1 * Zwr2
Zwr1 = 2 ^ 11
Zwr2 = Mc * Zwr1
Zwr3 = X1 + Md
X2 = Zwr2 / Zwr3
B5 = X1 + X2
T = B5 + 8
Zwr3 = 2 ^ 4
T = T / Zwr3
T = T / 10
T_str = Str(t)
T_str = Left(t_str , 4)
'Print "T= " ; T_str ; " C"
'kalkuliere tatsaechlichen Luftdruck
'-------------------------------------------------------------------------------
B6 = B5 - 4000
Zwr1 = 2 ^ 11
Zwr2 = 2 ^ 12
Zwr3 = B6 / Zwr2
Zwr3 = B6 * Zwr3
Zwr4 = B2 * Zwr3
X1 = Zwr4 / Zwr1
Zwr1 = 2 ^ 11
Zwr2 = B6 / Zwr1
X2 = Ac2 * Zwr2
X3 = X1 + X2
Zwr1 = Ac1 * 4
Zwr1 = Zwr1 + X3
Zwr1 = Zwr1 + 2
B3 = Zwr1 / 4 '1010(orig)
Zwr1 = 2 ^ 13
Zwr2 = B6 / Zwr1
X1 = Ac3 * Zwr2
Zwr1 = 2 ^ 12
Zwr2 = 2 ^ 16
Zwr3 = B6 / Zwr1
Zwr3 = B6 * Zwr3
Zwr4 = B1 * Zwr3
X2 = Zwr4 / Zwr2
X3 = X1 + X2
X3 = X3 + 2
X3 = X3 / 4
Zwr1 = X3 + 32768
Zwr2 = 2 ^ 15
Zwr3 = Zwr1 / Zwr2
B4a = Ac4 * Zwr3
B4 = Abs(b4a)
B7 = Up - B3
Dim B7a As Long
B7a = B7 * 50000
Zwr1 = B7a * 2
Zwr1 = Zwr1 / B4
Zwr2 = B7a / B4
Zwr2 = Zwr2 * 2
If B7a < &H8000000 Then P = Zwr1 Else P = Zwr2
Zwr1 = 2 ^ 8
Zwr2 = P / Zwr1
X1 = Zwr2 * Zwr2
Zwr1 = 2 ^ 16
X1 = X1 * 3028
X1 = X1 / Zwr1
X1 = Abs(x1)
Zwr1 = -7357 * P
Zwr2 = 2 ^ 16
X2 = Zwr1 / Zwr2
Zwr1 = X1 + X2
Zwr1 = Zwr1 + 3791
Zwr2 = 2 ^ 4
Zwr1 = Zwr1 / Zwr2
P = P + Zwr1
P = P / 100
'kalkuliere Hoehenwerte
'-------------------------------------------------------------------------------
'Po = 1013.25 'Pressure auf Seepegel
Po = 1020.3
Zwr1 = 1 / 5.255
Zwr2 = P / Po
Zwr3 = Zwr2 ^ Zwr1
Zwr4 = 1 - Zwr3
A = 44330 * Zwr4
A = A * 100 'höhe in zentimetern
If Averaging <= 8 Then
A2(averaging) = Int(a)
Averaging = Averaging + 1
End If
If Averaging = 9 Then
Mittelwert = 0
For I = 1 To 8
Mittelwert = Mittelwert + A2(i)
Next
Mittelwert = Mittelwert / 8
Print Mittelwert 'ausgabe der höhe in zentimetern
Averaging = 1
End If
Loop
End
'------------------------------------------------------------
Sub Read_reg
Call Read_bmp(adres , Value)
Hi = Value * 256
Adres = Adres + 1
Call Read_bmp(adres , Value)
Result = Hi + Value
Adres = Adres + 1
End Sub
'----------------------------------------------------------
Sub Write_bmp(byval Adres As Byte , Byval Value As Byte)
I2cstart 'start condition
I2cwbyte Addressw 'slave address
I2cwbyte Adres 'address of register
I2cwbyte Value 'value to write
I2cstop 'stop condition
End Sub
'----------------------------------------------------------
Sub Read_bmp(byval Adres As Byte , Value As Byte)
I2cstart 'generate start
I2cwbyte Addressw 'slave address
I2cwbyte Adres 'address of register
I2cstart 'repeated start
I2cwbyte Addressr 'slave address (read)
I2crbyte Value , Nack 'read byte
I2cstop 'generate stop
End Sub
Lesezeichen