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







Zitieren


Lesezeichen