Ein Beispiel und Testprogramm in Basic

Code:
'###################################################
'rnsteuerung.bas   Demo zu RN-Steuerung
'für
'RoboterNetz Board RN-STEUERUNG ab Version 1.0 und


'
'Aufgabe:
' Dieses Testprogramm demonstriert die Ansteuerung
' des großen universellen Steuerboardes RN-Steuerung


'Autor: Frank
'Weitere Beispiele und Beschreibung der Hardware
'unter http://www.Roboternetz.de oder robotikhardware.de
'Eigene Programmbeispiele sind im Roboternetz gerne willkommen!
'##############################################################





' ********* Übliche bei RN-Steuerung ***************
Declare Sub Init_digitalanzeige()
Declare Sub Ziffer_digitalanzeige(byval Ziffernummer As Byte , Byval Zahl As Byte , Byval Dezimalpunkt As Byte)
Declare Sub Zahl_digitalanzeige(byval Zahl As Integer)
Declare Function Rn_sendefunkbefehl(byval Funkbefehl As String) As Byte
Declare Function Rn_empfange_funkstring(dat As String) As Byte


$regfile = "m32def.dat"
$hwstack = 82                                               '80
$framesize = 68                                             ' 64
$swstack = 68                                               '44


$crystal = 7372800                                          'Quarzfrequenz
$baud = 19200


Config Scl = Portc.0                                        'Ports fuer IIC-Bus
Config Sda = Portc.1


Config Pinb.2 = Input
Portb.2 = 1
Taste1 Alias Pinb.2

Config Pinb.5 = Input
Portb.5 = 1
Taste2 Alias Pinb.5

Config Pinb.6 = Input
Portb.6 = 1
Taste3 Alias Pinb.6


Config Pinb.3 = Output
Alarmgeber Alias Portb.3

Config Pinb.4 = Output
Relais1 Alias Portb.4

Config Pinc.7 = Output
Relais2 Alias Portc.7


Config Pinc.2 = Output
Ledgruen Alias Portc.2

Config Pinc.3 = Output
Ledgelb Alias Portc.3

Config Pinc.4 = Output
Ledrot Alias Portc.4

Config Pinc.6 = Output
Ausgang_ua Alias Portc.6

Config Pinc.5 = Output
Ausgang_ub Alias Portc.5


Const Slave_digi = &H70


Sound Portb.7 , 400 , 450                                   'BEEP
Sound Portb.7 , 400 , 250                                   'BEEP
Sound Portb.7 , 400 , 450                                   'BEEP
' ********* Übliche bei RN-Steuerung Ende***************
Config Serialin = Buffered , Size = 120
Config Serialout = Buffered , Size = 120
Enable Interrupts



Dim I As Integer
Dim P As Byte
Dim U As Byte
Dim Rueck As Byte
Dim S As String * 90

Wait 1
Print
Print "**** RN-STEUERUNG *****"
Print "Das neue große komplette Steuerboard"
Print

I2cinit
Init_digitalanzeige

Wait 1






 'Testet Funkmodul und sendet Version zurück
 'Alarmgeber ertönnt sofort, wenn Befehl nicht als Echo zurückkommt
 'Denkbare Ursache: Falsche Baudrate eingestellt (bei neuen Modulen in der Regel 19200 baud)
 'Ruft die Firmware Versionsnummer des Easyradio Funkmodules ab
 Rueck = Rn_sendefunkbefehl( "ER_CMD#T3")
 If Rueck <> 0 Then                                         'Error
   For I = 1 To 20
     Alarmgeber = 1
     Waitms 100
     Alarmgeber = 0
     Waitms 100
   Next
 End If
 Rueck = Rn_empfange_funkstring(s)
 Print "Funkmodul Version: " ; S



'Test der vierstelligen Digitalanzeige
'Nacheinander alle Ziffern bis 9 hochzählen
  For P = 1 To 4
    For U = 0 To 9
      Ziffer_digitalanzeige P , U , 0
      Waitms 100
      Next U
  Next P
  Wait 2

'Test der vierstelligen Digitalanzeige
'Zählt in hoher Geschwindigkeit bis 4000
For I = 1 To 4000
  Zahl_digitalanzeige I
  Waitms 5
Next
Wait 1




'LED Test durch Lauflicht
For I = 1 To 20
  Ledrot = 0
  Waitms 400
  Ledrot = 1
  Ledgelb = 0
  Waitms 400
  Ledgelb = 1
  Ledgruen = 0
  Waitms 400
  Ledgruen = 1
  Waitms 400
Next
Ledgruen = 0                                                'Gruen bleibt an
Wait 1


'Relais 1 wird getestet
For I = 1 To 20
  Relais1 = 1
  Wait 1
  Relais1 = 0
  Wait 1
Next
Wait 1


'Relais 2 wird getestet
For I = 1 To 20
  Relais2 = 1
  Wait 1
  Relais2 = 0
  Wait 1
Next
Wait 1


'Ausgangsspannung des elektronischen Power Schlaters UA umschalten
'Nicht sichtbar, entweder Verbraucher anschliessen oder messen
For I = 1 To 5
  Sound Portb.7 , 400 , 250                                 'BEEP
  Ausgang_ua = 1
  Wait 2
  Sound Portb.7 , 400 , 250                                 'BEEP
  Ausgang_ua = 0
  Wait 2
Next
Wait 1


'Ausgangsspannung des elektronischen Power Schlaters UB umschalten
'Nicht sichtbar, entweder Verbraucher anschliessen oder messen
For I = 1 To 5
  Sound Portb.7 , 400 , 250                                 'BEEP
  Ausgang_ub = 1
  Wait 2
  Sound Portb.7 , 400 , 250                                 'BEEP
  Ausgang_ub = 0
  Wait 2
Next
Wait 1


'Alarm wird getestet
For I = 1 To 20
  Alarmgeber = 1
  Waitms 100
  Alarmgeber = 0
  Waitms 100
Next
Wait 1


'Test abgeschlossen, nun wird noch ständig über Funk gesendet
' Funkmodultest
Do
  For I = 1 To 30000
    Print "www.robotikhardware.de  Z:" ; I
    Waitms 500
  Next I
Loop

End









' ----------------- Hilfreiche Unterfunktionen ------------------------


Sub Init_digitalanzeige()
Local Z As Byte

  I2cstart
  I2cwbyte Slave_digi
  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
  I2cwbyte &B0110111
  I2cstop

  'Alle Ziffern auf 0
  For Z = 1 To 4
       Ziffer_digitalanzeige Z , 0 , 0
  Next Z
End Sub


Sub Ziffer_digitalanzeige(byval Ziffernummer As Byte , Byval Zahl As Byte , Byval Dezimalpunkt As Byte)
Local Segmente As Byte

  I2cstart
  I2cwbyte Slave_digi
  I2cwbyte Ziffernummer

  Select Case Zahl
         Case 0:
               Segmente = &H3F                              '00111111
         Case 1:
                Segmente = &H06
         Case 2:
                Segmente = &H5B
         Case 3:
                Segmente = &H4F                             '01001111
         Case 4:
                Segmente = &H66
         Case 5:
                Segmente = &H6D
         Case 6:
                Segmente = &H7D
         Case 7:
                Segmente = &H07
         Case 8:
                Segmente = &H7F                             '01111111
         Case 9:
                Segmente = &H67
         Case 10:                                           'Steht für keine Ziffer
                Segmente = &H0

         Case 11:                                           'Steht für keine Ziffer
                Segmente = &B10111110                       'Buchstabe V
         Case 12:                                           'Steht für keine Ziffer
                Segmente = &B10111000                       'Buchstabe L



         Case Else :
                Segmente = &H80                             'Ansonsten Dezimalpunkt
  End Select

  If Dezimalpunkt = Ziffernummer Then Segmente = Segmente Or &H80
  I2cwbyte Segmente
  I2cstop
End Sub



Sub Zahl_digitalanzeige(byval Zahl As Integer)
Local Tausender As Integer
Local Hunderter As Integer
Local Zehner As Byte
Local Einer As Byte
Local Temp As Integer
Local Temp2 As Byte
Local Abschneiden As Byte



Tausender = Zahl / 1000
Temp = Tausender * 1000
Zahl = Zahl - Temp

Hunderter = Zahl / 100
Temp = Hunderter * 100
Zahl = Zahl - Temp

Zehner = Zahl / 10
Temp = Zehner * 10
Zahl = Zahl - Temp

Einer = Zahl

'Nullen vorne entfernen
If Tausender = 0 Then
  Tausender = 10
  If Hunderter = 0 Then
    Hunderter = 10
    If Zehner = 0 Then
      Zehner = 10
    End If
  End If
End If


Ziffer_digitalanzeige 4 , Einer , 0
Ziffer_digitalanzeige 3 , Zehner , 0
Temp2 = Hunderter
Ziffer_digitalanzeige 2 , Temp2 , 0
Temp2 = Tausender
Ziffer_digitalanzeige 1 , Temp2 , 0

End Sub




'Sendet Easyradio Befehl und prüft ob korrekt empfangen
'Rückgabe: 0=Erfolgreich 1=Fehler
Function Rn_sendefunkbefehl(byval Funkbefehl As String) As Byte
Local Sech As String * 20
Local Z As Byte

    Print Funkbefehl;
    Waitms 40
    Sech = ""
    Do                                                      'Auf Echo warten
      Z = Inkey()
      Sech = Sech + Chr(z)
    Loop Until Z = 0

    If Left(sech , 9) = Funkbefehl Then
      Print "ACK";
      Rn_sendefunkbefehl = 0
    Else
      Rn_sendefunkbefehl = 1
    End If

End Function


'Empfängt Datenstring (Holt alles aus dem Eingabebuffer)
'Rückgabe: 0=Erfolgreich 1=Fehler
Function Rn_empfange_funkstring(dat As String) As Byte
Local Z As Byte

    Waitms 20
    Dat = ""
    Do                                                      'Auf Echo warten
      Z = Inkey()
      If Z <> 0 Then Dat = Dat + Chr(z)
    Loop Until Z = 0
    Rn_empfange_funkstring = 0
End Function