gut du hast es nicht anders gewollt...
hier ist alles was ich habe...:
Code:Declare Sub Taste1() Declare Sub Taste2() Declare Sub Taste3() Declare Sub Taste4() Declare Sub Taste5() Declare Sub Move() Declare Sub Turn180() Declare Sub Stopnow() Declare Sub Anfahren() Declare Sub Turnleft() Declare Sub Turnright() Declare Sub Look() Declare Sub Bremsen() Declare Sub Rewind() Declare Sub Lcdout() Declare Sub Batteriespannung() Declare Sub Temp() Declare Function Tastenabfrage() As Byte $regfile = "m32def.dat" $crystal = 16000000 $baud = 9600 Config Adc = Single , Prescaler = Auto Const Ref = 5 / 1023 Const Center = 109 Dim Ton As Integer Dim Taste As Byte Dim Volt As Single Dim Dist(12) As Integer Dim Servopos As Integer Dim V As Integer Dim Result As Byte Dim Ms As Integer Dim A As Byte Dim Name As String * 20 Name = "RP 005" Dim Text2 As String * 20 Dim Text3 As String * 20 Dim Dl As Integer Dl = 1 '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 Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down Pwm1a = 0 Pwm1b = 0 Tccr1b = Tccr1b Or &H02 'ende motorports 'In out für tasten Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung Config Pina.7 = Input 'Für Tastenabfrage Porta.7 = 1 'Pullup Widerstand ein 'ende in out für tasten 'timer config Config Timer1 = Timer , Prescale = 1024 On Timer1 Timer_irq Const Timervorgabe = 3036 Enable Timer1 'timer config 'servo config Config Servos = 1 , Servo1 = Porta.0 , Reload = 10 Config Pina.0 = Output 'ende servo config 'taster config Config Pind.6 = Input Portd.6 = 1 'lcd config Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portb.4 , Rs = Portb.3 Config Lcd = 20 * 4 'i2c config Config Scl = Portc.0 Config Sda = Portc.1 Dim Device As Byte Dim Deviceread As Byte Dim Lowtemp As Byte Dim Hightemp As Byte Dim Value As Single I2cinit Device = 144 Deviceread = 145 'ende I2C temp config Enable Interrupts 'programm start Servopos = Center Servo(1) = Servopos Print "**** RN-Control ist startklar... Los gehts!!! *****" Sound Portd.7 , 400 , 450 'BEEP Waitms 100 Sound Portd.7 , 400 , 250 Waitms 100 'BEEP Sound Portd.7 , 400 , 450 'BEEP Cursor Off Text2 = "I am alive..." Call Lcdout Wait 1 Text2 = "Erwarte Befehle" Call Lcdout Do Taste = Tastenabfrage() If Taste <> 0 Then Select Case Taste Case 1 Call Taste1 'Taste 1 Servos Case 2 Call Taste2 'Taste 2 Spannung an pin A5 Case 3 Call Taste3 'Taste 3 Case 4 Call Taste4 'Taste 4 Case 5 Call Taste5 'Taste 5 End Select Sound Portd.7 , 400 , 500 'BEEP End If Waitms 100 Loop End Function Tastenabfrage() As Byte Local Ws As Word Tastenabfrage = 0 Ton = 600 Start Adc Ws = Getadc(7) If Ws < 500 Then Select Case Ws Case 400 To 450 Tastenabfrage = 1 Ton = 550 Case 330 To 380 Tastenabfrage = 2 Ton = 500 Case 260 To 305 Tastenabfrage = 3 Ton = 450 Case 180 To 220 Tastenabfrage = 4 Ton = 400 Case 90 To 130 Tastenabfrage = 5 Ton = 350 End Select Sound Portd.7 , 400 , Ton 'BEEP End If End Function Sub Taste1() Text2 = "Servo Test" Call Lcdout() Wait 1 Servopos = Center Servo(1) = Servopos Text2 = "Mitte" Call Lcdout() Wait 1 Servopos = 60 Servo(1) = Servopos Wait 1 Text2 = "Rechtsdrehung" Call Lcdout() For Servopos = 60 To 160 Step 10 Servo(1) = Servopos Waitms 10 Next Wait 1 Text2 = "Linksdrehung" Call Lcdout() For Servopos = 160 To 60 Step -10 Servo(1) = Servopos Waitms 10 Next Wait 1 Text2 = "Mitte" Call Lcdout() Servopos = Center Servo(1) = Servopos End Sub Sub Taste2() Text2 = "Sensor Test" Call Lcdout() Call Look() End Sub Sub Taste3() Text2 = "Taster Test" Call Lcdout() Do If Pind.6 = 0 Then Sound Portd.7 , 800 , 800 Text2 = "Upps sorry..." Call Lcdout() Call Turn180 End If Waitms 300 Loop End Sub Sub Taste4() Wait 1 Call Turn180 End Sub Sub Taste5() Text2 = "Volle Fahrt voraus" Call Lcdout() Wait 1 Call Move() End Sub Sub Move() Text2 = "moving..." Call Lcdout() Local U As Integer Start Adc 'spannungsmessung starten Call Anfahren 'anfahren 'Fahren Do 'servo Rechtsdrehung" Servopos = 89 For Servopos = 89 To 129 Step 4 Servo(1) = Servopos If Pind.6 = 0 Then 'taster anstoss Text2 = "Upps sorry..." Call Lcdout() Call Stopnow Call Rewind Call Turn180 Call Anfahren Text2 = "moving..." Call Lcdout() End If Waitms 80 'vorher 80 U = Getadc(5) If U > 250 Then 'spannung am gp12d2 zu groß Text2 = "Hindernis gefunden" Call Lcdout() U = 0 Call Stopnow Call Look Call Anfahren Text2 = "moving..." Call Lcdout() End If Next 'servo Linksdrehung" For Servopos = 129 To 89 Step -4 Servo(1) = Servopos If Pind.6 = 0 Then Text2 = "Upps sorry..." Call Lcdout() Call Stopnow Call Rewind Call Turn180 Call Anfahren Text2 = "moving..." Call Lcdout() End If Waitms 80 'vorher 80ms U = Getadc(5) If U > 250 Then Text2 = "Hindernis gefunden" Call Lcdout() U = 0 Call Stopnow Call Look Call Anfahren Text2 = "moving..." Call Lcdout() End If Next Loop 'bremsen If V > 0 Then Call Bremsen End If Servopos = Center Servo(1) = Servopos End Sub Sub Look() Local Sp As Byte Servopos = 60 Servo(1) = Servopos Cls 'clear the LCD display Text2 = "Suche weiteren Weg..." Call Lcdout() Waitms 200 Sp = 1 'Servo "Rechtsdrehung": For Servopos = 50 To 160 Step 10 'vorher 170 Servo(1) = Servopos Waitms 180 Dist(sp) = Getadc(5) Incr Sp Next Servopos = Center Servo(1) = Servopos 'suche nach kleinstem wert Result = 1 For Sp = 1 To 12 'vorher 12 If Dist(sp) < Dist(result) Then Result = Sp Next Ms = 0 Select Case Result Case 1 Ms = 600 Call Turnleft Case 2 Ms = 500 Call Turnleft Case 3 Ms = 400 Call Turnleft Case 4 Ms = 200 Call Turnleft Case 5 Ms = 100 Call Turnleft Case 6 Ms = 50 Call Turnleft Case 7 Ms = 50 Call Turnright Case 8 Ms = 100 Call Turnright Case 9 Ms = 200 Call Turnright Case 10 Ms = 400 Call Turnright Case 11 Ms = 500 Call Turnright Case 12 Ms = 600 Call Turnright Case Else Sound Portd.7 , 1000 , 200 End Select End Sub Sub Turnleft() Text2 = "Linksdrehung" Call Lcdout() 'Print "drehen um " ; Ms ; " nach links" 'servo auf mitte stellen Servopos = Center Servo(1) = Servopos 'Linker Motor ein Portc.6 = 1 'bestimmt Richtung Portc.7 = 0 'bestimmt Richtung Portd.4 = 1 'Linker Motor EIN 'Rechter Motor ein Portb.0 = 0 'bestimmt Richtung rechter Motor Portb.1 = 1 'bestimmt Richtung rechter Motor Portd.5 = 1 'rechter Motor EIN 'beschleunigen der motoren V = 0 Do Pwm1a = V Pwm1b = V Waitms 20 V = V + 200 Loop Until V > 1000 Waitms Ms Call Bremsen Ms = 0 End Sub Sub Turnright() Text2 = "Rechtsdrehung" Call Lcdout() 'servo auf mitte stellen Servopos = Center Servo(1) = Servopos 'Linker Motor ein Portc.6 = 0 'bestimmt Richtung Portc.7 = 1 'bestimmt Richtung Portd.4 = 1 'Linker Motor EIN 'Rechter Motor ein Portb.0 = 1 'bestimmt Richtung rechter Motor Portb.1 = 0 'bestimmt Richtung rechter Motor Portd.5 = 1 'rechter Motor EIN 'beschleunigen der motoren V = 0 Do Pwm1a = V Pwm1b = V Waitms 20 V = V + 200 Loop Until V > 1000 Waitms Ms Call Bremsen Ms = 0 End Sub Sub Turn180() 'servo auf mitte stellen Text2 = "180 Grad Drehung" Call Lcdout() 'Linker Motor ein Portc.6 = 0 'bestimmt Richtung Portc.7 = 1 'bestimmt Richtung Portd.4 = 1 'Linker Motor EIN 'Rechter Motor ein Portb.0 = 1 'bestimmt Richtung rechter Motor Portb.1 = 0 'bestimmt Richtung rechter Motor Portd.5 = 1 'rechter Motor EIN 'beschleunigen der motoren If V = 0 Then Do Pwm1a = V Pwm1b = V Waitms 20 V = V + 100 Loop Until V > 1000 End If Waitms 1250 'warten 'ab Call Bremsen End Sub Sub Stopnow() Text2 = "Vollbremsung" Call Lcdout() V = 0 Pwm1a = V 'Linker Motor aus Pwm1b = V 'rechter Motor aus End Sub Sub Anfahren() Text2 = "Anfahren" Call Lcdout() 'Linker Motor ein Portc.6 = 0 'bestimmt Richtung Portc.7 = 1 'bestimmt Richtung Portd.4 = 1 'Linker Motor EIN 'Rechter Motor ein Portb.0 = 0 'bestimmt Richtung rechter Motor Portb.1 = 1 'bestimmt Richtung rechter Motor Portd.5 = 1 'rechter Motor EIN 'Beschleunigen V = 0 Do Pwm1a = V Pwm1b = V Waitms 10 V = V + 100 Loop Until V > 1000 End Sub Sub Bremsen() Text2 = "Bremsen" Call Lcdout() Do Pwm1a = V Pwm1b = V Waitms 20 V = V - 200 Loop Until V < 1 Pwm1a = 0 'Linker Motor aus Pwm1b = 0 End Sub Sub Rewind() Text2 = "Rewind..." Call Lcdout() 'Linker Motor ein Portc.6 = 1 'bestimmt Richtung Portc.7 = 0 'bestimmt Richtung Portd.4 = 1 'Linker Motor EIN 'Rechter Motor ein Portb.0 = 1 'bestimmt Richtung rechter Motor Portb.1 = 0 'bestimmt Richtung rechter Motor Portd.5 = 1 'rechter Motor EIN 'Beschleunigen V = 0 Do Pwm1a = V Pwm1b = V Waitms 10 V = V + 100 Loop Until V > 1000 Waitms 100 End Sub Sub Lcdout() Cls Locate 1 , 1 Lcd Name Locate 2 , 1 Lcd Text2 Call Temp Locate 3 , 1 Lcd "Temp= " ; Fusing(value , "#.#") ; " Grad " ; Dl Call Batteriespannung Locate 4 , 1 Lcd "Ubatt= " ; Fusing(volt , "#.##") ; " V" Incr Dl End Sub Sub Batteriespannung() Local W As Word Local Z As String * 10 Start Adc W = Getadc(6) Volt = W * Ref Volt = Volt * 5.2941 End Sub Sub Temp() I2cstart I2cwbyte Device I2cwbyte &HEE I2cstop I2cstart I2cwbyte Device I2cwbyte &HAA I2cstop I2cstart I2cwbyte Deviceread I2crbyte Lowtemp , Ack I2crbyte Hightemp , Nack I2cstop Value = Lowtemp * 10 If Hightemp = 128 Then Value = Value + 5 End If Value = Value / 10 End Sub Timer_irq: Timer1 = Timervorgabe Call Lcdout Return






Zitieren


Lesezeichen