Hi,
also ich poste jetzt mal den ganzen Code unseres Programms. Das Fahrzeug hat zwei induktive Spursensoren (Sensor links und Sensor rechts), die analoge Werte < 10 anzeigen, wenn sie Kontakt zur Spur haben. Die Spur ist ein Draht, wo ein Signal drauf läuft. Dann haben wir noch einen IFR-Sensor zur Hinderniserkennung. Die Lenkung sitzt hinten und wird durch einen weiteren Motor realsiert. Auf der Lenkachse sitzt ein Poti, mit dem wir die Mittelstellung ermitteln.
Das Board ist das RN-Control 1.4 mit dem Atmega32. Wir befürchten, dass die 2 Kb Ram zu wenig sind, um z.b.e in Funktionen zu übergeben. Es steht ja sicher nicht umsonst in der RN-Wiki, dass man sowas vermeiden soll, um schnellen Code zu erzeugen. Ist es generell besser, auf solche Dinge zu verzichten und nur Sub Routinen ohne Parameterübergabe zu benutzen?
Ich hab die Stelle die bei der Ausgabe 0 ergibt rot und fett im Code markiert.
Danke schonmal im Voraus für die Mühe
Code:
'Hardwarekonfiguration
$regfile = "m32def.dat"
$framesize = 256 '32
$swstack = 256 '32
$hwstack = 256 '256
$lib "Lcd_i2c.lib" 'ersetzt die Standard LCD Library
Const Pcf8574_lcd = &H40 'I2C Adresse
Config Scl = Portc.0 'I2C SCL Pin
Config Sda = Portc.1 'I2C SDA Pin
Dim _lcd_e As Byte
_lcd_e = 128 'LCD im 4-Bit Mode betreiben
Dim I As Word
Dim N As Word
Dim Ton As Word
$crystal = 16000000 'Quarzfrequenz
$baud = 9600 'Übertragungsrate 19200 für funk
Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung
Config Pina.7 = Input 'Für Tastenabfrage
Porta.7 = 1 'Pullup Widerstand ein
Const Ref = 5 / 1023 'Für Batteriespannungsberechnung
Dim Taste As Byte
'Dim Volt As Single
'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 Up , Compare B Pwm = Clear Up
Pwm1a = 0
Pwm1b = 0
Tccr1b = Tccr1b Or &H02 'Prescaler = 8
'Programm
Const Zaehler = 10 'Mittelwerte aus Zaehler. Werten
Const Max_pwm = 1023 'maximale Pulsweitenmodulation
'Fahrtprogramm
Dim Pos As Byte
Dim Lenkeinschlag As Byte
Declare Sub Fahrt() 'Hauptprogramm der Steuerung
Declare Sub Init() 'Initialisierung
Declare Sub Lenken() 'ermittelt benötigten Lenkeinschlag
Declare Sub Neue_pos() 'liefert gewünschte Lenkrichtung
Declare Sub Motor() 'liefert gewünschte Motorgeschwindigkeit
'Motorsteuerungsfunktionen
Dim Motorkraft As Word
Declare Function Motor_speed() As Word 'Abfrage Motorgeschwindigkeit
Declare Sub Motor_start() 'Motor mit Geschwindigkeit ansteuern
Declare Sub Motor_stop() 'anhalten
Declare Sub Motor_brems() 'bremsen
Declare Sub Motor_antrieb()
'Lenkungsfunktionen
Declare Sub Lenkung_stop() 'aufhören zu lenken
Declare Sub Lenkung_links() 'nach links lenken
Declare Sub Lenkung_rechts() 'nach rechts lenken
Declare Sub Motor_lenk() '
'Infrarotsensorfunktionen
Dim Ifr_sensor As Word
Const Ifr_port = 0
Declare Function Ifr_sensor_lesen() As Word 'liefert Ifr_Sensor
'Lichtschranke
Const Lichtschranke_port = 4
Declare Function Lichtschranke(byval Port As Byte) As Word 'Liefert Wert der Lichtschranke
'Spurführungssensorenfunktionen
Const Spur_rechts_port = 3
Const Spur_links_port = 2
Dim Sensor_rechts As Word
Dim Sensor_links As Word
Declare Function Spursensor_messen(byval Port As Byte) As Word 'liefert Wert für Spursensor
'Tasten
Const Tasten_port = 7
Declare Function Tastenabfrage() As Byte 'liefert gedrückte Taste
'Poti
Const Poti_port = 1
Dim Poti As Word
Dim Poti_toleranz As Word '5% Toleranz wird in init() definiert
Dim Poti_links As Word 'Wert ganz links
Dim Poti_rechts As Word 'Wert ganz rechts
Declare Function Poti_lesen() As Word 'Liest Wert des Potis
Declare Sub Poti_test()
'Errorcodes
Declare Sub Error(byval Code As Word) 'stoppt FTS und gibt Fehlermeldung aus
'Main
I = 0
Sound Portd.7 , 400 , 450 'BEEP
Sound Portd.7 , 400 , 800 'BEEP
Sound Portd.7 , 400 , 450
Cls 'loesche das LCD Display
Locate 1 , 1 'Cursor auf 1 Zeile, 1 Spalte
Lcd "FTS bereit."
Locate 2 , 1 'String auf Display anzeigen
Lcd "Taste 1 fuer"
Locate 3 , 1
Lcd "Programmstart."
Do
Taste = Tastenabfrage()
If Taste <> 0 Then
Select Case Taste
Case 1
Call Fahrt()
End Select
Sound Portd.7 , 400 , 500 'BEEP
End If
Waitms 100
Loop
End
'Diese Unterfunktion fragt die Tastatur am analogen Port ab
Function Tastenabfrage() As Byte
Local Ws As Word
Tastenabfrage = 0
Ton = 600
Start Adc
Ws = Getadc(tasten_port)
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
'Errorcodes
Sub Error(code As Word)
Motor_brems
Lenkung_stop
Cls 'Display löschen
Locate 1 , 1 '1.Zeile und 1.Zeichen
Lcd "Error " ; Code;
Do
Sound Portd.7 , 400 , 200
Wait 1
Loop
End Sub
'Motorsteuerungsfunktionen
Function Motor_speed() As Word
If Portd.5 = 1 Then
Motor_speed = Pwm1a / Max_pwm
Else
Motor_speed = 0
End If
End Function
Sub Motor_antrieb()
If Motorkraft = 0 Then
Motor_stop
Elseif Motorkraft >= 700 Then
Call Motor_start()
Elseif Motorkraft = 1 Then
Motor_brems
Else
Call Error(302)
End If
End Sub
Sub Motor_stop()
Portb.0 = 0 'Antrieb aus
Portb.1 = 1
Portd.5 = 0
Pwm1a = 0
End Sub
Sub Motor_brems()
Portd.5 = 0
Pwm1a = 0 'Antrieb aus
Portb.0 = 1 'Generator
Portb.1 = 0
Portd.5 = 1
Pwm1a = 1
Waitms 1
End Sub
Sub Motor_start()
Portb.0 = 0 'Antrieb schnell
Portb.1 = 1
Portd.5 = 1
If Motorkraft < 700 Then
Call Error(301)
Else
Pwm1a = Motorkraft * Max_pwm
End If
End Sub
'Lenkungsfunktionen
Sub Motor_lenk()
If Lenkeinschlag = 1 Then
Lenkung_links
Elseif Lenkeinschlag = 2 Then
Lenkung_stop
Elseif Lenkeinschlag = 3 Then
Lenkung_rechts
Else
Call Error(501)
End If
End Sub
Sub Lenkung_stop()
Portd.4 = 0
Pwm1b = 0
If Portc.6 = 0 Then
Portc.6 = 1
Portc.7 = 0
Else
Portc.6 = 0
Portc.7 = 1
End If
Portd.4 = 1
Pwm1b = 1
Waitms 1
Portd.4 = 0
Pwm1b = 0
End Sub
Sub Lenkung_links()
Portc.6 = 0
Portc.7 = 1
Portd.4 = 1
Pwm1b = 1023
End Sub
Sub Lenkung_rechts()
Portc.6 = 1
Portc.7 = 0
Portd.4 = 1
Pwm1b = 1023
End Sub
'Poti Funktionen
Function Poti_lesen() As Word
Local Mittelwert As Word
Local J As Byte
Mittelwert = 0
For J = 1 To 10
Mittelwert = Mittelwert + Getadc(poti_port)
Next J
Poti_lesen = Mittelwert / Zaehler
End Function
Sub Poti_test()
Do
Print Getadc(poti_port)
Loop
End Sub
'Steuert den IFR Sensor
Function Ifr_sensor_lesen() As Word
Local Mittelwert As Word
Local J As Byte
Mittelwert = 0
For J = 1 To Zaehler Step 1
'misst 10 Mal
Mittelwert = Mittelwert + Getadc(ifr_port)
Next J
Ifr_sensor_lesen = Mittelwert / Zaehler
End Function
'Steuert die Spursensoren
Function Spursensor_messen(byval Port As Byte) As Word
Local Mittelwert As Word
Local J As Byte
Mittelwert = 0
For J = 1 To Zaehler Step 1
'misst 10 Mal
Mittelwert = Mittelwert + Getadc(port)
Next J
Spursensor_messen = Mittelwert / Zaehler
End Function
'Fahrt Funktionen
Sub Neue_pos()
Print Sensor_rechts
If Sensor_links >= 700 Then
If Sensor_rechts >= 700 Then
If Pos > 5 Then
Pos = 8
Else
Pos = 0
End If
End If
If Sensor_rechts < 700 And Sensor_rechts >= 10 Then
Pos = 7
End If
If Sensor_rechts < 10 Then
Pos = 6
End If
Elseif Sensor_links < 700 And Sensor_links >= 10 Then
If Sensor_rechts < 10 Then
Pos = 5
End If
If Sensor_rechts >= 700 Then
Pos = 1
End If
Else
If Sensor_rechts < 10 Then
Pos = 4
End If
If Sensor_rechts >= 10 And Sensor_rechts < 700 Then
Pos = 3
End If
If Sensor_rechts >= 700 Then
Pos = 2
End If
End If
Print "Pos in Neue_pos(): " ; Pos
End Sub
Sub Init()
Local Poti_mitte As Word
Cls 'Display löschen
Locate 1 , 1 '1.Zeile und 1.Zeichen
Lcd "Initialisierung " ;
Call Motor_stop()
Call Lenkung_links()
Wait 2
Call Lenkung_stop()
Poti_links = Poti_lesen()
Call Lenkung_rechts()
Wait 2
Call Lenkung_stop()
Poti_rechts = Poti_lesen()
Poti_mitte = Poti_rechts + Poti_links
Poti_mitte = Poti_mitte / 2
Poti_toleranz = Poti_links - Poti_rechts
Poti_toleranz = Poti_toleranz / 20
Poti_mitte = Poti_mitte - Poti_toleranz
Call Lenkung_links
Print "poti_mitte " ; Poti_mitte
Print "poti_links " ; Poti_links
Print "poti_rechts " ; Poti_rechts
Do
Print "poti_jetzt" ; Getadc(poti_port)
Loop Until Getadc(poti_port) >= Poti_mitte
Call Lenkung_stop()
Print Poti_mitte
Wait 2
Print Getadc(poti_port)
Cls 'Display löschen
Locate 1 , 1 '1.Zeile und 1.Zeichen
Lcd "Fahrt " ;
End Sub
Sub Motor()
If Ifr_sensor < 30 Or Ifr_sensor >= 170 And Ifr_sensor < 400 Then 'anhalten
Motorkraft = 0
Elseif Ifr_sensor >= 30 And Ifr_sensor < 170 Then 'kein Hinderniss
If Lenkeinschlag >= 3 And Lenkeinschlag < 6 Then
Motorkraft = 1
Else
Motorkraft = 701
End If
Else
Motorkraft = 1 'bremsen
End If
End Sub
Sub Lenken()
Local Mitte As Word
Local Halb As Word
Local Ziel As Word
Local Max_ziel As Word
Local Min_ziel As Word
Mitte = Poti_rechts - Poti_links
Halb = Mitte - Poti_links
Halb = Halb / 2
If Pos < 2 And Pos >= 0 Then
Ziel = Poti_links
Elseif Pos < 4 And Pos >= 2 Then
Ziel = Mitte - Halb
Elseif Pos = 4 Then
Ziel = Mitte
Elseif Pos < 7 And Pos >= 5 Then
Ziel = Mitte + Halb
Elseif Pos < 9 And Pos >= 7 Then
Ziel = Poti_rechts
Else
Call Error(901)
End If
Max_ziel = Ziel + Poti_toleranz
Min_ziel = Ziel - Poti_toleranz
If Poti > Max_ziel Then
Lenkeinschlag = 1
Elseif Poti < Min_ziel Then
Lenkeinschlag = 3
Elseif Poti < Max_ziel And Poti > Min_ziel Then
Lenkeinschlag = 2
Else
Print "pos " ; Pos;
Print "Poti " ; Poti;
Print "ziel " ; Ziel;
Print "toleranz " ; Poti_toleranz;
Print "Max_Ziel " ; Max_ziel;
Print "Min_Ziel " ; Min_ziel;
Print "Poti_links " ; "Poti_links";
Print "Poti_rechts " ; "Poti_rechts";
Call Error(601)
'loesche das LCD Display
End If
End Sub
Sub Fahrt()
Local Lenkeinschlag As Byte
Local Motorkraft As Word
Local Sensor_rechts As Word
Local Sensor_links As Word
Local Poti As Word
Local Ifr_sensor As Word
Local Pos As Byte
Sensor_rechts = Spursensor_messen(spur_rechts_port)
Sensor_links = Spursensor_messen(spur_links_port)
If Sensor_rechts >= 10 Then
Call Error(702)
End If
If Sensor_links >= 10 Then
Call Error(701)
End If
Call Init
Pos = 4
Do
Sensor_rechts = Spursensor_messen(spur_rechts_port)
Print "Sensor_rechts: " ; Sensor_rechts
Sensor_links = Spursensor_messen(spur_links_port)
Print "Sensor_links: " ; Sensor_links
Poti = Poti_lesen()
Print "Poti: " ; Poti
Ifr_sensor = Ifr_sensor_lesen()
Print "Ifr_sensor: " ; Ifr_sensor
Print "vorher" ; Sensor_rechts
Call Neue_pos()
Print "Position: " ; Pos
Call Lenken()
Print "Lenkeinschlag: " ; Lenkeinschlag
Call Motor()
Print "Motor: " ; Motorkraft
Print ""
Call Motor_antrieb()
Call Motor_lenk()
Loop
End Sub
Lesezeichen