K (Kategorien) |
|||
| Zeile 173: | Zeile 173: | ||
End Sub | End Sub | ||
</pre> | </pre> | ||
| + | |||
| + | [[Kategorie:Praxis]] | ||
| + | [[Kategorie:Sensoren]] | ||
| + | [[Kategorie:Software]] | ||
| + | [[Kategorie:Quellcode Bascom]] | ||
Aktuelle Version vom 20. Februar 2009, 14:05 Uhr
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.
'###################################################
'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

