PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrere Servos parallel steuern ATMega8



stardust19322
01.10.2014, 22:28
Hallo Freunde.

Ja - ich mal wieder ^^.

Ich sitze noch immer an dem Problem, dass ich mehrere Servos gleichzeitig ansteuern will. Es handelt sich dabei um 2 Servos, die per Tastendruck nichts anderes machen sollen, als von einem Anschlag zum anderen Anschlag zu fahren, beim 2ten Tastendruck dann wieder zurück.

Dazu habe ich ein Testprogramm mit einer weiteren Stellung zum Funktionstest der PWM-Ausgabe erstellt.
Im Single-Modus funktioniert es wunderbar - fährt bei Tastendruck die 3 konfigurierten Stellungen an (Linker Anschlag, Mitte, rechter Anschlag).

Sobald ich aber ein 2tes Servo dazu konfiguriere, spinnt das erste rum:
Die "Grundstellung" hält es wunderbar. Lasse ich das Servo jedoch auf die anderen beiden Stellungen fahren, fährt es in etwa in dessen Richtung, zuckt dann aber sehr wild herum und bleibt in der Position auch nicht stehen. Erst wenn ich per Tastendruck wieder den Hilfsmerker (Merker M1) auf Null gesetzt habe, steht das Servo wieder brav und still in Grundstellung - ohne zu Mucken und Zucken.

Hier dazu der Programmablauf:


$regfile = "m8def.dat"
$crystal = 8000000


'Konfiguriere I/O-Ports

Config Portb.0 = Output
Config Portb.1 = Output
Config Pind.0 = Input
Config Pind.1 = Input


'Konfiguriere Variablen

Dim A As Long
Dim B As Long
Dim M1 As Byte
Dim M2 As Byte
Dim Pos As Long
Dim Var As Long


M1 = 0
Pos = 1250 'Servo 1 in Startposition bringen - rechter Anschlag als Grundstellung
Var = 1250 ' Servo 2 in Startposion bringen - rechter Anschlag als Grundstellung



' *** Hauptprogramm ***

Do


For A = 1 To 100
Pulseout Portb.0 , A , Pos 'Pulsausgabe durch Variable "A" an PB.0, Signallänge ermittelt aus Wert "Pos"
Next

For B = 1 To 100
Pulseout Portb.1 , B , Var 'Pulsausgabe durch Variable "B" an PB.1, Signallänge ermittelt durch Wert "Var"


Debounce Pind.0 , 0 , Sub_taster1 , Sub 'Entprellter Tastereingang PD.0, dadurch Nebenlaufendes Programm (außerhalb der Do-Loop)


Loop


' *** Unterprgramme(e) ***

Sub_taster1:

If Pind.0 = 0 Then 'Wenn Taster gedrückt, dann
Incr M1 'Erhöhe Merker M1 um 1
End If

If M1 = 1 Then 'Wenn M1 den Wert 1 erreicht hat
Pos = 1250 'Fahre Servo auf Anfangsposition -
End If
If M1 = 2 Then ' Wenn M1 auf Wert 2, dann...
Pos = 2900 '... Fahre Servo in Mittelstellung
End If
If M1 = 3 Then ' Wenn M1 den Wert 3 erreicht aht, dann...
Pos = 4550 ' Fahre Servo auf linken Anschlag
M1 = 0 'setze den Merker auf Null - Servo bleibt in der Position, bis erneuter Tastendruck erfolgt
End If


Return

Dadurch, dass das Servo bereits beim Reinschreiben des 2ten "Pulseout"-Befehls herum spinnt, brauchte ich das Servo bislang noch nicht einmal aufrufen und zum Bewegen animieren.


Hat jemand eine Idee, wie ich das 2te Servo zum präzisen Arbeiten bekomme?
Der Befehl "Servo" in Bascom funktioniert zwar, ist mir jedoch nicht zuverlässig genug. Bei mehr als einem Servo und längerem Programmcode fährt sich der Controller gerne mal fest und schickt das Servo an den Endanschlag - bleibt dann dort aber auch stur stehen, bis ich den Controller neu starte.


Als 2ten Punkt:

Ist es möglich, gleichzeitig ein Servo anzusteuern und auf einem anderen Port ein PWM-Signal einzulesen?
In einem ersten Versuch funktionierte das Laufen des Servos (Single-Modus, also nur eines) tadellos und auch der PWM-Input wurde richtig ausgewertet, jedoch "flackerte" der LED-Ausgang im Low sehr stark, auf High gesetzt blieb er weitestgehend flackerfrei eingeschaltet.

Wer Ideen hat - bitte melden.


LG - Maik

hbquax
02.10.2014, 06:06
Wenn zwei Servos exakt das gleiche und zur selben Zeit tun sollen, kann man sie einfach komplett parallel schalten, d.h. an einen Signalausgang.

HeXPloreR
02.10.2014, 12:03
Hallo,also erst einmal fehlt bei der zweiten for-next Schleife das next. Und dann sieht es so aus als wenn in eine Richtung fahren soll so lange du den Taster drückst. Das Problem der festfahrens in deiner ISR könntest Du abstellen indem Du eine Abfrage einbaust die schaut was passieren soll wenn der Zähler auf >3 steht. Schau doch mal über z.B. ein Terminal nach was genau fü reinen Wert der Zähler im Fehlerfall hat. Viele Grüße Jörg

stardust19322
02.10.2014, 18:06
Hallo und danke schon mal für die Antworten.

Nein, die ISR fährt sich nicht "fest", denn ich kann trotzdem noch beide Servos verstellen bzw. der Controller reagiert auf Tastendruck. Nur scheinen sich die "PWM-Signale" zu überlagern, dass das Servo so stark um den gesetzten Zielpunkt so stark zittert.
Das Festfahren geschieht immer nur, wenn ich 2 Servos mit dem Befehl "Servo" ansteuere und den Controller durch verschiedene Tastendruck-Verhalten unterschiedlich stark belaste. Dann kippt er irgendwann. Bin mir aber auch nicht sicher, ob es vielleicht an der Spannungsversorgung des Boards liegen kann. Beide Servos versorge ich nämlich durch das Eva-Board und wenn beide Servos laufen, zieht das schon ein wenig mehr Strom.

Dass jetzt ein "Next" fehlt, ist nur ein Schönheitsfehler. War schon arg spät gestern. Das Original war für 2 Servos gedacht und ich hab es später wieder auf den Single-Modus reduziert. Damit ihr euch ein Bild machen könnt, hab ich den Rest noch mal hinzu geschrieben und das next vergessen.


Hast du vielleicht noch eine Idee, wie ich mit einem Controller die Servos zum Laufen bringe, gleichzeitig aber noch die PWM-Eingänge abfrage?
Geht das besser mit der Abfrage durch einen Timer/Counter oder mit der Pulsein-Routine? Wenn ich Pulsein nutze, flackert der gesetzte Ausgang ziemlich stark, obwohl er Low sein sollte. Scheint mit dem Pulseout des Servos zusammen zu hängen - warum auch immer.


LG - Maik


LG - Maik

HeXPloreR
02.10.2014, 19:56
Hast Du schon überprüft ob der mega wirklich mit 8MHz läuft? (einfacher 1Hz LED-Blinker).

Ich frage mich grade warum du die LED überhaupt mit einem PWM ansteuerst? Könnte man den Pin nicht als IO benutzen, wenn es die Anwendung zu lässt ... ansosnten könnte es am Takt des mega liegen -> prüfen mit Blinker.
Ich bin der Meinung das kein flackern wahrnehmbar sein sollte.

Ach so, wollte ich vorhin ja schon sagen: Die for-next Schleifen sind hier vermutlich so auch überflüssig. Wenn ich es richtig sehe gibst du doch den Servowert in der ISR an...wozu zählen die Schleifen da auch noch was mit - wenn ich so drüber nachdenke .... das wird das zittern verursachen, weil es auch einfach keinen Sinn macht die Ausgabepins von 0 - 100 hoch zu zählen, zumal der mega8 effektiv nur 23 Pins hat, und sicher nicht alle davon für dich in frage kommen ;)
Und bei mir sieht der Befehl für Portb.0 so aus : Pulseout Portb, 0, wert. Warum das bei dir anders ist kann ich nicht sagen, ob falsch ist natürlich auch nicht. Aber die Hilfe sagt was anderes als bei dir steht.

Auch ist ein Long etwas sehr überdimensioniert, hier tut es ein Word. Denn du hast sicher niemals einen Wert über 65535.

Ich kenne das Eva-Board nicht und weiß auch nicht wie die Spannung aussieht die Du da benutzt. Wenn es aber mit der Single-Version läuft, dann könntest du den Tipp von hbquax als erstes versuchen umzusetzen. Wenn das Problem dann weiterhin auftritt, hast Du wahrscheinlich einen Spannungseinbruch - vielleicht auch mit unbemerktem reset des µC- das kann auch das zittern auslösen.

Und nun lass uns nochmal über etwas grundsätzliches kurz sprechen: Es macht keinen Sinn ein Programm zu posten, das aber nicht den Fehler produziert - denn einen Servo Befehl sehe ich hier nicht. Und auch einen Programmteil einfach wieder rein zu schreiben - womöglich ohne es erneut zu testen, macht wenig Sinn.

Viele Grüße
Jörg

stardust19322
02.10.2014, 21:35
HI.

Jeden neuen Controller setupe ich extra mit AVRStudio, weil ich damit die Lock-Bits setzen kann. Und da setze ich den Controller immer auf 8Mhz +64ms.

Hm - um ehrlich zu sein, kann ich dir die Frage nach der For-Next-Schreife nicht beantworten. Allerdings kann ich nur so den Pulseout-Befehl ausgeben, denn nur dort ist die Variable "A (bzw. B)" verankert, welche ja die Anzahl an Wiederholungen wiederspiegelt. Und hier hört dann auch leider mein "Fachchinesisch" dazu auf, denn viel mehr habe ich über den Pulseout-Befehl leider nicht finden können.

Ui - ich werde deine Variante des "Pulseout" ausprobieren. Zum Aufschlüsseln: Pulseout ist ja klar, dahinter der entsprechende Ausgangsport, an 3ter Stelle nehme ich an, wird die fallende Flanke getriggert, zuletzt dann die Variable, welche in der ISR aufgerufen wird. Nicht, dass nämlich die 3te Variable "0" für die direkte Portnummer steht ^^.

E-V-A: Eingabe - Verarbeitung - Ausgabe ^^. Ich nenne mein Evaluationsboard so. Habe das STK500 ;). Ist für mich einfacher, jedoch kannst du natürlich nicht wissen, was ich damit meine. Entschuldige.

Na klar - ändere das "Long" auf "Word".

Nein. Das Zittern spiegelt keinen "Reset" des µC wieder. Mit den Variablen habe ich das Servo in einem Aktionsradius von exakt 180° zu Laufen. Es fährt die entsprechenden Stellungen ja an, z.B. 90° (ca. Wert 2900, 1250 = linker Anschlag, 4550 = rechter Anschlag) ja an und hält diese auch, nur dass das ausgangssignal anscheinend (z.B. bei Wert 2900 = Mittelstellung) nicht bei exakt 1,50 Milisekunden liegt, sondern in einem Bereich zwischen 1,3ms und 1,7ms liegt - und genauso verhält sich das Servo dann auch. Würde der Controller durch den Spannungseinbruch zurück gesetzt, würde das Servo ja wieder in die Ausgangsposition fahren, und die liegt bei 1ms - also linker Anschlag (Startwert bei 1250). Das kanns dann augenscheinlich nicht sein.
Möglich wäre nur, dass das Servo selbst bei Belastung die Spannungs mit Einbruch-Spitzen überlagert und der Controller so Fehlsignale einfach weitergibt.

Ich werde mal folgendes tun:
Ich besorge mir für die Zukunft ein 2tes Netzteil und erstelle mit eine Spannungs-Unterstützung. Auf der wird dann ein 5V Festspannungsregler untergebracht, der die Spannung für Nebenaggregate aufrecht hält. Sofern ich die Masse dieses Boards dann mit der zentralen Masse des STK500 verbinde, sollte der Controller beim Ausprobieren auch das Servo stellen können - hoffe ich zumindest.


Jörg - du hast recht. Ich probiere es nun erst einmal mit deinem Vorschlag. Erreiche ich damit nichts, poste ich das gesamte Programm. Versprochen.
Will ja, dass du zufrieden bist und mir so auch etwas mehr helfen kannst.


LG - Möhrchen

HeXPloreR
02.10.2014, 22:14
Leider kombinierst Du anscheinend ein LED-Lauflicht mit Deiner Anwendung die ja eindeutig eine PWM-Ausgabe auf mindestens einen (oder vielleicht auch zwei) festen Ausgang hat. Wenn Du aber mit einem Zähler in der Schleife auch noch den Pulseout beschickst ... also kurz gesagt ich denke Du benutzt den Befehl leider einfach falsch.

Welche Anzahl von Wiederholungen denn? Du drückst doch eine Taster, daraufhin verfährt der Servo auf einen festen Wert. Wiederholungen gibt es doch, abgesehen von der eigentlichen Hauptschleife garnicht, oder? Und auch wenn du Wiederholungen einbauen wollen würdest, ganz sicher nicht an dieser Stelle. Um eine Wartezeit von zb 15ms zu erzeugen würde ich vorerst einfach ein waitms15 vor die loop setzen. Der Nachteil dabei ist dein debounce-Befehl ... das ganze würde ich in eine Interrupt packen ohne debounce, deshalb Hardware entprellt und dort das drücken zählen lassen (- den Taster würde ich persönlich immer hardware entprellen - da ich mir grade nicht sicher bin ob debounce im Interrupt einfach funktionieren würde)

Zusaätzlich könntest du den Tipp von hbquax nachmal ansehen... ...und dazu Deinen Code: wenn Du genau hinsiehst erkennst du vermutlich das Du zwei Variablen angelegt hast, die vermutlich letzten Endes das Gleiche enthalten. Auch das wäre unnötig, wenn beide Servo die gleichen Werte bekommen sollen, denn genau dazu sind Variablen eben auch gut ;)

Ein wenig Bascom für die Praxis (http://halvar.at/elektronik/kleiner_bascom_avr_kurs) - Halvar.at

EVA - Guckst Du hier (https://www.roboternetz.de/community/threads/37792-EVa-Bioloid-Hexapod?highlight=eva) ;)

Viel Erfolg
Jörg

stardust19322
03.10.2014, 10:58
Recht hast du. Wiederholungen gibts im Dem Sinne nicht. Ich sehe leider nicht die Software die hinter der Hardware steckt. Mit "Wiederholungen" meinte ich wohl das Verfahren der Servos, jedoch habe ich dabei nicht betrachtet, dass mit dem Tastsendruck das ausgegebene PWM-Signal sofort geändert wird und das Servo halt nur seine Zeit braucht, um den dazu gehörigen Wert anzufahren.

Nein, kein Lauflicht, sondern eine PWM-Eingabe. Habe einen Sevotester, der ein PWM-Signal ausgibt. Damit füttere ich den Controller, und der soll das dann nur auswerten und einen Ausgang ab 1,8ms PWM-Input einschalten. Also genau das Gegenteil von dem, was ich mit den Servos vor habe.

Werde heute oder morgen noch mal ein wenig Probieren - u.U. komme ich aber erst kommende Woche dazu. Dann poste ich auch das Programm.


LG - Maik

HeXPloreR
03.10.2014, 11:24
Ich sehe leider nicht die Software die hinter der Hardware steckt.

Wie meinst Du das? - Ich nehme mal an die schreibst die Software selbst - in Bascom, oder wovon reden wir jetzt? "Hardware entprellen" bedeutet das parallel zu dem Taster z.B. ein 10µF Keramikkondensator verbaut wird. Damit spart man sich den Debounce in der Software, was eben auch seine Vorteile haben kann.


und das Servo halt nur seine Zeit braucht, um den dazu gehörigen Wert anzufahren..
...hört sich an als drückt man sehr ungeduldig auf dem Taster rum.


.... und der soll das dann nur auswerten und einen Ausgang ab 1,8ms PWM-Input einschalten. Also genau das Gegenteil von dem, was ich mit den Servos vor habe.

Nur weil es vielleicht das Gegenteil ist ändert es nicht die Tatsache das auch hier ein fester Eingang mit Pulsein benutzt werden kann. Und ab dem dazu fraglichen Wert ein IO eingeschaltet wird.

Sollen diese beiden Anwendungen später irgendwas zusammen machen oder sich gegenseitig beeinflussen?

stardust19322
05.10.2014, 23:40
Wie meinst Du das?

Mit "Hardware hinter der Software" meinte ich Folgendes:

Wenn ich den Taster drücke, ändert der Controller ja SOFORT das ausgegebene PWM-Signal von z.B. 1ms auf 2ms. Das Servo jedoch braucht seine Zeit, um von 1ms (linker Anschlag) auf 2ms (rechter Anschlag) zu fahren. Wenn ich also zwischen den ausgegebenen PWM-Signalen schnell hin und her switchte, habe ich wohl einen zu hohen Stromfluss für das kleine Board erzeugt, was den Controller u.U. dazu zwang, sein Programm anzuhalten oder er sogar ganz abgestürzt ist.

Für die kommende Woche habe ich mir nun neue, deutlich kleinere Servos eingepackt. Die haben einen weitaus geringeren Strombedarf - bin gespannt, wie das Board diesmal reagiert. Auf dem Board sitzt ja ein Festspannungsregler, und der darf nicht zu warm werden, um korrekt zu funktionieren. Bin selbst gespannt ^^


Ich habe mit dem Controller folgendes vor:

Er soll in meinem Modellboot laufen. Dieses hier:

http://www.album.de/img1/big/271/27176948469632.jpg
DSCN0646 von tenner21 - Album.de (http://www.album.de/bild/2717694/dscn0646.cfm)

An Deck sind 2 Doppelklappen zu sehen (die mit dem Messerfurnier), welche servoelektrisch angetrieben sind. Im Cockpit befinden sich dafür 2 Taster, welche diese Klappen dann per Tastendruck öffnen und schließen sollen.

Weiterhin hat mein Boot eine elektrische Wasserpumpe sowie eine Beleuchtung in 2 Stufen verbaut, welche per Fernsteuerung geschaltet werden müssen.
Demzufolge muss an 2 Pins ein PWM-Signal überwacht werden, 3 weitere Pins sind Schaltausgänge.
Zusätzlich sind 2 Pins Tastereingänge und 2 Ausgänge müssen ein PWM-Signal für die Servos ausgeben.

Ist das möglich oder reicht dafür mein Bascom-Wissen nicht aus bzw. kann Bascom das nicht?



LG - Maik

oberallgeier
06.10.2014, 09:45
... 2 Servos, die per Tastendruck ... von einem Anschlag zum anderen Anschlag ... beim 2ten Tastendruck dann wieder zurück ...Die Aufgabe ist eher so als Standard zu sehen, nicht wirklich sehr anspruchsvoll, also gerade richtig für den Einstieg.


... habe ich wohl einen zu hohen Stromfluss für das kleine Board erzeug ... Controller ... oder er sogar ganz abgestürzt ist ...Ein typischer Anfängerfehler ist es Servos mit der gleichen Stromquelle (genauer: dem gleichen Spannungsregler) zu versorgen wie den Controller. So ungefähr alle ein bis zwei Monate gibts dazu hier im Forum ähnliche Störungsmeldungen. Du wirst weiter Störungen haben, möglicherweise mit den kleineren Servos genauso (ausser Du prüfst wirklich deren Stromhunger, die Hersteller machen dazu äusserst selten Angaben !!) wenn nicht noch schlimmer.


.... Auf dem Board sitzt ja ein Festspannungsregler, und der darf nicht zu warm werden, um korrekt zu funktionieren ...Du hast also an Board eine Energieversorgung die höher ist als die fünf (oder wieviel Volt) die Dein Controllerboard braucht. Wie hoch ist denn Deine Bordspannung - ohne Spannungsregler ???

Fazit:
a) für die Servos nen separaten Spannungswandler oder direkt von der Bordbatterie/-akku.
b) UN BE DINGT die GND-Leitungen der Controllerplatine und der Servo-Versorgung miteinander verbinden (klick hier). (http://rn-wissen.de/wiki/index.php/Servos#Ansteuerung:_Signalform_und_Schaltung)
c) Wenn Störungen anhalten, für die Servos ne separaten Akku nehmen und b) beachten.

HeXPloreR
06.10.2014, 12:27
Ich denke auch die Aufgabenstellung ist genau das richtige für den Einstieg - wenn auch schon etwas schwieriger, Bascom kann das auf jeden Fall umsetzen.

Überlege doch nochmal ob du wirklich zweimal PWM Ausgänge für zwei Servos benötigst die vermutlich das gleiche tun sollen.
Und ob nicht auch ein Taster ausreicht um dieses öffnen und schliessen zu erreichen.
Also ich möchte Dir nicht deine Aufgabe kaputt reden, aber einfacher wäre es ja schon.

Für die Beleuchtung wäre möglicherweise eine Tastfunktion für dich interessant.

Viele Grüße Jörg

stardust19322
06.10.2014, 23:07
Ein ganz liebes "HALLO" an euch beide.

@ oberallgeier:
Korrekt. Die Spannungsversorgung erfolgt über ein 12V Netzteil mit 500mA Ausgangsstrom. Eigentlich ausreichend. Dennoch habe ich die 19g-Servos nun gegen 12g-Servos getauscht und der Stromhunger ist genau in dem Rahmen, in dem ich ihn haben will.
Die GND-Leitungen von EVA-Board und Servos würde ich eh miteinander verbinden. Die Rechtecksignale kann der Controller schließlich nur im geschlossenen Stromkreis erkennen ^^.
Danke dir trotzdem recht herzlich für den Tipp.


@ Jörg:
Habe das Programm nun zumindest einmal soweit, dass beide Servos problemlos dahin fahren, wohin ich sie haben möchte. Ganz unkonventionell und ohne großen Schnickschnack drum herum. Ging doch mit dem Servo-Konfigurationsbefehl, aber ohne Main-Sub. *freu*


Hier das File:


$regfile = "m8def.dat"
$crystal = 3686411


Config Portb = Output
Config Portc = Input

Portb = &H03

Taster1 Alias Pinc.0
Taster2 Alias Pinc.1



'*** Konfiguriere Servos ***

Config Servos = 2 , Servo1 = Portb.0 , Servo2 = Portb.1 , Reload = 10
Enable Interrupts


'*** Setze Servos für Startup auf Mittelstellung ***
Dim Pos1 As Byte
Pos1 = 124 ' 124 = Mittelstellung, 48 = rechter Anschlag, 210 = linker Anschlag, Servo 1
Servo(1) = Pos1
Dim Pos2 As Byte
Pos2 = 130 ' 130 = Mittelstellung, 48 = rechter Anschlag, 215 = linker Anschlag, Servo 2
Servo(2) = Pos2


'*** Konfiguriere Variablen ***

Dim M1 As Byte
Dim M2 As Byte
M1 = 0
M2 = 0



' *****************************
' ***** Hauptprogramm *****
' *****************************

Do

Debounce Taster1 , 0 , Sub_taster1 , Sub
Debounce Taster2 , 0 , Sub_taster2 , Sub


Loop



' **********************
' * Unterprogramme *
' **********************

'Wenn Taster 1 gedrückt, zählt Merker1 um Wert 1 hoch. Mit jedem neuen Wert von M1 erfolgt eine neue Positionsausgabe per PWM an Servo1.

Sub_taster1:

If Taster1 = 0 Then
M1 = M1 + 1
Waitms 20
End If
If M1 = 1 Then
Pos1 = 48
Elseif M1 = 2 Then
Pos1 = 210
End If
If M1 = 2 Then 'Wenn M1 den Wert 2 erreicht, wird M1 auf Null zurück gesetzt
M1 = 0
End If
Servo(1) = Pos1

Return


'Wenn Taster 2 gedrückt wird, zählt Merker2 um Wert 1 hoch. Mit jedem neuen Wert von M1 erfolgt neue Positionsausgabe an Servo2.

Sub_taster2:

If Taster2 = 0 Then
M2 = M2 + 1
Waitms 20
End If
If M2 = 1 Then
Pos2 = 48
Elseif M2 = 2 Then
Pos2 = 215
End If
If M2 = 2 Then ' Wenn M2 den Wert 2 erreicht, wird M2 auf Null zurück gesetzt
M2 = 0
End If
Servo(2) = Pos2

Return

End

Ich kann damit sogar beide Taster gleichzeitig drücken und der Controller gibt sofort das entsprechende PWM-Signal an den Ports aus.

Morgen Abend werde ich dann mal versuchen, ob ich die Eingabe durch den Servotester (PulseIn) implementiert bekomme. Irgendwie muss das doch funktionieren - vielleicht diesmal ^^.

Auf deine Frage bezogen:
Nein, auch wenn es noch 2 Monate dauert - das muss ich hinbekommen. Und wenn nicht, dann muss ich umso mehr dafür büffeln. N bissl Platz ist in meinem Hirn dafür noch frei ^^.
Die Klappen, die im Boot verbaut sind, sollen definitiv getrennt zu öffnen sein. Finde das einfach schicker. Man soll ja auch sehen, dass ich mir echt Gedanken für die Steuerung gemacht habe - und meine Frau freut sich sicher auch über ausgereiftere Konzepte als halbherzige Notlösungen (z.B. weil ich nicht weiter gekommen bin).

Die Beleuchtung soll NICHT nur per Tastkanal zu schalten, sondern dauerhaft eingeschaltet sein wenn der entsprechende Schalter an der Fernsteuerung umgelegt wird. Und da habe ich dann einen 3-Stufen-Schalter, welcher dafür genutzt werden soll: Stufe unten - Licht aus, Stufe Mitte - Licht ein, Stufe oben - Licht und Zusatzscheinwerfer.


MFG - Maik

HeXPloreR
07.10.2014, 15:55
Ja, na endlich hat er es gesagt: Zwei Taster, zwei Klappen - jeweils ein Taster pro Klappe. Nicht das das wichtig wäre um ein Programm zu beurteilen ;)

...interessanter Verlauf ....was ich nicht verstehe ist warum du Deine Hardware ständig änderst? Konkret die Frage: Hast du nun einen 8Mhz oder einen 3686411 Crystal, intern oder extern ?

Ich hätte auch vermutet das wenn ein Taster auf 0 (GND) im Debounce eingestellt wird, nicht nochmal im Unterprogramm geprüft werden muss ob der 0 ist - weil sonst hätte man ja in dem Unterprogramm nichts verloren, oder? Der Merker wäre so oder so okay. Naja, wenn es nicht stört und funktioniert.

Wäre es nicht auch möglich jeweils die letzte if m(x) abfrage in die da vor zu packen weil du löscht den Merker ja sowieso danach, dann kannst Du ihn auch gleich noch mit auf 0 setzen.

Mir wäre es ja auch lieb gewwesen wenn du gleich gesagt hättest das Du für die Beleuchtung extra Schalt-Kanäle an der Funke hast. Aber sowas passiert jedem Mal :)

Viele Grüße
Jörg

stardust19322
14.10.2014, 22:32
Hallo Jörg

...und vielen lieben Dank für Antwort und Verständnis.

Ja, korrekt. 2 Klappen, 2 Servos. Die letzte "If" kann ich jedoch nicht heraus nehmen - habe ich schon mehrfach probiert. Wenn ich diese voran setze, dann wird der Merker zeitgleich auf Null gesetzt und das Servo bleibt in der Position des davor stehenden Punktes (Anlaufpunkt nach ersten Tasten) stehen, da der Frequenzwechsel weitaus schneller von statten geht, als das Servo anlaufen kann (zu träge halt).
So funktioniert es prima und bleibt es nun auch.

Habe heute zudem die anderen Befehle für die PWM-Kanalabfrage und das Setzen von 3 zusätzlichen Ausgängen in das Programm implementiert.
Es funktionierte prima, bis zu dem Punkt, an dem ein Ausgang durch 2 Bedingungen gesetzt wird:

1.) Durch das Erfassen eines PWM-Eingangssignals und entsprechend festgelegter Schaltroutine

2.) Durch einen Taster per Debounce-Befehl.

Das Problem war, dass der Debounce den Ausgang setzte, dieser jedoch durch den PWM-Input (bei PWM 1ms, also im Grunde "aus") nach 1-2 Sekunden wieder ausgeschaltet wurde.
Und das Problem kannte ich (nach ein wenig Ausprobieren) noch aus meiner Zeit als Lehrling, wo ich mit SPS-Steuerungen zu tun hatte: Signalüberschneidung am Ausgang.

Also habe ich für beide Bedingungen statt des direkten Ausgangs einen Merker als Schaltkontakt gesetzt und später in der Hauptschleife als IF-(OR)-Then Bedingung definiert.


Hier das File - ist allerdings nicht ganz so gut beschrieben.


$regfile = "m8def.dat"
$crystal = 3686411


Config Portb = Output
Config Portc = Input
Config Portd = Input


'*** Konfiguriere Inputs ***

Taster1 Alias Pinc.0
Taster2 Alias Pinc.1
Taster3 Alias Pinc.2
Taster4 Alias Pinc.3



' *** Konfiguriere Outputs ***

Pumpe Alias Portb.0
Beleuchtung Alias Portb.1
Scheinwerfer Alias Portb.2

Pumpe = 1
Beleuchtung = 1
Scheinwerfer = 1


'*** Konfiguriere Servos ***

Config Servos = 2 , Servo1 = Portb.3 , Servo2 = Portb.4 , Reload = 10
Enable Interrupts


'*** Setze Servos für Startup auf Mittelstellung ***
Dim Pos1 As Byte
Pos1 = 124 ' 124 = Mittelstellung, 48 = rechter Anschlag, 210 = linker Anschlag, Servo 1
Servo(1) = Pos1
Dim Pos2 As Byte
Pos2 = 130 ' 130 = Mittelstellung, 48 = rechter Anschlag, 215 = linker Anschlag, Servo 2
Servo(2) = Pos2


'*** Konfiguriere Variablen ***

Dim Kanal5 As Byte
Dim Kanal6 As Byte
Dim M1 As Byte
Dim M2 As Byte
Dim M3 As Byte
Dim M4 As Byte
Dim Mbel1 As Bit
Dim Mbel2 As Bit
Dim Mschein1 As Bit
Dim Mschein2 As Bit
Dim Mpmp1 As Bit
Dim Mpmp2 As Bit
M1 = 0
M2 = 0
M3 = 0
M4 = 0
Mbel2 = 0
Mschein2 = 0
Mpmp2 = 0



' *****************************
' ***** Hauptprogramm *****
' *****************************

Do


Pulsein Kanal5 , Pind , 2 , 1
Pulsein Kanal6 , Pind , 3 , 1


If Kanal5 > 10 Then
If Kanal5 >= 60 Then
Mpmp1 = 1
Else
Mpmp1 = 0
End If
End If

If Kanal6 > 10 Then
If Kanal6 >= 50 Then
Mbel1 = 1
Else
Mbel1 = 0
End If
If Kanal6 >= 70 Then
Mschein1 = 1
Else
Mschein1 = 0
End If
End If



Debounce Taster1 , 0 , Sub_taster1 , Sub
Debounce Taster2 , 0 , Sub_taster2 , Sub
Debounce Taster3 , 0 , Sub_taster3 , Sub
Debounce Taster4 , 0 , Sub_taster4 , Sub


If Mpmp1 = 1 Or Mpmp2 = 1 Then
Pumpe = 0
Else
Pumpe = 1
End If


If Mbel1 = 1 Or Mbel2 = 1 Then
Beleuchtung = 0
Else
Beleuchtung = 1
End If

If Mschein1 = 1 Or Mschein2 = 1 Then
Scheinwerfer = 0
Else
Scheinwerfer = 1
End If


Loop



' *************************
' *** Unterprogramme ***
' *************************


' Klappensteuerung
' ******************

Sub_taster1:

If Taster1 = 0 Then
M1 = M1 + 1 'Wenn Taster 1 gedrückt, zählt Merker1 um Wert 1 hoch. Mit jedem neuen Wert von M1 erfolgt eine neue Positionsausgabe per PWM an Servo1.
Waitms 20
End If

If M1 = 1 Then
Pos1 = 48
Elseif M1 = 2 Then
Pos1 = 210
End If
If M1 = 2 Then 'Wenn M1 den Wert 2 erreicht, wird M1 auf Null zurück gesetzt
M1 = 0
End If
Servo(1) = Pos1

Return


'Wenn Taster 2 gedrückt wird, zählt Merker2 um Wert 1 hoch. Mit jedem neuen Wert von M1 erfolgt neue Positionsausgabe an Servo2.

Sub_taster2:

If Taster2 = 0 Then
M2 = M2 + 1
Waitms 20
End If

If M2 = 1 Then
Pos2 = 48
Elseif M2 = 2 Then
Pos2 = 210
End If
If M2 = 2 Then ' Wenn M2 den Wert 2 erreicht, wird M2 auf Null zurück gesetzt
M2 = 0
End If
Servo(2) = Pos2

Return




' Handbedienung Beleuchtung
' *************************

Sub_taster3:

If Taster3 = 0 And Mbel1 = 0 Then
M3 = M3 + 1
End If

If M3 = 1 Then
Mbel2 = 1
Elseif M3 = 2 Then
Mschein2 = 1
End If
If M3 = 3 Then
Mbel2 = 0
Mschein2 = 0
M3 = 0
End If

Return



' Handbedienung Pumpe
' *******************

Sub_taster4:

If Taster4 = 0 And Mpmp1 = 0 Then
M4 = M4 + 1
End If

If M4 = 1 Then
Mpmp2 = 1
End If
If M4 = 2 Then
Mpmp2 = 0
M4 = 0
End If

Return

End


Mbel1 und Mbel2 stehen für die Merker des Ausgangs "Beleuchtung".
Mschein1 und Mschein2 sind die Ausgangsmerker für den Scheinwerfer und
Mpmp1 und Mpmp2 stehen für die Ausgangsmerker der Pumpe.


Die Frequenz habe ich nun intern auf 3,2MHz festgelegt, weil so die Servos etwas besser arbeiten.

Ich bin gespannt, ob das Programm auch in meinem Boot so gut funktioniert wie auf meinem STK-500 ^^.



MFG - Maik