PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer, IR-Sensor !?!?!?!



minium :)
16.10.2006, 08: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

Jon
16.10.2006, 09:09
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, 10: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

Jon
16.10.2006, 10:32
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, 11: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

Jon
16.10.2006, 11:27
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, 11: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, 12: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

Jon
16.10.2006, 16:17
$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, 19: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

Jon
16.10.2006, 19:41
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, 19: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

Jon
16.10.2006, 19:51
$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, 20: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

Jon
16.10.2006, 20:04
$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

Michael
16.10.2006, 20:16
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

Jon
16.10.2006, 20:23
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

Michael
16.10.2006, 20:30
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, 20:53
Hi, vielen Dank,
jetzt habe ich ein funktionierendes Programm. Also vielen Dank für eure Hilfe.


Viele Grüße

minium :)
17.10.2006, 10: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, 14: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

Jon
26.11.2006, 17:26
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, 17:50
Hallo,

wieso hast du denn Pina.0 nicht als eingang geschaltet, da ist nähmlich der Sensor ?

Viele Grüße

coCo
26.11.2006, 17:54
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

Jon
27.11.2006, 13:30
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.

coCo
27.11.2006, 15:05
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

Jon
27.11.2006, 17:01
Ja. Hast recht...
Hab da irgendwie Mist gebaut.

jon

minium :)
27.11.2006, 18:02
Hi, Danke

habe das Prog. geändert (statt 4 -> 0) jetzt funktioniert es, vielen Dank

Viele Grüße

Jon
27.11.2006, 18:30
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