Aus RN-Wissen.de
Wechseln zu: Navigation, Suche


Das nachfolgende Beispiel demonstriert eine Distanzmessung mit dem SRF05 an RN-MiniControl und den RN-DIGI LCD Anzeige.

RN-Minicontrol misst in einer Endlosschleife die Entfernung, rechnet sie in cm um und zeigt sie auf der RN-DIGI Anzeige an.

DistanzmessungSRF05RNMiniRNDigi2.jpg DistanzmessungSRF05RNMiniRNDigi1.jpg

'###################################################
'Entfernungsmessung
'###################################################

'Die üblichen Definitionen bei Standardprogrammen auf Miniboard
$regfile = "m168def.dat"
$crystal = 16000000                                         'Quarzfrequenz
$baud = 9600
$hwstack = 32
$framesize = 32
$swstack = 32

'************ SRF05 Sensor **************************
Dim Zeitmessung As Word
Dim Entfernung As Word

'************ RN-Digi *******************************
Const Rn_digi_slave_write = &H76
Const Dezimalpunktziffer = 0                                'Segment wo Dezimalpunkt leuchten soll (0=keinen)

Dim Segmente As Byte
Dim Z As Byte
Dim Switch As Byte

Declare Sub Led_display_init()
Declare Sub Led_display(byval Ziffer As Byte , Byval Zahl As Byte)
Declare Sub Entfernungmessen()
Declare Sub Displaytest()
Declare Sub Entfernunganzeigen(byval Zahl As Word)

Config Scl = Portc.5                                        'Ports fuer IIC-Bus
Config Sda = Portc.4

' I2C-Init für RN-Digi
I2cinit
Led_display_init
Switch = 0

' SRF05 Signal
Config Pind.2 = Output

Displaytest
Wait 1
Displaytest
Wait 1
Displaytest
Wait 1
Displaytest
Wait 1

Do
   Entfernungmessen
   Call Entfernunganzeigen(entfernung)
   Waitms 500
Loop

Sub Entfernunganzeigen(byval Zahl As Word)
   Dim Einer As Byte
   Dim Zehner As Byte
   Dim Hunderter As Byte
   Dim Tausender As Byte
   Dim A As Word

   A = Zahl
   einer = A mod 10
   A = A - einer
   A = A  / 10
   zehner = A mod 10
   A = A - zehner
   A = A / 10
   hunderter = A mod 10
   A = A - hunderter
   A = A / 10
   Tausender = A Mod 10

   Print "Einer" ; Einer
   Print "zehner" ; Zehner
   Print "hunderter" ; Hunderter
   Print "Tausender" ; Tausender
   Print "**********************"

   Call Led_display(4 , Einer)
   Call Led_display(3 , Zehner)
   Call Led_display(2 , Hunderter)
   Call Led_display(1 , Tausender)

End Sub

Sub Displaytest()
   For Z = 1 To 4
      Led_display Z , Switch
   Next Z
   Print "Test"
   If Switch = 0 Then
      Switch = 1
   Else
      Switch = 0
   End If
End Sub

Sub Entfernungmessen()
    Portd.2 = 0                                             'Port Low
    Pulseout Portd , 2 , 40                                 'Min. 10uS Impuls senden
    Pulsein Zeitmessung , Pind , 2 , 1
    Zeitmessung = Zeitmessung * 10                          'mal 10 da Pulsein in 10uS Einheiten Ergebnis ermittelt
    Entfernung = Zeitmessung / 58                           'Umrechnen in Zentimeter
    Print "Entfernung: " ; Entfernung ; " cm"
End Sub

Sub Led_display_init()
  I2cstart
  I2cwbyte Rn_digi_slave_write
  I2cwbyte 0                                                'Control Byte

  'Dynamic Alternative Mode und Helligkeit
  'Die oberen 3 Bits bestimmen die Helligkeit
  'Wenn es dunkler sein soll dann z.b. &B0110111
  I2cwbyte &B1110111

  I2cstop

  'Alle Ziffern auf 0
  For Z = 1 To 4
       Led_display Z , 0
  Next Z

End Sub


Sub Led_display(ziffer As Byte , Zahl As Byte)
     I2cstart
     I2cwbyte Rn_digi_slave_write
     I2cwbyte Ziffer


     Select Case Zahl
         Case 0:
               Segmente = &H3F
         Case 1:
                Segmente = &H06
         Case 2:
                Segmente = &H5B
         Case 3:
                Segmente = &H4F
         Case 4:
                Segmente = &H66
         Case 5:
                Segmente = &H6D
         Case 6:
                Segmente = &H7D
         Case 7:
                Segmente = &H07
         Case 8:
                Segmente = &H7F
         Case 9:
                Segmente = &H67
         Case Else :
                Segmente = &H80                             'Ansonsten Dezimalpunkt

     End Select

     If Dezimalpunktziffer = Ziffer Then Segmente = Segmente Or &H80
     I2cwbyte Segmente
     I2cstop
End Sub