PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AtMega8 Analogen Eingang auslesen



gRaf-eny
21.04.2005, 12:59
http://www.bildfaenger-film.de/CC1.gif

Ich würde gerne den analogen Wert auslesen, der an den Ports Pc.0 Pc.1
anliegt.

An den Ports sollten je nach potie stellung zwischen 0 und 150 k ohm anliegen.

Wie muss ich den Port configurieren ?
Und wie dann auslesen?

----
2 Frage:
Wieso kann ich die Zahl 4.3 nich in eine Variable die als Single deklariert ist schreiben ? Was muss ich nehmen, damit es geht ?

uwegw
21.04.2005, 13:28
An den Ports sollten je nach potie stellung zwischen 0 und 150 k ohm anliegen.
nur spannung liegt an! und der strom fließt... aber was der widerstand macht ist mir nicht geläufig...


zeichne mal ein wie du dir das mit dem poti gedacht hast...

generell kann man mit dem adc nur spannungen messen! du müsstest also dein poti als spannungsteiler von 5V nach masse schalten und den schleifer an den avr anschließen...

zum programm: such in der bascom hilfe man nach config adc und getadc...

2.frage: das sollte normalerweise funktioneiren, und bei mir meckert der compiler auch nicht...


Dim A As Single
A = 4.3

gRaf-eny
21.04.2005, 14:32
zu2:



$crystal = 4000000
Config Portb = Output
Config Portc = Input
Config Portd = Output

Dim A As Single

A = 3.1 '[etwas gerades geht auch nicht mehr - in der schule gings, aber kriege es gerad nicht mehr hin... :( ]

Do

Portd.0 = 1
Portd.1 = 0
Portd.2 = 1
Portd.3 = 0

Portb.0 = 1
Portb.1 = 0
Portd.2 = 1
Portd.3 = 0

Waitms A

Portd.0 = 1
Portd.1 = 0
Portd.2 = 0
Portd.3 = 1

Portb.0 = 1
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1

Waitms A

Portd.0 = 0
Portd.1 = 1
Portd.2 = 0
Portd.3 = 1

Portb.0 = 0
Portb.1 = 1
Portb.2 = 0
Portb.3 = 1

Waitms A

Portd.0 = 1
Portd.1 = 1
Portd.2 = 1
Portd.3 = 0

Portb.0 = 1
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0

Waitms A

Loop



^^^
nur leider dreht sich der motor dann nicht :(

wenn man A durch 3.3 oder sowas ersetzt dreht er sich...
also irgendwie funktioniert das nicht :(
was mach ich falsch?

zu 1

http://www.bildfaenger-film.de/extern/voll.jpg

Bitte keine Bilder mit mehr als 640 Pixel direkt einbinden da Forumstruktur sonst verschoben wird! Habe es mal geändert.
Webmaster Frank

gRaf-eny
21.04.2005, 20:16
ach kommt schon.. was mache ich bei 2) falsch

uwegw
21.04.2005, 20:25
ach kommt schon.. was mache ich bei 2) falsch

komme schon...
aber was hängt nun eigentlich an den ports dran die du so hektisch hin und her schaltest? ein motortreiber?

kompiliert wird das ganze bei mir einwandfrei... bei dir auch? also nur keine reaktion darauf, oder ne fehlermeldung vom compiler?

wenn du den motor in verschieden richtungen drehen lassen willst sind die drei MILIsekunden wahrscheionlich etwas wenig... da kommt kein motor hinterher... drei sekunden, also waitms 3000, wäre wohl eher angebracht... oder soll das nen selbstgestrickter pwm werden?


edit: ich hab mal den simulator drüberlaufen lassen. ein waitms 3 läuft in deri milisekunden durch, aber bei waitms A hängt er sich weg...

nun habe ich A mal als integer deklariert: und schupps, schon läuft die kiste... die waitms funktion scheint nur ganzzahlen zu nehmen... genauer gesagt nen word, aber nen positiver integer geht auch...

gRaf-eny
21.04.2005, 21:15
ok danke!
mit integer geht es!

Was ich machen möchte?
Mit der X und Y achse eines gameport joysticks 2 Schrittmotoren steuen,
das ganze soll ein kameraschwenkkopf werden

im prinzip muss ich jetzt ja nur noch die stellung der poties auslesen,
dann den wert mit ner formel auf einen wert zwischen 1 und 10 bringen und diesen dann in der waitms funktion verwenden

Aber das auslesen schnall ich noch nicht ganz...



$crystal = 6000000
'
Config Portb = Output '
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Config Lcd = 16 * 2
Config Adc = Single , Prescaler = Auto

Dim Wert1 As Integer
Dim Wert2 As Integer

'1023 ganz Vorne
'520
'363

Do

Cls
Start Adc
Wert1 = Getadc(0 , 1)
Start Adc
Wert2 = Getadc(1 , 1)

Lcd Wert2
Lowerline

Lcd Wert2

Waitms 10

Loop

das geht jetzt zwar schon, aber irgenwie steht da 2 mal das gleiche... warum ??? ist nur die x achse nicht die y achse ?

programmier fehler ? oder karten fehler ?

Alter Knacker
21.04.2005, 23:02
.....das ganze soll ein kameraschwenkkopf werden


hrhr, zwei deppen, eine meinung :B

ok, ich verfolge deine posts und du meine und dann treffen wir uns auf ein paar bierchen *bfg*

mfg knacki

gRaf-eny
21.04.2005, 23:09
also links rechts testweise in 2 geschwindigkeiten geht schon...
aber hoch runter kann ich nich auslesen...

Wert1 = Getadc(0 , 1)
da mach ich was falsch

und

Wert1 = Getadc(0 , 1) = Wert1 = Getadc(1 , 0)

das ^^^kann doch auch nich sein ? ! - is aber so..

kann mir das bitte noch wer erklären ?

gRaf-eny
22.04.2005, 13:54
von euch scheint keiner den analogen eingang gut zu kennen, oder?
hab das problem immernoch :(

links recht geht super! jetzt richtig stufenlos !
aber hoch runter :( den port kann ich irgenwie nicht auslesen
(wäre portc.1 - adc1)

postet bitte eure ideen wieso das nicht geht!

uwegw
22.04.2005, 14:21
Wert1 = Getadc(0 , 1)
da mach ich was falsch

stimmt! in der klammer darf natürlich nur eine kanalnummer stehen!
und denk dran: die zählung der ad-kanäle fängt bei null an!
also einmal
x = getadc(0)
und dann
y= getadc(1)


und hast du schonmal sichergestellt dass die hardware überhaupt richtig läuft? also am eingang des megas mal die spannung messen und dabei am joystick rumbiegen...

gRaf-eny
22.04.2005, 15:32
cool danke
das war es natürlich, kann jetzt beide kanäle lesen!

das einzige was jetzt noch fehlt ist:

habe es bisher so gemacht

Do

ch0 lesen
sec = wert ch0 mal formel
motor mach nen step
waitms sec

loop

das geht so natürlich nicht wenn man 2 motoren ansteuern will

weil die sich ja in unterschiedlichen geschwindigkeiten drehen sollen
und daher die vorgänge nebeineinander ablaufen sollten :)

^^ ich werd mal gucken ob bascom timer hat, und probieren dann 2 timer (jeder für einen motor) und dann in der loop nur den intervall beider timer ändern ... mal sehen ob das geht...

wenn wer ne bessere / andere idee hat wäre ich auch hier dankbar

gRaf-eny
22.04.2005, 17:27
Ich verdeutliche das ganze nochmal mit meinem code:



$crystal = 6000000
Config Portb = Output
Config Portc = Input
Config Portd = Output
Config Portd.6 = Input
Config Portd.7 = Input

Config Adc = Single , Prescaler = Auto

Dim Xstandart As Integer
Dim Ystandart As Integer
Dim Xwert As Integer
Dim Ywert As Integer
Dim A As Integer
Dim B As Integer
Dim Minmove As Integer
Dim Xdirectionf As Integer
Dim Ydirectionf As Integer
Dim Xtime As Integer
Dim Ytime As Integer


Start Adc
Xstandart = Getadc(1)
Start Adc
Ystandart = Getadc(0)


Xtime = 0
Ytime = 0
Minmove = 21
A = 1
B = 1
Do
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Start Adc
Xwert = Getadc(1)

If Xwert < Xstandart Then
A = Xstandart - Xwert
A = 160 - A
A = A / 10
Xdirectionf = 1
If A < 1 Then
A = 1
End If
Elseif Xwert > Xstandart Then
A = Xwert - Xstandart
A = 250 - A
A = A / 10
Xdirectionf = 0
If A < 1 Then
A = 1
End If
End If
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
Start Adc
Ywert = Getadc(0)

If Ywert < Ystandart Then
B = Ystandart - Ywert
B = 140 - B
B = B / 10
Ydirectionf = 1
If B < 1 Then
B = 1
End If
Elseif Ywert > Ystandart Then
B = Ywert - Ystandart
B = 300 - B
B = B / 10
Ydirectionf = 0
If B < 1 Then
B = 1
End If
End If
'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
'XXXXX --- MOVE --- XXXXXXXXXXXXXX
If A < Minmove Then

If Xdirectionf = 1 Then

Xtime = Xtime + 1

If Xtime = 5 Then
Xtime = 1
End If

If Xtime = 1 Then
Portb.0 = 1
Portb.1 = 0
Portb.2 = 1
Portb.3 = 0
Elseif Xtime = 2 Then
Portb.0 = 1
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
Elseif Xtime = 3 Then
Portb.0 = 0
Portb.1 = 1
Portb.2 = 0
Portb.3 = 1
Elseif Xtime = 4 Then
Portb.0 = 0
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
End If

Else

Xtime = Xtime + 1

If Xtime = 5 Then
Xtime = 1
End If

If Xtime = 1 Then
Portb.0 = 1
Portb.1 = 0
Portb.2 = 1
Portb.3 = 0
Elseif Xtime = 2 Then
Portb.0 = 0
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Elseif Xtime = 3 Then
Portb.0 = 0
Portb.1 = 1
Portb.2 = 0
Portb.3 = 1
Elseif Xtime = 4 Then
Portb.0 = 1
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
End If

End If

Waitms A '<<<< PROBLEM! B + A vvv = Für beide Motoren die gleiche, zu lange wartezeit

End If
'XXXXX --- MOVE --- XXXXXXXXXXXXXX
'YYYYY --- MOVE --- YYYYYYYYYYYYYY
If B < Minmove Then

If Ydirectionf = 1 Then

Ytime = Ytime + 1

If Ytime = 5 Then
Ytime = 1
End If

If Ytime = 1 Then
Portd.0 = 1
Portd.1 = 0
Portd.2 = 1
Portd.3 = 0
Elseif Ytime = 2 Then
Portd.0 = 1
Portd.1 = 0
Portd.2 = 0
Portd.3 = 1
Elseif Ytime = 3 Then
Portd.0 = 0
Portd.1 = 1
Portd.2 = 0
Portd.3 = 1
Elseif Ytime = 4 Then
Portd.0 = 0
Portd.1 = 1
Portd.2 = 1
Portd.3 = 0
End If

Else

Ytime = Ytime + 1

If Ytime = 5 Then
Ytime = 1
End If

If Ytime = 1 Then
Portd.0 = 1
Portd.1 = 0
Portd.2 = 1
Portd.3 = 0
Elseif Ytime = 2 Then
Portd.0 = 0
Portd.1 = 1
Portd.2 = 1
Portd.3 = 0
Elseif Ytime = 3 Then
Portd.0 = 0
Portd.1 = 1
Portd.2 = 0
Portd.3 = 1
Elseif Ytime = 4 Then
Portd.0 = 1
Portd.1 = 0
Portd.2 = 0
Portd.3 = 1
End If

End If

Waitms B '<<<< PROBLEM! B + A^^^= Für beide Motoren die gleiche, zu lange wartezeit

End If
'YYYYY --- MOVE --- YYYYYYYYYYYYYY

Loop

teslanikola
22.04.2005, 17:36
kann das sein, das a = 4.3 ist und du die dan als variable im Waitms nimmst, das macht der Compiler nicht mit, man kann nur ganzzahlen warten, wenn du unbedingt 4.3 ms warte willst dan rechne se in µSek.
4.3 ms = 4300µSek.
Waitu 4300

gRaf-eny
22.04.2005, 18:15
hehe, ne das warten funktionier schon

Weiß nich genau wie das Problem beschreiben soll :(

Es gibt nen X motor und nen Y motor
nen X potie und nen Y potie

momentan funktinieren beide motoren wenn man nur EINEN potie zur zeit aus der Nullstellung bringt

wenn man beide poties bewegt drehen sich die motoren gleich schnell und extrem langsam - weil beide warte zeiten hintereinander geschaltet werden :(

Also vielleicht versteht ihr es so ^^ oder wenn ihr den code da oben (den letzten) durchgeht

gRaf-eny
24.04.2005, 20:17
versteht ihr wenigstens mein problem ?

Alter Knacker
24.04.2005, 20:20
versteht ihr wenigstens mein problem ?
bringt dir zwar nix, aber ich verfolge das ganze natürlich - bin bloss hardwaremässig noch nicht soweit, um da mitmachen zu können.
mfg knacki

Marco78
24.04.2005, 20:52
Ich glaube, ich verstehe dein Problem, aber nicht wie die Lösung aussehen soll.

Du hast 2 Motoren und ein Joystick? Der Joystick soll die beiden Motoren so drehen wie du den Joystick bewegst?

Dein Code hat leider etwa wenig Kommentare und bedarf etwas mehr Nachdenken um ihn zu verstehen :( Wie werden denn die Motoren angetrieben? Das ganze sieht auf dem ersten Blick etwas binär aus ;)

Wofür sind die waitms? Und wie soll sich A und B errechnen?

Das sind erstmal meine Fragen die mir zum Verständnis fehlen.
Wenn ich nach den Antworten alles nachvollziehen kann, werd ich morgen Abend mal versuchen was zu schreiben. Sofern das Problem bis dahin noch nicht gelöst ist.

gRaf-eny
24.04.2005, 22:34
Ja richtig, wenn ich den Joystick nach links drücke soll sich motor 1 nach links drehen - wenn ich den Js weit nach links drücke soll sich motor 1 schneller nach links drehen (das gleiche rechts)

wenn den joystick nach oben drücke soll sich motor 2 nach links drehen,
entsprechend weitwer nach oben drücken - schneller

einzelnt ( also nur eine achse vom joystick benutzen) funktioniert es mit dem code ^^^ schon

----

die wait ms benutze ich momentan folgend:

eine motor umdrehung besteht aus 4 schritten
zwischen jedem schritt wartet der motor kurz (A für Motor 1 B für Motor 2)

umsoweiter ich den joystick in eine richtung bewege -> umsokleiner wird die anzahl der sekunden der wartephase -> umsoschneller dreht der motor

Jeder motor ( x achse / y achse ) müsste in einem selbständigen loop, parallel zum anderen, laufen, damit nicht die wartezeit von motor 1 die wartezeit von motor 2 beinflusst


Momentan sieht es so aus:

Do

Motor x dreht sich
Wartet A sekunden (durch den potie der x achse vom joystick errechnet)

Motor y dreht sich
Wartet B sekunden ( durch den potie der y achse vom joystick errechnet)

Loop

das heißt, dass nach dem warten von motor x sich erst motor y dreht, dann die wartezeit von motor y kommt und sich erst dann wieder motor x dreht -> warte zeit x -> motory -> wartezeit y -> ....

Es muss aber so aussehen:

motor x dreht
wartet A
motor x dreht
wartet A
motor x dreht
wartet A
motor x dreht
wartet A


und NEBENHER

motor y dreht
wartet B
motor y dreht
wartet B
motor y dreht
wartet B
motor y dreht
wartet B
motor y dreht
wartet B
motor y dreht
wartet B

und während das passiert muss auch noch ständig die potiestellung des joysticks ausgelesen werden und dann aus den gewonnen werten die neu wartezeit A, B errechnet werden

^----------
hehe, also ich hoffe es ist jetzt klarer > besser kann ich es nicht erklären...

vielleicht ist mein ansatz auch schon total falsch!?

2 Schrittmotoren müssen sich in stufenlosen geschwindigkeiten in beide richtungen drehen lassen:

Der Joystick liefert in nullstellung folgende werte:
X-Achse: 560
Y-Achse: 560

Der erste Vollauschlag der Achse
X-Achse: 330
Y-Achse: 330

Der andere Vollausschlag der Achse
X-Achse: 1023
Y-Achse: 1023



$crystal = 6000000
Config Portb = Output
Config Portc = Input
Config Portd = Output
Config Portd.6 = Input
Config Portd.7 = Input

Config Adc = Single , Prescaler = Auto

Dim Xstandart As Integer
Dim Ystandart As Integer
Dim Xwert As Integer
Dim Ywert As Integer
Dim A As Integer
Dim B As Integer
Dim Minmove As Integer
Dim Xdirectionf As Integer
Dim Ydirectionf As Integer
Dim Xtime As Integer
Dim Ytime As Integer


Start Adc
Xstandart = Getadc(1) ' Der X-Achsen Wert des Joysticks wird ausgelesen (Die Nullstellungs Wert [sollte zwischen 500 und 600 liegen])
Start Adc
Ystandart = Getadc(0) ' Der Y-Achsen ...^^


Xtime = 0 ' (eine Umdrehung Des Motors Besteht Aus Vier Schritten - Variable Dient Dazu , Zu Wissen Welcher Schritt Gerade Dran Ist)
Ytime = 0 ' ^^
Minmove = '21 Die Minimal Wert , Bei Dem Sich Der Motor Anfängt Zu Drehen(um Die Nullstellung Des Joysticks Zu Vergrössern)
A = 1
B = 1
Do
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Start Adc
Xwert = Getadc(1) ' X Potie wird gelesen (je nach stellung 330 -> 1023)

If Xwert < Xstandart Then 'wenn der gelesene wert kleiner als die nullstellung ist (also der joystick nach links gedrückt wurde)
A = Xstandart - Xwert
A = 160 - A
A = A / 10
Xdirectionf = 1 'hier wird die drehrichtung festgelegt (da in A nur die wartezeit (nicht die richtung) geschrieben wird)
If A < 1 Then 'damit die anzahl die milisekunden nicht unter 1 geht (der motor kann nicht schneller drehen als einen schritt pro ms)
A = 1
End If
Elseif Xwert > Xstandart Then 'wenn der gelesene wert größer als die nullstellung ist (also nach rechts)
A = Xwert - Xstandart
A = 250 - A
A = A / 10
Xdirectionf = 0 ' ^^
If A < 1 Then 'damit die anzahl die milisekunden nicht unter 1 geht (der motor kann nicht schneller drehen als einen schritt pro ms)
A = 1
End If
End If
'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
Start Adc
Ywert = Getadc(0)

If Ywert < Ystandart Then 'wenn der gelesene wert kleiner als ns -> joystick nach oben
B = Ystandart - Ywert
B = 140 - B
B = B / 10
Ydirectionf = 1 '^^
If B < 1 Then 'damit die anzahl die milisekunden nicht unter 1 geht (der motor kann nicht schneller drehen als einen schritt pro ms)
B = 1
End If
'#############################
'Durch Diese Rechnung ^ ^ ^ Wird Bei Allen Joystick Ausschlägen(potie 330 Bis 1023
'Eine Anzahl von milisekunden errechnet:
'bei joystick nullstellung ca 30 ms
'bei joystick vollausschlag 1 ms
'damit der motor sich in nullstellung nicht auch schon (auch wenn sehr langsam) dreht
'habe ich die minmove variable die weiter unten abgefragt wird
'#############################
Elseif Ywert > Ystandart Then 'wenn der gelesene wert größer als ns --> joystick nach unten
B = Ywert - Ystandart
B = 300 - B
B = B / 10
Ydirectionf = 0 '^^
If B < 1 Then 'damit die anzahl die milisekunden nicht unter 1 geht (der motor kann nicht schneller drehen als einen schritt pro ms)
B = 1
End If
End If
'YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
'XXXXX --- MOVE --- XXXXXXXXXXXXXX
If A < Minmove Then 'wenn der A wert kleiner ist als die minmove variable dann dreht sich der motor:

If Xdirectionf = 1 Then 'wenn die richtung = 1 ist : folgen die ausgänge für den motor sich links zu drehen

Xtime = Xtime + 1

If Xtime = 5 Then
Xtime = 1
End If

If Xtime = 1 Then
Portb.0 = 1
Portb.1 = 0
Portb.2 = 1
Portb.3 = 0
Elseif Xtime = 2 Then
Portb.0 = 1
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
Elseif Xtime = 3 Then
Portb.0 = 0
Portb.1 = 1
Portb.2 = 0
Portb.3 = 1
Elseif Xtime = 4 Then
Portb.0 = 0
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
End If

Else 'wenn die richtung = 0 ist : folgen die ausgänge für den motor sich rechts zu drehen

Xtime = Xtime + 1

If Xtime = 5 Then
Xtime = 1
End If

If Xtime = 1 Then
Portb.0 = 1
Portb.1 = 0
Portb.2 = 1
Portb.3 = 0
Elseif Xtime = 2 Then
Portb.0 = 0
Portb.1 = 1
Portb.2 = 1
Portb.3 = 0
Elseif Xtime = 3 Then
Portb.0 = 0
Portb.1 = 1
Portb.2 = 0
Portb.3 = 1
Elseif Xtime = 4 Then
Portb.0 = 1
Portb.1 = 0
Portb.2 = 0
Portb.3 = 1
End If

End If

Waitms A '<<<< PROBLEM! B + A vvv = Für beide Motoren die gleiche, zu lange wartezeit

End If
'XXXXX --- MOVE --- XXXXXXXXXXXXXX
'YYYYY --- MOVE --- YYYYYYYYYYYYYY
If B < Minmove Then

If Ydirectionf = 1 Then '^^

Ytime = Ytime + 1

If Ytime = 5 Then
Ytime = 1
End If

If Ytime = 1 Then
Portd.0 = 1
Portd.1 = 0
Portd.2 = 1
Portd.3 = 0
Elseif Ytime = 2 Then
Portd.0 = 1
Portd.1 = 0
Portd.2 = 0
Portd.3 = 1
Elseif Ytime = 3 Then
Portd.0 = 0
Portd.1 = 1
Portd.2 = 0
Portd.3 = 1
Elseif Ytime = 4 Then
Portd.0 = 0
Portd.1 = 1
Portd.2 = 1
Portd.3 = 0
End If

Else '^^

Ytime = Ytime + 1

If Ytime = 5 Then
Ytime = 1
End If

If Ytime = 1 Then
Portd.0 = 1
Portd.1 = 0
Portd.2 = 1
Portd.3 = 0
Elseif Ytime = 2 Then
Portd.0 = 0
Portd.1 = 1
Portd.2 = 1
Portd.3 = 0
Elseif Ytime = 3 Then
Portd.0 = 0
Portd.1 = 1
Portd.2 = 0
Portd.3 = 1
Elseif Ytime = 4 Then
Portd.0 = 1
Portd.1 = 0
Portd.2 = 0
Portd.3 = 1
End If

End If

Waitms B '<<<< PROBLEM! B + A^^^= Für beide Motoren die gleiche, zu lange wartezeit

End If
'YYYYY --- MOVE --- YYYYYYYYYYYYYY

Loop

Marco78
25.04.2005, 19:44
Jetzt bin ich voll im Bilde (denke ich).

Ich würd sowieso erstmal Config ADC = Free wählen. Damit wirden alle Messungen nach der ersten schneller ausgeführt. Wirkt sich zwar nicht auf dein Problem aus, aber ist irgendwo praktischer.
Danach gleich Start ADC. Der muss nicht vor jede Abfrage gestartet werden. Besonders nicht wenn er nicht gestoppt wurde. Aber ich denke, das ignoriert BASCOM schon von alleine.

Ein Programm habe ich noch nicht geschrieben. Ich komm grade von der Arbeit und hab da jetzt nicht mehr so viel Lust zu, Sorry. Aber ein paar Denkanstöße helfen evtl?!

Für X und Y hast du im Prinzip jeweils ein Programmteil. Ich würde die beide zusammenmischen.
Also das beide Richtungen am JS abgefragt werden und dann für beides gleich die Berechnungen durchgeführt werden.
Und dann kommt der eigentliche Knackpunkt.
Jede Richtung alleine funktioniert ja so wie du es haben willst. Nur die Wartezeiten im Programm sind die, die stören.
In der Zeit macht der Prozessor ja auch nix anderes als für X ms nichts ausführen. In der Zeit könnte er ja schonmal den anderen Motor bewegen.

Ich habe heute morgen um kurz nach 5 noch dein Beitrag gelesen und hatte etwas Zeit drüber nachzudenken.

Zwei Lösungsmöglichkeiten seh ich da auf anhieb. Eine aufwendiger als die andere :D
Die dritte wäre gewesen jeweils ein (kleineren) AVR für X und Y nehmen.

Die 1. ist:
In der waitms-Phase wartet der AVR brav. Das muss geändert werden.

Jetzt beim Schreiben kommt mir noch ne andere Idee, die ich noch besser finde ;)

Alle 10ms ein Interrupt ausführen.
In der ISR eine Variable hochzählen lassen. Anhand des Werts weisst du dann, wieviele ms schon vorbei sind. Wenn beide Aktionen ausgeführt sind, die Variable wieder auf 0 setzen. Oder besser gesagt, dann auf 0 setzen, wenn die nächste Aktion ansteht.
Das Problem mit den Richtungen und unterschiedlichen Geschwindigkeiten pro Richtung in Anhänigkeit wie stark man den JS biegt hast du ja im Griff. Da will ich mich jetzt nicht weiter reindenken.
Wenn z.B. eine Pause für X 100ms sein soll und die für Y 200ms, dann X so lange bewegen bis der Zähler auf 10 steht. Wenn er über 10 ist nix weiter nachen. Und Y bis 20 bewegen. Dan sind es etwas mehr als 100ms und 200ms, weil das Aufrufen der ISR auch etwas Zeit benötigt, aber die Zeit bis der Interrupt ausgelöst wird kann man ja anpassen wenn es so nicht optimal ist.

So, müsste ich das jetzt lesen was ich geschrieben habe, würd ich es als ausenstehender nicht verstehen ;)

Die Kurzfassung:

Ein Timer programmieren, der alle 10 ms (oder besser den höchsten gemeinsamen Teiler der gewünschten Pausenzeiten) auslöst.
Wenn der JS bewegt wird, den Timerinterrupt aktivieren.
In der ISR eine Variable hochzählen.
Mit der Variable die Schritte für X und Y durchführen.
Wenn X und Y fertig sind, die Variable auf 0 setzen und den Timerinterrupt deaktivieren.

Ich hoffe ich habe da jetzt kein Denkfehler drin!

gRaf-eny
26.04.2005, 16:59
mhh ^^ habs bisher nur teilweise verstanden... aber werds noch ein paar mal lesen...
dabei ist mir aber selbst schon was eingefallen (glaub ich)
dazu müsste ich aber eine Sub haben

Also

Do
blablabla
blablabla
Sub Motor Drehdich
blabalaba
blablabla
bla
Sub Motor Drehdich

Do

(Ansonsten wäre es verdammt viel zu schreiben...)
Weiß wer wie das geht?

gRaf-eny
27.04.2005, 14:26
^^ Declare Sub Test

Do
Call Test
Loop

Sub Test()
A=X
End Sub

kann jetzt leider nicht weitermachen... die demo ist voll :(
jetzt brauch ich ne bessere idee oder vollversion
oder beides ;)