Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer, IR-Sensor !?!?!?!
minium :)
16.10.2006, 09:34
Hallo,
ich würde gerne ein Programm schreiben das mein Roboter ca.6-8sek rückwärts fährt (die Zeit ist noch unwichtig,PWM auch). Aber irgendwie bekomme ich es nicht hin mit dem Timer, trotz Wiki.
Könnte es mir jemand nochmal erklären ?
Viele Grüße und Vielen Dank
Ich würde da keinen Timer verwenden, der eine Variable runterzählt, sondern ein "Wait 6" einfügen.
Im Programmaufbau also so:
-Configurationen
-Rückwärstfahren
Wait 6
-Anhalten
End
Mit dem Timr müsst ich mich auch erstmal selbst reinarbeiten.
Darauf habe ich aber keinen Bock. :)
Ich hoffe dass ich dir damit auch erstmal etwas helfen konnst.
jon
minium :)
16.10.2006, 11:11
Ok, dann mache ich das so, ist ja leichter.
Aber habe noch ein Prob, mit dem IR Sensor, bei der Robotliga habe ich mir einen gekauft, wie mache ich das mit dem Analog ausgang ?
Also wie muss mein Prog sein das der Atmega8 erkennt wenn ein Gegenstand vor im ist ?
Viele Grüße und Vielen Dank
Als erstes Prog für Analog:
$regfile = "m32def.dat"
$crystal = 1000000
$baud = 1200
Dim Result As Word
Dim Channel As Byte
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Do
Result = Getadc(0)
Print " Count: " ; Result ;
Wait 1
Loop
End
Musst du noch für deinen µC anpassen.
Bei "Getadc(x)" musst du für x den Kanal eingeben, den du abfragen willst.
in der Variablen "Result" wird der ADC-Wert gespeichert. Am besten machst du dir eine Tabelle mit ADC-Wert und Entfernung.
jon
minium :)
16.10.2006, 12:23
Ok, Vielen Dank,
aber wie muss es heisen, das egal wie weit ein Gegenstand entfernt ist mein Roboter z.B. rückwärts fährt ?
Viele Grüße und vielen Dank
Ungefähr so:
Wenn Result >=1024 dann fahre rückwärts.
Ganz nah ist 1024 ganz weit weg ist 1.
Was für einen Sensor hast du?
Einen Sharp?
jon
minium :)
16.10.2006, 12:28
Ja einen Sharp für ca.11 Euro, der misst zwischen 30-90cm.
Vielen Dank und viele Grüße
p.S.: Schicke dann mal mein Prog ;)
minium :)
16.10.2006, 13:26
Hi,
hier mein Prog aber es funktioniert nicht, was ist falsch ?
Viele Grüße und vielen Dank
$regfile = "m8def.dat"
$crystal = 16000000
Waitms 500
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinc.0 = Output
Config Pinc.1 = Output
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinc.4 = Input
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Do
Compare1a = 1
Compare1b = 1
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
Dim Result As Word
Dim Channel As Byte
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Do
Result = Getadc(portc.4) ; Result ;
If
Result = 1000
Then
Portc.0 = 0
Portc.1 = 1
Portc.2 = 0
Portc.3 = 1
Wait 1
Loop
End
$regfile = "m8def.dat"
$crystal = 16000000
Dim Result As Word
Dim Channel As Byte
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinc.0 = Output
Config Pinc.1 = Output
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinc.4 = Input
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Compare1a = 1
Compare1b = 1
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
Start Adc
Do
Result = Getadc(4) ; Result ;
If
Result = 1000 Then
Portc.0 = 0
Portc.1 = 1
Portc.2 = 0
Portc.3 = 1
Wait 1
Loop
End
Ich habe das Programm mal etwas bearbeitet.
So mache ich es bei mir immer.
Was ich geändert habe findest du, denke ich, selbst raus, wenn du es die nochmal genauer anschaust.
jon
minium :)
16.10.2006, 20:35
Hi,
vielen Dank aber irgendwie gibt es immer noch fehlermeldungen, wieso ?
Hier mal die Fehlermeldungen:
Error: 31 Line: 30 Infalid datatyp [0]
Error: 93 Line: 30 Variable not dimensioned [0-> 0]
Error: 1 Line: 32 Unknow Statement [IF]
Error: 242 Line: 33 Source variable does not match the target variable [0/1000 THEN]
Viele Grüße
Was für fehlermeldungen?
Ich habe den Code nochmal an zwei Stellen bearbeitet:
$regfile = "m8def.dat"
$crystal = 16000000
Dim Result As Word
Dim Channel As Byte
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinc.0 = Output
Config Pinc.1 = Output
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinc.4 = Input
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Compare1a = 1
Compare1b = 1
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
Start Adc
Do
Result = Getadc(4) ; Result
If
Result > 1000 Then
Portc.0 = 0
Portc.1 = 1
Portc.2 = 0
Portc.3 = 1
Wait 1
Loop
End
In der Zeile "Result > 1000" ist es nicht sinnvoll = zu verwenden, da er nur bei diesem Wert hinter fährt. Von daher ist es sinnvoll " > "einzusetzten. Dann fährt er bei ganz nahen Gegenständen zurück.
jon
minium :)
16.10.2006, 20:44
Hi,
habe die Fehlermeldungen jetzt dazu geschrieben, in meinem vorigen Post.
Und bei dem Prog. jetzt hat sich die letzte Fehlermeldung geändert:
Error: 1 Line: 33 Unknown statement [Result > 1000 Then]
Viele Grüße und vielen Dank
$regfile = "m8def.dat"
$crystal = 16000000
Dim Result As Word
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinc.0 = Output
Config Pinc.1 = Output
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinc.4 = Input
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Compare1a = 1
Compare1b = 1
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
Start Adc
Do
Result = Getadc(4) ; Result
If
Result > 1000 Then
Portc.0 = 0
Portc.1 = 1
Portc.2 = 0
Portc.3 = 1
End if
Wait 1
Loop
End
Habe den Code nochmal bearbeiten müssen.
Könntest du die Zeilen, die in der Fehlermeldung angegeben sind, mal markieren?
Ich krieg das mit dem Durchzählen nicht so ganz hin.
jon
minium :)
16.10.2006, 21:00
Hi, vielen Dank,
also hier die reihen:
F.:Error: 31 Line: 30 Infalid datatyp [0]
Result = Getadc(4) ; Result
F.:Error: 93 Line: 30 Variable not dimensioned [0-> 0]
Result = Getadc(4) ; Result
F.:Error: 1 Line: 32 Unknow Statement [IF]
If
F.:Error: 1 Line: 33 Unknown statement [Result > 1000 Then]
Result > 1000 Then
Viele Grüße und vielen Dank
$regfile = "m8def.dat"
$crystal = 16000000
Dim Result As Word
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinc.0 = Output
Config Pinc.1 = Output
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinc.4 = Input
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Compare1a = 1
Compare1b = 1
Portc.0 = 1
Portc.1 = 0
Portc.2 = 1
Portc.3 = 0
Start Adc
Do
Result = Getadc(4)
If
Result > 1000 Then
Portc.0 = 0
Portc.1 = 1
Portc.2 = 0
Portc.3 = 1
End if
Wait 1
Loop
End
Probier es mal so aus.
jon
Hallo minium, Hallo Jon,
Result = Getadc(4) ; Result
das Semikolon und der Text dahinter gehören nicht dahin. Kommentare werden immer mit ' eingeleitet.
If
Result > 1000 Then gehört in eine Zeile:
If Result > 1000 Then
Weiterhin ist zu erwarten, daß ein Wert von > 1000 nie erreicht wird.
Die Sharp-Sensoren haben ca. eine maximale Ausgangsspannung von 2,6V. Das entspricht etwa einem AD-Wert von 530.
Ich würde für die IF Abfrage einen Wert von ca 350 vorschlagen, das entspricht bei einem Sensor GP2D12 etwa 15cm.
Gruß, Michael
Result = Getadc(4) ; Result
das Semikolon und der Text dahinter gehören nicht dahin. Kommentare werden immer mit ' eingeleitet.
In meiner letzten Programmversion habe ich das auch verbessert.
If
Result > 1000 Then gehört in eine Zeile:
If Result > 1000 Then
Hab ich irgendwie immer übersehen ](*,) ](*,)
Weiterhin ist zu erwarten, daß ein Wert von > 1000 nie erreicht wird.
Die Sharp-Sensoren haben ca. eine maximale Ausgangsspannung von 2,6V. Das entspricht etwa einem AD-Wert von 530.
Ich würde für die IF Abfrage einen Wert von ca 350 vorschlagen, das entspricht bei einem Sensor GP2D12 etwa 15cm.
Stimmt.
Ich habe bei mir die Interne Reverenzspannung, weshalb bei mir das höchst bei einem ganz nahen Gegenstand 1024 ist.
jon
Hallo Jon,
In meiner letzten Programmversion habe ich das auch verbessert. ich war etwas länger am Schreiben, da hast du schon den nächsten Post geschickt.
weshalb bei mir das höchst bei einem ganz nahen Gegenstand 1024 ist. der Wertebereich des AD-Wandlers geht über 1024 Schritte, von 0 bis 1023 !!
Gruß, Michael
minium :)
16.10.2006, 21:53
Hi, vielen Dank,
jetzt habe ich ein funktionierendes Programm. Also vielen Dank für eure Hilfe.
Viele Grüße
minium :)
17.10.2006, 11:55
Hallo,
funktioniert das Prog. auch bei einem Liniensensor oder muss das dann ein ganz anderes sein (nicht Motor,.. nur der Teil mit dem Sensor) ?
Wie müsste es ca. heisen ?
Viele Grüße und vielen Dank
minium :)
26.11.2006, 15:17
Hallo,
nun habe ich noch eine Frage, ich habe jetzt das RN Mega 1.4, und möchte mit dem gleichen Sensor ein prog. schreiben, das wenn der Sensor etwas erkennt die LED auf dem Board angeht, hier mein Prog.:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Dim Result As Word
Config Pina.0 = Input
Config Pinc.1 = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Portc.1 = 0
Start Adc
Do
Result = Getadc(4)
If Result > 350 Then
Portc.1 = 1
End If
Wait 1
Loop
End
Was ist falsch ?
Fehlermeldungen gint es nicht, aber wenn ich es auf dem Board habe tut sich nichts. (wenn Blatt, Wand,... vor dem Sensor ist)
Viele Grüße und vielen Dank im vorraus
Probiere es mal so:
$regfile = "m32def.dat"
$crystal = 16000000
$framesize = 32
$swstack = 32
$hwstack = 32
$baud = 9600
Dim Result As Word
Config Pinc.1 = Output
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Portc.1 = 0
Start Adc
Do
Portc.1 = 0
Result = Getadc(4)
If Result > 350 Then
Portc.1 = 1
End If
Wait 1
Loop
End
Eventuell musst du "Portc.1 = 0" in "Portc.1 = 1" ändern und andersherum.
jon
minium :)
26.11.2006, 18:50
Hallo,
wieso hast du denn Pina.0 nicht als eingang geschaltet, da ist nähmlich der Sensor ?
Viele Grüße
Hi,
wenn der Sensor an Pina.0 ist, musst du auch Getadc(0) schreiben. Schau dir mal die Pinbelegung des Mega32 an, dort stehen die jeweiligen Pins des ADC.
MfG
Du musst aber den ADC-Port nicht als Eingang festlegen.
Geht das Programm von mir denn so?
Musst natürlich den Sensor bei meinem Programm an Porta.5 anschließen. Sonst kann da nichts gehen.
jon
EDIT:Schau dir mal das Programm an: https://www.roboternetz.de/wissen/index.php/ADC_%28Avr%29
Da wird der ADC auch nicht als Input definiert.
Musst natürlich den Sensor bei meinem Programm an Porta.5 anschließen. Sonst kann da nichts gehen.
Getadc(4) ist aber Porta.4, nicht Porta.5.
MfG
Ja. Hast recht...
Hab da irgendwie Mist gebaut.
jon
minium :)
27.11.2006, 19:02
Hi, Danke
habe das Prog. geändert (statt 4 -> 0) jetzt funktioniert es, vielen Dank
Viele Grüße
Mal zu einem anderen Thread von dir:
Bei dem hier
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=24560&highlight=
gab es mittlerweile auch schon ein paar Antworten :)
Ist schon ein paar Tage her, aber du hast es wohl übersehen. Deswegen nochmal die Erinnerung an dich hier ;)
jon
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.