Wie hast du denn die Sensoren angeschlossen? Das da oben ist ja sicherlich nicht das ganze Programm. Hast du den ADC auch richtig eingestellt? Die jeweiligen Ports als Ein- und Ausgang eingestellt?
Hallo
Hat schon jemand ein Lienverfolgungs prog geschrieben.
Wäre froh wenn jemang so ein Prog mal posten kann.
Würde mich schon viel weiter bringen.
Danke schon im voraus
Wie hast du denn die Sensoren angeschlossen? Das da oben ist ja sicherlich nicht das ganze Programm. Hast du den ADC auch richtig eingestellt? Die jeweiligen Ports als Ein- und Ausgang eingestellt?
Hi mesli-andres,
ich denke Du hast da nen ganz trivialen bug in der Funktion Bewegungsmelder. Bei allen 3 Abfragen sind "End If" und "End Select" vertauscht.
If We < 1010 Then
Select Case We
Case 380 To 470
Bewegungsmelder = 3
Case 535 To 720
Bewegungsmelder = 3
End If
End Select
If B < 1010 Then
Select Case B
Case 612 To 820
Bewegungsmelder = 1
End If
End Select
If C < 1010 Then
Select Case C
Case 612 To 820
Bewegungsmelder = 2
End If
End Select
Verschachtelte Ifs, Selects, Schleifen usw müssen immer von innen nach aussen geschlossen werden.
Edit:
Hab grad noch mal Dein Progie angesehen und verstehe "Call Lienienverfolgung" unter "Case 3" nicht.
Dann dachte ich noch, Du solltest bei "Case 3 " vielleicht zuerst die Motoren abzuschalten, damit das Teil nicht fast 20 Sekunden lang einfach geradeaus weiterfährt.
Grüße
Marvin
2B or not 2B = FF
Wenn etwas klemmt, wende keine Gewalt an,
nimm einfach nen größeren Hammer.
Ich hab das mal anders dargestellt. Es mag sein, das ich mich täusche, aber denke eher das du If und Select vertauschst hast. Select ist innen und If ist aussen.If C < 1010 Then
Select Case C
Case 612 To 820
Bewegungsmelder = 2
End If
End Select
Hmm, bei genauer Betrachtung ist das If mitsamt dem End If eigentlich völlig überflüssig.
Wenn C >= 1010 ist, dann trifft der "Case 612 to 820" nicht zu und "Bewegungsmelder" wird nicht gesetzt.
Grüße
Marvin
2B or not 2B = FF
Wenn etwas klemmt, wende keine Gewalt an,
nimm einfach nen größeren Hammer.
@mesli-andres
hast du bei deinem ATMega die serielle Schnitstelle so beschaltet (max232), dass du Daten an den PC ausgeben kannst?
Dann würde ich bei Schleifen, Abfragen usw. Print Befehle zum Debuggen einfügen.
Damit findet man Fehler wie Marco78 und Marvin gefunden haben meist schneller, als wenn man über dem Quelltext brütet.
Hallo
Danke mal für die vielen tips.![]()
Mit Case 3 steuere ich eine Digicam die dann Fotos macht.
Später habe ich dann das Prog mit Print Befehlen ausgestattet aber das brachte mich nicht weiter.
Kannst du nicht mal den Schaltplan und das komplette Propgramm veröffentlichen?
Es stellt sich immer noch die Frage, ob der ADC überhaupt richtig eingestellt ist und ob die Spannung mit einem Spannungsteiler ermittelt wird...
Hallo
Hier ist das gesamte Prog.
Code:'################################################### 'Überwachungsroboter.bas 'Überwachungsroboter 'Projekt von Andres '####################################################### Declare Function Bewegungsmelder() As Byte Declare Sub Linieverfolgung() $regfile = "m32def.dat" $framesize = 32 $swstack = 32 $hwstack = 32 Dim I As Integer Dim N As Integer Dim Ton As Integer $crystal = 16000000 'Quarzfrequenz $baud = 9600 Config Adc = Single , Prescaler = Auto 'Für Tastenabfrage und Spannungsmessung Config Pina.7 = Input 'Für Tastenabfrage Porta.7 = 1 'Pullup Widerstand ein Config Pina.5 = Input Config Pina.6 = Input Config Pina.2 = Input Config Pina.3 = Input Config Porta.4 = Output Dim Taste As Byte Dim Volt As Single ' Für Linieverfolgung '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 'Prescaler = 8 I = 0 Waitms 5000 Sound Portd.7 , 400 , 450 'BEEP Sound Portd.7 , 400 , 250 'BEEP Sound Portd.7 , 400 , 450 Print Print "**** RN-Control 1.4 *****" Print "Das neue Experimentier- und Roboterboard" Print "Weitere passende Zusatzboards bei www.robotikhardware.de" Print "Projekt Ueberwachungsroboter von Andres" Print Do Do Taste = Bewegungsmelder() If Taste <> 0 Then Select Case Taste Case 1 Pwm1a = 0 'Linker Motor aus Waitms 1000 Pwm1a = 1023 Print "Rechts weisse Linie erkannt" Case 2 Pwm1b = 0 Waitms 1000 Pwm1b = 1023 Print "Links weisse Linie erkannt" Case 3 Waitms 2000 Porta.4 = 1 Waitms 800 Porta.4 = 0 Waitms 1000 Porta.4 = 1 Waitms 500 Porta.4 = 0 Waitms 4000 Porta.4 = 1 Waitms 500 Porta.4 = 0 Waitms 4000 Porta.4 = 1 Waitms 500 Porta.4 = 0 Print "Person gesichtet und fotografiert" Waitms 5000 Call Linieverfolgung End Select End If Waitms 100 Loop End Function Bewegungsmelder() Local B As Word Local C As Word Local We As Word Bewegungsmelder = 0 'Diese Unterfunktion überwacht den Raum und folgt Der Linie Start Adc B = Getadc(5) C = Getadc(6) We = Getadc(2) If We < 1010 Then Select Case We Case 380 To 470 Bewegungsmelder = 3 Case 535 To 720 Bewegungsmelder = 3 End Select End If If B < 1010 Then Select Case B Case 412 To 820 Bewegungsmelder = 1 Case Else ' Print "Wert anpassen!ADC Wert B=" ; B End Select End If If C < 1010 Then Select Case C Case 412 To 820 Bewegungsmelder = 2 Print "Wert anpassen!ADC Wert C=" ; C End Select End If End Function Sub Linieverfolgung() Waitms 1000 '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 I = 0 Do Pwm1a = I Pwm1b = I Waitms 10 I = I + 5 Loop Until I > 1023 ' Waitms 100 Do Pwm1a = 1023 Pwm1b = 1023 End End Sub Loop Loop
Und hier der Schaltplan zum ansteuern der CN70's
Und da sehe ich schon den ersten Fehler. Der ADC-Port ist hochohmig. Bedeutet es fließt kein Strom und es kann keine Spannung abfallen. Die Spannungsmessung muss als Spannungsteiler erfolgen. Du brauchst also noch ein Widerstand vom Analogport zu Masse.
Ein CNY70 ist ein Optokoppler, oder? Lässt der sich so 'fein' ansprechen, das man verschiedene Spannungen bekommt?
Lesezeichen