PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fernbedienung über RS232 mit komischem Verhalten



JollyJumper
13.11.2011, 20:00
Hallo ihr da draußen,

ich habe mich mal wieder dran gemacht mein Hobby etwas voranzutreiben. Nun ist es so, ich habe mein Roboterchassie fertig und habe nun alle Elektronik aufgeschraubt. Ich steuer über ein mega128Funk Board, das klappt soweit hervoragend. Schon fast verwunderlich das alles ohne ein Problem.
Ich habe zum Test erstmal eine simple, manuelle Steuerung über die Nummerntasten programmiert. Das alles mit einer Casestruktur. Das sieht dann so aus:


$regfile = "m128def.dat" ' Bei Mega 128 "
$framesize = 64
$swstack = 64
$hwstack = 64
$crystal = 16000000
$baud = 19200
$baud1 = 9600
'----------------------Motortreiber Konfiguration--------------------------------
Config Ping.1 = Output
Led_rot Alias Portg.1

Config Ping.0 = Output
Led_gruen Alias Portg.0

Config Pinb.4 = Output
Motorboard_richtung1 Alias Portb.4

Config Pinb.5 = Output
Motorboard_richtung2 Alias Portb.5

Config Pina.1 = Output
Motorboard_reset Alias Porta.1

Config Pine.3 = Output
Motorboard_pwm1 Alias Porte.3

Config Pine.4 = Output
Motorboard_pwm2 Alias Porte.4

'----------------------Funksender & Empfänger Konfiguration--------------------------------
Config Ping.0 = Output
Lcdpower Alias Portg.0

Config Portc = Output

Config Pine.2 = Output
Rdy_hostempfangsbereit Alias Porte.2 'Auf Low setzen wenn Empfangsbereit für Daten vom Funkmodul
Config Pine.5 = Input
Bsy_funkmodulsendebereit Alias Porte.5 'Ist Low wenn Funkmodul frei zum senden

Open "com2:" For Binary As #2 'Ausgabe über zweite serielle Schnittstelle (MAX)
Sound Portg.2 , 400 , 450 'BEEP bei RN-Mega128Funk
Sound Portg.2 , 400 , 250 'BEEP bei RN-Mega128Funk
Sound Portg.2 , 400 , 450 'BEEP bei RN-Mega128Funk
Config Serialin = Buffered , Size = 2 'Empfangsbuffer für Funkmodul anlegen
Config Serialout1 = Buffered , Size = 100 'Ausgabebuffer für normalse RS232
Enable Interrupts

Config Timer3 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8

'--- Eigentliches Programm ---

Dim P As Word
Dim Empfang As Byte
Motorboard_reset = 1
Rdy_hostempfangsbereit = 0

Do
Empfang = Inkey()

Select Case Empfang

Case 56
Motorboard_reset = 1
Motorboard_richtung1 = 0
Motorboard_richtung2 = 1
Bsy_funkmodulsendebereit = 0
Print "Eingabe 8"
Pwm3b = 750
Pwm3a = 750

Case 53
Motorboard_reset = 1
Bsy_funkmodulsendebereit = 0
Print "Eingabe 5"
Pwm3b = 0
Pwm3a = 0

Case 50
Motorboard_reset = 1
Motorboard_richtung1 = 1
Motorboard_richtung2 = 0
Bsy_funkmodulsendebereit = 0
Print "Eingabe 2"
Pwm3b = 750
Pwm3a = 750

Case 52
Motorboard_reset = 1
Motorboard_richtung1 = 0
Motorboard_richtung2 = 0
Bsy_funkmodulsendebereit = 0
Print "Eingabe 6"
Pwm3b = 750
Pwm3a = 750

Case 54
Motorboard_reset = 1
Motorboard_richtung1 = 1
Motorboard_richtung2 = 1
Bsy_funkmodulsendebereit = 0
Print "Eingabe 4"
Pwm3b = 750
Pwm3a = 750

Case 55
Motorboard_reset = 1
Motorboard_richtung1 = 1
Motorboard_richtung2 = 0
Bsy_funkmodulsendebereit = 0
Print "Eingabe 4"
Pwm3b = 0
Pwm3a = 750

Case 57
Motorboard_reset = 1
Motorboard_richtung1 = 1
Motorboard_richtung2 = 0
Bsy_funkmodulsendebereit = 0
Print "Eingabe 4"
Pwm3b = 750
Pwm3a = 0

End Select

Waitms 150

Loop
End




Wenn ich nun die Steuerung durchführe muss ich die Tasten immer zweimal drücken damit beide Motoren abschalten oder laufen. Wenn ich nur einmal z.B. die 8 drücke, zum vorwerts fahren, fängt erst ein Motor an zu laufen, drücke ich nochmal die 8, dann dreht auch der Zweite. Ich habe nun schon einen Tag damit verbracht herrauszufinden warum, aber ich komm nicht drauf. Es ist auch total unlogisch da die Anweisung in einem Case steht. Ich kann mir nur vorstellen, dass das ein Timming Problem ist. Kennt wer diesen Effekt und kann mit weiterhelfen.

MfG Jolly

BMS
13.11.2011, 20:14
Hallo,
das hört sich aber eigenartig an.
Wie weit kommt denn die Programmausführung voran innerhalb eines Case, also wird z.B. das Print "Eingabe..." ausgegeben?
Wieso hast du oben im Programm Interrupts aktiviert?
An deiner Stelle würde ich das Select Case... vorläufig umbauen in if, else if, ... um zu sehen ob der Fehler mitwandert.
Fehler in der Elektronik kannst du ausschließen, oder? Konntest du die Motoren zuvor bereits einwandfrei ansteuern?
;)
Grüße,
Bernhard

JollyJumper
13.11.2011, 21:57
So ich habe jetzt noch mal Printbéhele zu jeden Programmpunkt eines Casefalls zugeführt. Diese werden sobald ich einmal die z.B. 8 eingebe komplett ausgeführt.
Also der Boardaufbau ist zu 100%er Sicherheit korrekt und zum Punkt Interrups, diese habe ich aus dem Beispelprogramm übernommen. Wenn ich den Befehl entnehme funktioniert das Ganze nicht mehr. Hmmm ich komm nicht weiter. Ist sehr sehr merkwürdig.

peterfido
14.11.2011, 08:04
Ich würde testhalber mal eine kleine Pause (z.b. 4 NOP) zwischen die pwmx Anweisungen setzen. Wie reagiert es, wenn Du beide Werte zweimal zuweist? (Nur als Test). Oder halt direkt an Mark Albers wenden. Er ist meist recht fix mit Antworten.

JollyJumper
14.11.2011, 20:39
Soooo endlich daheim von der laaaaangen Arbeit heute. Hab mich gleich mal dran gesetzt und ein paar Sachen ausprobiert.
Wenn ich eine Pause zwischen den Befehlen einfüge, bleib der Effekt das Gleiche. Ich muss jeden Befehl zweimal eintippen. Ach noch was zu dem Fehler, wenn ich zum Beispiel Vorwärts anklicke fährt eine Seite wie geplant mit volldampf und die andere nur mit halber Kraft. Drücke ich dann Stop bleibt die mit halber Kraft stehen und die andere Seite regelt von voller auf halbe Kraft herunter. Nochmal getippt und es bleibt alles stehen. ?!?! Wie auch immmer

Ich habe jetzt aber den Befehl mal so umgeschrieben:



Case 56
Motorboard_reset = 1
Motorboard_richtung1 = 0
Motorboard_richtung2 = 1
Bsy_funkmodulsendebereit = 0
Print "Eingabe 8"
Pwm3b = 750
Pwm3a = 750
Pwm3b = 750
Pwm3a = 750
Print "Eingabe 8 nochmal"

und siehe da es klappt! Aber warum. Schön ist das nicht! Vieleicht doch nenn Hardwareseitiges Problem ? Hat noch wer eine Idee?

peterfido
15.11.2011, 15:51
Da würde ich mal mit Mark Albert Kontakt aufnehmen. Ein Versuch würde mich noch interessieren: Was passiert, wenn Du die Werte nicht direkt sondern per Variable zuweist?

Wert=750
pwm3a=wert
pwm3b=wert

Edit:
Welche Version von Bascom nutzt Du?
Die Werte werden in 2 Schritten als 2 Byte (Hi und Lo) ins Register geschrieben. Wenn dann nur ein Wert übernommen wird, erklärt das die halbe Kraft. Könnte also ein Compiler Fehler sein. In den Optionen mal die Optimierung abgeschaltet? Was passiert, wenn Du nur 8Bit Werte nutzt?

JollyJumper
15.11.2011, 22:08
Hallo peterfido,

also ich habe gestern noch genau diesen Fall ausprobiert:

Ich habe eine Variable gebildet Speed als Integer und habe dieser den Wert 1000 zugewiesen. Diese habe ich dann an die Pwm3a und Pwm3b übergeben. Jedoch ohne Erfolg der Fehler bestand weiterhin.

Der die Funktion Optimize im Compiler ist abgeschaltet aber auch da egal ob an oder aus, der Fehler bleibt bestehen.

Ich nutze die Bascomverision 1.11.9.5

Und auch mit 8Bit Werten, der Effekt bleibt der Gleiche. Leider

:) Verzwigt und Verzwackt, dennoch danke ich dir für die Anregungen.

peterfido
16.11.2011, 14:44
Da rate ich erstmal zur Aktualisierung von Bascom. Seit Deiner Version ist vieles passiert.