hier jetzt der Code:
Code:
'**** Über RS232 Schnittstelle Dateien an RN-Control senden :*******************
'Funktion:
'
'*******************************************************************************
'Microcontroller Einstellungen Definieren.
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
'Funktionen Declarieren
Declare Function Tastaturabfrage() As Byte 'Funktion für die Tastenabfrage am Board deklarieren
Declare Sub Batteriespannung()
Declare Sub Irentfernung1()
Declare Sub Motorschalten()
Declare Sub Motorschalten1()
Declare Sub Fuluftdruck()
Declare Sub Serial0charmatch()
Declare Sub Temperatur()
'*******************************************************************************
'Variablen deklarieren:
Dim Ton As Integer
Dim Motordrehzahl As Integer
Dim Spannung As Word
Dim Taste As Byte
'Const Ref = 5 / 1023 'Umrechnungsfaktor von 8Bit Zahlenwert = 1023 bei 5 Volt Spannung in Gleitkommazahlenwert
Dim Luftdruck As Word
'Dim Hoehe As Integer
'Variablen für das Einlesen der Empfangenen Daten
Dim Inputstring As String * 30
Dim Inputarray(7) As String * 5
Dim Status As Bit
Dim Tmp As Byte
Dim Data_available As Byte
Dim Dempfangen As Byte
Dim Dempfangstring As String * 5
Dim Empfangstatus As Boolean
Dim Motorr As Integer
Dim Motorl As Integer
Dim Schildv As Integer
Dim Schildh As Integer
Dim Kamera As Integer
'Variablen zum für Daten die versendet werden sollen
Dim Fehlermeldung As String * 30
Dim Irabstand1 As Integer
Dim Irabstand2 As Integer
Dim Uabstand1 As Integer
Dim Uabstand2 As Integer
Dim Batteriestatus As Word
Dim Temperatura As Integer
Dim Temperaturi As Integer
'*******************************************************************************
'Ports definieren (Als was welcher Port sein soll)
Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung benötigt
Config Pina.7 = Input 'Für Tastenabfrage wird PortA7 als eingang definiert
Porta.7 = 1 'Pullup Widerstand am PortA7 ein
Config Portd.2 = Output 'Für Enfernungsmessung Ultraschall diesen Port als eingang definieren
Config Pina.2 = Input 'Für Luftdruckmessung diesen Port als eingang definieren
Config Pina.1 = Input 'Port für Temperaturinnen:
'Buffer Einstellen
Config Serialin = Buffered , Size = 40 , Bytematch = 13 'Empfang-Buffer erstellen und wenn Zeichen 13 (Enter) gesendet wurde in Prozedur Serial0charmatch springen
'Enable Interrupts
'Ports für linken Motor
Config Pinc.6 = Output 'Linker Motor Kanal 1
Config Pinc.7 = Output 'Linker Motor Kanal 2
Config Pind.4 = Output 'Linker Motor PWM
'Ports für rechten Motor
Config Pinb.0 = Output 'Rechter Motor Kanal 1
Config Pinb.1 = Output 'Rechter Motor Kanal 2
Config Pind.5 = Output 'Rechter Motor PWM
'*******************************************************************************
'Interrupt
Config Int0 = Rising 'Configuriere Int0 auf Low Level
On Int0 Isr_von_int0 'springe Zu Isr_von _int0
Enable Interrupts 'einschalten der Interrupts
Enable Int0 'einschalten Von Interrupt Int0
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Tccr1b = Tccr1b Or &H02 'Prescale = 8 (Quarzfrequenz duch 8)
Pwm1a = 0 'Linker Motor (Drehzahl)
Pwm1b = 0 'Linker Motor (Drehzahl)
'*******************************************************************************
'Hauptprogramm
'Hochfahren der RN-Control Signal
Sound Portd.7 , 400 , 450 'BEEP (Pin, Länge in ms des Pipsesn, Anzahl Pulse
Sound Portd.7 , 600 , 150 'BEEP
Sound Portd.7 , 400 , 500 'BEEP
Motorr = 0
Motorl = 0
Empfangstatus = 1
Schildv = 0
Schildh = 0
Kamera = 0
Do
Taste = Tastaturabfrage()
If Taste <> 0 Then
Select Case Taste
Case 1
Empfangstatus = 0
Case 2
Empfangstatus = 1
Case 3
Case 4
Case 5
Print "Programm wurde abgebrochen"
Sound Portd.7 , 800 , 400
Exit Do
End Select
End If
Temperatur 'Funktion Temperatur aufrufen
Fehlermeldung = "Dies ist Ein Test"
Irabstand1 = Schildv '20
Irabstand2 = Schildh '10
Uabstand1 = Motorr '500
Uabstand2 = Motorl '100
Batteriespannung
Batteriestatus = Spannung
Temperatura = Kamera
Fuluftdruck 'Funktion Luftdruck auslesen starten
If Empfangstatus = 1 Then
Print 1 ; ";" ; Fehlermeldung ; ";" ; Irabstand1 ; ";" ; Irabstand2 ; ";" ; Uabstand1 ; ";" ; Uabstand2 ; ";" ; Batteriestatus ; ";" ; Temperatura ; ";" ; Temperaturi ; ";" ; Luftdruck ; ";" ; 23 ; ";"
Empfangstatus = 1
End If
Motorschalten1 'Funktion Motor ausführen
'Motorr = 0
'Motorl = 0
'Wenn Kamera gedreht werden soll dann Sound ausgeben
If Kamera = 1 Then
Sound Portd.7 , 10 , 800
Waitms 20
Kamera = 0
End If
If Kamera = -1 Then
Sound Portd.7 , 10 , 400
Waitms 20
Kamera = 0
End If
Wait 1
Loop
End
'*******************************************************************************
'Funktionen Deklarieren (Unterprogramme)
'*******************************************************************************
'Diese Funktion fragt die Tastatur am analogen Port ab
Function Tastaturabfrage() As Byte
Local Ws As Word
Tastaturabfrage = 0 'Variablen werte zuweisen
Ton = 600 'Pipstonhöhe festlegen
Start Adc
Ws = Getadc(7)
If Ws < 500 Then
Select Case Ws
Case 400 To 450 'Da nur ein port für die Taster verwendet wird
Tastaturabfrage = 1 'müssen verschiedene Spannungen abgefragt werden
Ton = 550
Case 330 To 380
Tastaturabfrage = 2
Ton = 500
Case 260 To 305
Tastaturabfrage = 3
Ton = 450
Case 180 To 220
Tastaturabfrage = 4
Ton = 400
Case 90 To 130
Tastaturabfrage = 5
Ton = 350
Case Else
Print "Tastenabfrage anpassen! ADC Wert ws=" ; Ws
End Select
Sound Portd.7 , 400 , Ton 'Sound ausgeben
End If
End Function
Sub Serial0charmatch() 'Wenn Buffer voll ist bzw Zeichen 13 Gesendet wurde dann Diese Funktion ausführen
Input Inputstring Noecho
If Inputstring <> "" Then
'Anweisung Aufteilen
Tmp = Split(inputstring , Inputarray(1) , ";")
'---- X Motorr---
Dempfangen = Instr(inputarray(1) , "X") 'Gibt den Motorwert des Substrings "Motorr" aus oder NULL wenn nicht gefunden
'Motorl_empfangen = Instr(inputarray(2) , "Y") 'Gibt den Motorwert des Substrings "Motorl" aus oder NULL wenn nicht gefunden
If Dempfangen = 1 Then
Dempfangstring = Mid(inputarray(1) , 2) 'Die erste stelle des Strings (Das Motorr) abschneiden
Motorr = Val(dempfangstring) 'String in Integer konvertieren
End If
Dempfangen = 0
Dempfangstring = ""
'---- Y Motorl ----
Dempfangen = Instr(inputarray(2) , "Y") 'Gibt den Motorwert des Substrings "Motorr" aus oder NULL wenn nicht gefunden
If Dempfangen = 1 Then
Dempfangstring = Mid(inputarray(2) , 2) 'Die erste stelle des Strings (Das Motorr) abschneiden
Motorl = Val(dempfangstring) 'String in Integer konvertieren
End If
Dempfangen = 0
Dempfangstring = ""
'--- SH SchildH -----
Dempfangen = Instr(inputarray(3) , "SH") 'Gibt den Motorwert des Substrings "Motorr" aus oder NULL wenn nicht gefunden
If Dempfangen = 1 Then
Dempfangstring = Mid(inputarray(3) , 3) 'Die erste stelle des Strings (Das Motorr) abschneiden
Schildh = Val(dempfangstring) 'String in Integer konvertieren
End If
Dempfangen = 0
Dempfangstring = ""
'--- SV SchildV -----
Dempfangen = Instr(inputarray(4) , "SV") 'Gibt den Motorwert des Substrings "Motorr" aus oder NULL wenn nicht gefunden
If Dempfangen = 1 Then
Dempfangstring = Mid(inputarray(4) , 3) 'Die erste stelle des Strings (Das Motorr) abschneiden
Schildv = Val(dempfangstring) 'String in Integer konvertieren
End If
Dempfangen = 0
Dempfangstring = ""
'--- K Kamera-----
Dempfangen = Instr(inputarray(5) , "K") 'Gibt den Motorwert des Substrings "Motorr" aus oder NULL wenn nicht gefunden
If Dempfangen = 1 Then
Dempfangstring = Mid(inputarray(5) , 2) 'Die erste stelle des Strings (Das Motorr) abschneiden
Kamera = Val(dempfangstring) 'String in Integer konvertieren
End If
Dempfangen = 0
Dempfangstring = ""
End If
End Sub
'Diese Funktion zeigt die Batteriespannung an
Sub Batteriespannung()
Local W As Word
Start Adc
W = Getadc(6)
Spannung = W '* Ref
Spannung = Spannung '* 5.2941
'Print "Die aktuelle Spannung beträgt: " ; Spannung ; "Volt"
End Sub
'Diese Funktion schaltet den Motor an
Sub Motorschalten1()
Dim Richtung1motorr As Bit
Dim Richtung2motorr As Bit
Dim Richtung1motorl As Bit
Dim Richtung2motorl As Bit
Motorr = Motorr * 10
Motorl = Motorl * 10
If Motorr < 0 Then
Richtung1motorr = 0
Richtung2motorr = 1
Motorr = Motorr * -1
Else
Richtung1motorr = 1
Richtung2motorr = 0
End If
If Motorl < 0 Then
Richtung1motorl = 0
Richtung2motorl = 1
Motorl = Motorl * -1
Else
Richtung1motorl = 1
Richtung2motorl = 0
End If
If Motorr > 1000 Then
Motorr = 1000
End If
If Motorl > 1000 Then
Motorl = 1000
End If
'Linker Motor ein
Portc.6 = Richtung1motorl 'Bestimmt Richtung 1 = Spannung +
Portc.7 = Richtung2motorl 'Bestimmt Richtung 0 = Keine Spannung -
Portd.4 = 1 'Linker Motor Ein
'Rechter Motor ein
Portb.0 = Richtung1motorr 'Bestimmt Richtung 1 = Spannung +
Portb.1 = Richtung2motorr 'Bestimmt Richtung 0 = Keine Spannung -
Portd.5 = 1 'Rechter Motor ein
Pwm1a = Motorl 'Linker Motor (Drehzahl)
Pwm1b = Motorr 'Rechter Motor (Drehzahl)
End Sub
'Diese Funktion schaltet den Motor an
Sub Motorschalten()
If Motorr > 1000 Then
Motorr = 1000
End If
'Linker Motor ein
Portc.6 = 1 'Bestimmt Richtung 1 = Spannung +
Portc.7 = 0 'Bestimmt Richtung 0 = Keine Spannung -
Portd.4 = 1 'Linker Motor Ein
'Rechter Motor ein
Portb.0 = 1 'Bestimmt Richtung 1 = Spannung +
Portb.1 = 0 'Bestimmt Richtung 0 = Keine Spannung -
Portd.5 = 1 'Rechter Motor ein
Dim I As Integer
I = 0
Do 'Motor beschleunigen
Pwm1a = I 'Linker Motor (Drehzahl)
Pwm1b = I 'Rechter Motor (Drehzahl)
I = I + 5
Waitms 1
Loop Until I > Motorr 'maximalwert 1024
Pwm1a = Motorl 'Linker Motor (Drehzahl)
Pwm1b = Motorr 'Rechter Motor (Drehzahl)
Do 'Motor abbremsen
Pwm1a = I 'Linker Motor (Drehzahl)
Pwm1b = I 'Rechter Motor (Drehzahl)
I = I - 5
Waitms 40
Loop Until I < 1
Pwm1a = 0 'Linker Motor aus
Pwm1b = 0 'Rechter Motor aus
End Sub
'Diese Funktion zeigt den Luftdruck an
Sub Fuluftdruck()
Local Ws As Word
Start Adc
Ws = Getadc(2)
Luftdruck = Ws
End Sub
'Diese Funktion zeigt die Temperatur an
Sub Temperatur()
Start Adc
Temperaturi = Getadc(1)
End Sub
'Interrupt Int0 Unterprogramm. Dieses wird gestartet wenn Signal an INT0 anliegt
Isr_von_int0: 'ISR von int0
Motorr = 0
Motorl = 0
Motorschalten1
Return
Lesezeichen