Programm7(MPU 6050)

$regfile = "m1284pdef.dat"
$crystal = 20000000

$framesize = 32
$swstack = 32
$hwstack = 32

Config Portc = Output                                       'Fürs LCD
Config Scl = Portc.0                                        'Ports fuer IIC-Bus
Config Sda = Portc.1
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.6 , Rs = Portc.7
Config Lcd = 20 * 4
Config Portd = Input                                        'Fernsteuerung D4 - D7 ,Taster u.s.w

Declare Sub 6050_write(regadr As Byte , Byval Wert As Byte)
Declare Sub 6050_read(regadr As Byte) As Byte
Declare Sub Werte_berechnen
Declare Sub Werte_anzeigen

Dim 6050_adr As Byte
Dim 6050_adr1 As Byte
Dim 6050_accel_x_h As Byte
Dim 6050_pwr_mgmt_1 As Byte

Dim Accel_x_h As Byte
Dim Accel_x_l As Byte
Dim Accel_y_h As Byte
Dim Accel_y_l As Byte
Dim Accel_z_h As Byte
Dim Accel_z_l As Byte
Dim Temp_h As Byte
Dim Temp_l As Byte
Dim Gyro_x_h As Byte
Dim Gyro_x_l As Byte
Dim Gyro_y_h As Byte
Dim Gyro_y_l As Byte
Dim Gyro_z_h As Byte
Dim Gyro_z_l As Byte

Dim Accel_x_int As Integer
Dim Accel_x_real As Single
Dim Accel_y_int As Integer
Dim Accel_y_real As Single
Dim Accel_z_int As Integer
Dim Accel_z_real As Single
Dim Temp_int As Integer
Dim Temp_real As Single
Dim Gyro_x_int As Integer
Dim Gyro_x_real As Single
Dim Gyro_y_int As Integer
Dim Gyro_y_real As Single
Dim Gyro_z_int As Integer
Dim Gyro_z_real As Single

6050_adr = &HD0
6050_adr1 = &HD1
6050_accel_x_h = &H3B
6050_pwr_mgmt_1 = &H6B

Call 6050_write(6050_pwr_mgmt_1 , 0)                        'aus dem sleepmodus wecken


Do

Wait 1                                                      'Jede Sekunde 1 mal
  Call 6050_read(6050_accel_x_h)                            'register auslesen
  Call Werte_berechnen                                      'Werte errechnen
  Call Werte_anzeigen

Loop
End


Sub 6050_write(regadr As Byte , Byval Wert As Byte)
  I2cstart
  I2cwbyte 6050_adr
  If Err = 0 Then
    I2cwbyte Regadr
    I2cwbyte Wert
  End If
  I2cstop
End Sub

Sub 6050_read(regadr As Byte) As Byte                       'Gyro Temp + Accelerometer
  I2cstart
  I2cwbyte 6050_adr
  If Err = 0 Then
    I2cwbyte Regadr
    I2cstart
    I2cwbyte 6050_adr1
    I2crbyte Accel_x_h , Ack
    I2crbyte Accel_x_l , Ack
    I2crbyte Accel_y_h , Ack
    I2crbyte Accel_y_l , Ack
    I2crbyte Accel_z_h , Ack
    I2crbyte Accel_z_l , Ack
    I2crbyte Temp_h , Ack
    I2crbyte Temp_l , Ack
    I2crbyte Gyro_x_h , Ack
    I2crbyte Gyro_x_l , Ack
    I2crbyte Gyro_y_h , Ack
    I2crbyte Gyro_y_l , Ack
    I2crbyte Gyro_z_h , Ack
    I2crbyte Gyro_z_l , Nack
  End If
  I2cstop
End Sub

Sub Werte_berechnen

Accel_x_int = 256 * Accel_x_h
  Accel_x_int = Accel_x_int + Accel_x_l                     '1 g entspricht 2^14 = 16384 bei Standard Einstellung 2g; also Beschl = Acceleration *9.81/16384
  Accel_x_real = Accel_x_int * 9.81
  Accel_x_real = Accel_x_real / 16384

Accel_y_int = 256 * Accel_y_h
  Accel_y_int = Accel_y_int + Accel_y_l
  Accel_y_real = Accel_y_int * 9.81
  Accel_y_real = Accel_y_real / 16384

Accel_z_int = 256 * Accel_z_h
  Accel_z_int = Accel_z_int + Accel_z_l
  Accel_z_real = Accel_z_int * 9.81
  Accel_z_real = Accel_z_real / 16384

Temp_int = 256 * Temp_h                                     'lt. Anleitung
  Temp_int = Temp_int + Temp_l
  Temp_real = Temp_int / 340
  Temp_real = Temp_real + 36.53

Gyro_x_int = 256 * Gyro_x_h
  Gyro_x_int = Gyro_x_int + Gyro_x_l

Gyro_y_int = 256 * Gyro_y_h
  Gyro_y_int = Gyro_y_int + Gyro_y_l

Gyro_z_int = 256 * Gyro_z_h
  Gyro_z_int = Gyro_z_int + Gyro_z_l
End Sub

Sub Werte_anzeigen

Cls
Locate 1 , 1 : Lcd "AX=" ; Accel_x_real
Locate 1 , 10 : Lcd "AY=" ; Accel_y_real
Locate 2 , 1 : Lcd "AZ=" ; Accel_z_real
Locate 2 , 10 : Lcd "T=" ; Temp_real ; "°C"
Locate 3 , 1 : Lcd "GX=" ; Gyro_x_int ; "GY=" ; Gyro_y_int
Locate 4 , 1 : Lcd "GZ=" ; Gyro_z_int

End Sub

 

Die Robotik & Arduino Seite