Beiträge von etwg

    Danke schön Kai, leider die beide andere Timer können keine 1 Hz Frequenz herstellen..


    ich denke eventuell auf eine State Machine, wo die Pausen extra Schritte bedeuten werden.. Ich muss noch erwas überlegen.


    soetwas wie.


    Blinker (). 1 Hz und Zähler für 10 und 20 sec. Der Zähler wird in Schritten 2.,4 und 8 resetiert.

    State machine:

    1. Default: Warten auf die Taste

    2. Taste gedrückt, Warte 10sec Variable

    3. Motor links

    4. Warte auf Variable 20 sec.

    5. Servo

    6 .Warte auf 20 sec Variable

    7. Motor rechts

    8. Warte auf 20 sec Variable

    9. Wiederholung Xmal und Default.

    Die Variablen werden in Void Blinker() produziert.


    Ich probiere es so, dann sind keine Warteschlangen in Schritten 2.,4.,8. nur werden ausgeführt, wenn die Variablen 10 und 20 sec gesetzt werden.

    Ich muss es probieren.


    Schönen Abend noch.


    Eugen

    Ich baue ein üen Halbroboter mit 1 Motor und 1 Servo.
    Die Motoren steuern einen Ablauf, wo der Servo in einem Endpunt etwas bewegen muss und alles in einem Zeitraum von etwa 1 Minute. Dazu kommt noch eine LED welche ständig blinken soll mit etwa 1 Hz. Ursprünglich die LED war durch Timer1 Interrupt gesteuert, aber der Servo verwendet auch die Timer für interrupt, also blockierte die LED.

    Dann habe eine andere Blinkermethode geschrieben, wo die Loop ruft ständig die Blinker (); ähnlich wie in der Lektion 11.


    Leider mit die lange Zeiten habe ich ein Problem, die beeinflussen auch die Blinkfrequenz. Ich brauche nach jeder Motorbewegung etwa 20-30 sec zu warten.
    Also die Aufgabe ist.
    1. LED blinkt mit etwa 1 Hz.

    2. Wenn eine Taste gedrückt ist (Interrupt 2. Port). Nach etwa 5-6 sec soll der Motor anlaufen ( die folgende Sequenz soll X mal wiederholt werden)

    3. Zwei Optokopplers begrenzen die Motorbewegung.

    4. Motor erreicht die Endstellung

    5. Wartezeit etwa 20 sek

    6. Servo Umstellung

    7. Wartezeit etwa 20 sec

    8. Motor Bewegung in anderer Richtung bis Optokoppler

    9. Wartezeit von etwa 20 sec

    10 Wiederholung vom Punt 3. Xmal, nachdem warten auf Tastendruck.



    Alles funktioniert nur die Zeiten sind kritisch. Ich arbeite mit millis, aber irgendwie die Frequenz von LED ist beeinflusst.
    eine Idee wie soll ich die Wartezeiten behandeln?


    Vielen Dank für die Hilfe.


    Eugen


    Nun vielleicht ist es Dir ja möglich nach 120 Schritten einen Ausgang (Flag) zu setzen, auf den Du triggern kannst. Die Zeitabstände dazwischen sollten ja dann etwa gleich sein. Wenn nicht, wäre die Sequenz genauer zu untersuchen...

    Das ist eine gute Idee. Ich glaube ich habe sogar soetwas dort, nur is wahrscheinlich nicht auf Port ausgeführt. Ich werde es morgen untersuchen.


    Vielen Dank.


    Eugen

    Die Geschwindigkeit ist schon jetzt bedeutend weniger. Ich werde es noch mit Logikanalysatir auch versuchen. Nur deswegen habe den Schrittzähler gebaut, denn mit Logikanalysator ist nicht einfach die 120 Schritte zu zählen.

    Es wird nicht multipliziert, man hat die Differenz von der aktueller Position (1-32) und wird die Motorsteuerung-Routine (120 Schritte) so oft abgerufen wievielmal gebraucht wird.

    Also eine Bewegung von 1 Stelle wird die Motor Routine (120 Schritte) einmal abgerufen.

    Für eine Bewegung von 5 Stellen wird es fünfmal getan, also nicht 600 Schritte sondern 5x120 Schritte. Die 120 Schritten sind immer in der Motorroutine gezählt. Also wenn der Motor drehen muss, wird immer der interne Zähler von der 120 (Konstante) immer bis 0 zählen, dann wird die Stellenzahl (5) mit 1 reduziert, und der Motor macht erneut 120 Schritte usw. Kann es sein das der Interrupt während ich die Stellenzahl (5) reduziere ruft wieder die Motorroutine? Also der Motor macht ein paar Schritte, dann kommt der "richtige" Befehl : mach noch eine weitere Stelle, also füllt den internen Zähler wieder mit der Konstante (120) und zählt bis 0? Da habe ich keine Routine wie kann ich den Interrupt folgen wenn andere Programsegmente laufen. ( wo kein Interrupt gebraucht wird).

    Ich versuche es noch schrittweise simulieren vielleicht finde ich etwas. Gott sein Dank diese AVR hat auch eine JTAG Interface also kann ich denn Program manuell laufen lassen. Das Problem war, bis jetzt dort macht es keinen Fehler. (AVR Studio).

    Vielen Dank für die Antwort. Es ist eine kleine Anlage für eine Spezialkamera, die in 360 Grad drehen kann in 32 Stellen, also jede "Fotostelle" ist 11,25 Grad. Da sind die "Stellen". Die Drehung muss sehr präzis sein. Diese Stellen sind voneinander 120 Schritte auf den Motor. Die Steuerung selbst ist relativ einfach, die 120 Schritte sind in einem Variablen gespeichert, also wenn der Befehl zu bewegen kommt, wird ausgerechnet wieviel Stellen sind das (1-32 x 120) und in welcher Richtung (DIR) und der Motor bekommt die 120 Schritte 1-32 mal. Leider manchmal sind es nicht 120 sondern um ein oder 2 Schritten mehr.

    Das ist der Steuerpult, die LEDs signalisieren die Position, mit den Tasten wählt man die nächste Position. Die Position wird berechnet (DIR) und wieviel Stellen weiter (1-32), und diese Zahl wird in Motor Steuerung geschickt. Dort wiederholt sich nur die 120 Schrittzyklus.

    Alles ist in Assembler.

    Dateien

    • IMG_4918.JPG

      (80,7 kB, 5 Mal heruntergeladen, zuletzt: )

    Liebe Freunde


    Ich bin wieder da. Ich habe einen alten Projekt noch in ASM für AVR geschrieben.

    Die Aufgabe ist eine Drehscheibe. Die Anlage ist mit einem Schrittmotor angetrieben und hat 32 Stellen. Die Übersetzung wurde so gebaut das ich 120 Schritte für eine Stelle (1/32 von dem 360 Grad) brauche. Der Schrittmotor ist direkt über einen ULN angetrieben also der Program gibt die 4 Port-Kombinationen für die Motorschritte aus.

    Die Schritte sind mit IRQ gesteuert wegen die regelmäßige Geschwindigkeit. Wenn die Drehscheibe 2 oder mehrere Stellen dreht die 120 Schritte sind entsprechend wiederholt. Das Problem war das scheinbar habe ich irgendwo Schrittfehler gemacht, also nach 4-5 Stellungen habe ich schon gewissen Ungenauigkeiten. Am Anfang dachte ich es ist ein mechanischer Fehler, dann habe ich einen primitiven Program für Arduino geschrieben, dort gab es keinen Fehler. Dann habe ich einen Schrittzähler gebaut welche die 4 Ausgänge für Motor misst - jede Änderung ist ein Schritt. Dort habe ich es gesehen dass die erste Stelle ist immer richtig 120 Schritte bedeutet, aber beim 2 oder mehrere Stellen sind die Schritte um 1 bis 2 Schritte mehr, also anstelle von 2x120 messe ich 2x121 oder 122 Schritte. Ich kann es leider nicht festellen woher diese extra Schritte kommen.

    Hat jemand Erfahrung mit solcher Fehlersucherei?


    Ich kann natürlich den entprechenden Codesegment hier zeigen, den ganzen Code kaum, es ist etwa 600 Zeilen mit vielen Makros usw. und ist auch eine spezielle Codesegment für den Display ( Eigenentwicklung).

    Hallo Rene,


    Leider bin ich in Arduino noch nicht so weit das ich so ein konktretes Projekt vorschlagen kann. ( Mit Klassen usw). Werde ich noch herumschauen vielleicht nach ein paar Lektionen wird es auch kommen.


    LG

    Eugen

    Hallo Rene,


    Als ich fast nie richtig Progarmmierung studierte, beschäftige ich mit SW seit über 30 Jahren davon 25 fast ausschliesslich mit Assembler (ein wenig mit Basic), und habe ich einige professionelle Sachen auch gebaut ( digitalen Interkom für 32 Nebenstellen, komplexe Ablaufsteuerungen, Studiogeräte Synchronisierungen usw), habe ich ein wenig Erfahrung. Damals gab es nicht enmal Internet von Videolernkursen ganz zu schweigen. Mit Arduino beschäftige ich mich nur ziemlich kurz ( 1 Jahr). Ich habe immer erst die Aufgabe gehabt und immer dazu suchte ich die Lösungen. ( In ASM hat man natürlich keine solche Möglichkeiten, dort muss man alles selbst schreiben und die Routinen entwickeln (ich habe sicher mehr als 1000 Makros, und genauso viele Subroutinen.). Natürlich ist dann auch die Terminologie individuell, das führt auch zu Vergleichsproblemen.

    Deswegen habe ich mich gemeldet.

    Ich warte auf nächste Folge


    Gruss

    Eugen

    Guten Morgen Rene,


    Vielen Dank für Deine Antwort.

    Vielleicht habe ich mich falsch ausgedruckt. Ich meinte unter lukrativen Projekt, etwas praktisches, einfaches wie ein Display, ein Robot usw, wo die besprochene Tricks eingesetzt sind oder verwendbar sind und wir sehen können wie effektiv kann man solche Methoden in der Praxis einsetzen. Ich warte geduldig auf die nächste Folge, vielleicht bringt es mehr Licht in meinem Kopf.


    Liebe Grüße

    Eugen

    Hallo Rene, vielen Dank für die super Videos und Erklärungen.


    Ich bin ein bisschen praktischer Mensch. Ich habe zwar mehr oder weniger verstanden was gemacht wurde, aber habe ich keine Ahnung was soll ich mit diesem Wissen anfangen :/:/

    Für die Zukunft würde einen umgekehrten Vorgang vorschlagen. Irgendeine lukrative fertige Lösung zu zeigen, damit wir wissen was soll der Ziel sein, und erst nachher sollen die Erklärungen kommen. So ist es für mich ziemlich trocken ( wie Einstens Relativitätstheorie) und letztendlich kann ich kaum etwas damit anfangen. Machmal sind zu viel Optionen - mit gleichem oder ählichem Ergäbniss was mich noch ein wenig verwirrt. Ich bin natürlich jetzt sehr neugierig was kommt in der nächster Lektion und dann vielleicht werde ich sehen wozu ist alles gut, was ich bis jetzt gesehen habe.

    Vielen Dank! Mach weiter!:)

    Eugen

    Hallo Mirco


    Ich glaube diese Technologie ist nicht mehr aktuell. Alle digital Kameras haben schon einen Timecodespur - direkt im Video Header. Also es ist Bestandsteil des Videos.

    Eher die Frage ist wie kannst Du es einfach auslesen. Die teuere Kameras haben einen Stecker, die Heimkameras meistens nicht.

    Timecode auf Tonspur aufzunehmen hat nur dann Sinn wenn du die Kameras mit dem Timecode synchronisieren kannst ( das gehr nicht mit Heimkameras).

    Mein Spulenwickler ist fertig. Funktioniert gut, ich habe auch Beschleunigung gelöst. Leider die Beschleuningung hat auch ein Problem gemacht. Es ist jetzt irgendein Konflikt zwischen Interrupt und den Zähler. Bis 2 ms Interruptzeiten funktioniert alles ganz normal, aber bei kürzeren IRQ Zeiten der Zähler last Schritte aus. Der Zähler ist nur eine einfache Gray-Code Zähler, aber konnte nicht vom Interrupt gesteuert werden. Der Zähler hat nur einen Signal per Umdrehung also beim 2 ms Interruptzeit nach etwa 200x2ms. Wenn der Motor schneller dreht nach etwa jeder 8-12 Umdrehungen bleibt der Zähler für 1-2 s stehen. Der Zähler ist in normalem Loop.

    Irgendeine Idee was zu tun? Danke.

    .IMG_4469.JPG

    Grüße


    Eugen

    Natürlich hast Du Recht, ich finde nur verwirrend wenn zum Beispiel ein Update etwas in dieser Ebene ändern wurde. Dann könnte der Compiler schon jetzt darauf aufmerksam machen, das die Lösung nicht in Ordnung ist. Oder muss man solche Formel vom Upgrade zum Upgrade erneut prüfen?

    LG

    Eugen

    Danke Kai


    Ich bin auch auf Deine zweite Lösung gekommen, aber letztendlich war einfacher die Reihenfolge zu ändern..... :-)


    LG

    Eugen

    Einfache long funktionierte nicht, auch nicht für Y auch nicht im Formel, ich habe damit gut 20 Min gespielt... :-)

    Störend ist nur, das die gleiche Aufgabe in einem anderen Form funktioniert tadellos. Also wenn man zufällig den richtigen Form erwischt, alles ist in Ordnung.

    Grüß

    Eugen

    IMG_4462.JPG


    Guten morgen Rene.

    Es ist eine sehr einfache Konstruktion. Eine Plexischeibe mit einem schwarzen Segment und 2 Gabellichtschranken. Die Geschwindigkeit der Scheibe ist unter 200 RPM.


    Es gibt auch eine interessante Erfahrung. Im Code musste ich soetwas rechnen:

    Y=K*2000/X. Wo int K=[1-70] und int X=[1-99]. Diese Gleichung in diesem Form funktioniert nur bis K=16. Die Lösung war Y=2000/X*K. 🙂

    Danke Rene.

    Ich verwende eine ISR für die Motoren. Die ganze Geschichte ist sehr langsam 2-5 ms ist der Interruptzeit (Motorgeschwindigkeit). Schneller geht es kaum.

    Ich hoffe es wird in loop ausreichend schnell sein.


    Eugen

    Danke Rene, wahrscheinlich.....


    Jetzt habe ich noch eine andere Frage. Ich habe schon eine funktionierende Routine für die Umdrehungen. Es gibr ein Kulisse und 2 Optokopplers S1 und S2. Wenn erst die S1 aktiviert ist vermindert die Wicklungszahl:

    Turn--;

    Umgekehrt addiert

    Turn++;


    Wenn Turn=0; sollen die Motoren stoppen.


    Meine Frage ist: Wohin soll ich diese Routine integrieren, in loop oder in case ( wo die Motoren laufen). Diese Zähler soll immer funktionieren, also auch dann, wenn man die Spule auch manual dreht.

    Inzwischen habe ich mein Code aufgeräumt, und scheinbar habe ich den Fehler gefunden. ( irgendwo wahrscheinliech fehlte ein & oder = Symbol. Leider weiß ich nicht wo.🙁