Aus RN-Wissen.de
Version vom 19. Februar 2009, 22:15 Uhr von Sheridan_alt (Diskussion | Beiträge)
Das nachfolgende Beispiel demonstriert eine Distanzmessung mit dem SRF05 an RN-MiniControl und den RN-DIGI LCD Anzeige
'################################################### '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