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