PIC 12F675 Tastendruckzeit auswerten in Assembler
Hallo
Um einen Drehkondensator an einer Magnetantenne zu drehen, habe ich einen Schrittmotor eingesetzt.
Jetzt hatte ich das Problem, dass der Motor nicht über die beiden Endschalter fahren soll.
Mit einem PIC12F675 habe ich einen Impulsgeber "programmiert". War tagelange Arbeit und habe noch nicht so richtig verstanden, wie es funktioniert. Klappt aber, wie ich mir das vorstelle.
Jetzt möchte ich das ganze aber noch optimieren.
Meine Schaltung gibt z.Zeit Impulse ab von etwa 25ms Abstand. Das reicht um den Schrittmotor fein zu verfahren.
Der Motor hat 200 Schritte und ist 1:5 untersetzt.
Um vor einem Ende zum andern zu kommen, benötige ich etwa 500 Schritte.
(Halbe Umdrehung)
Das dauert nun schon etwas lange mit der Feinverstellung.
Durch längeres halten der Taste würde ich gerne die Geschwindigkeit erhöhen.
Habe mir das so vorgestellt, dass mit dem ersten Tastendruck ein Timer anläuft, der nach etwa 2 Sekunden Taste halten, ein anderes Unterprogramm aufruft, um dort schnellere Takte zu erzeugen. (Wait)
Hat einer einen Vorschlag für mich?
Wie realisiere ich im Assembler: Wenn Taste gedrückt call UP1, wenn Taste lange gedrückt call UP2?
Gruß Bernd
Liste der Anhänge anzeigen (Anzahl: 1)
Tastendruck auswerten, Schnelle Impulse oder langsame Ausgeben
Hallo Christian
Habe mein Grundprogramm mal angehängt:
Anhang 25512
Sorry, habe gar nichts verstanden. :confused:
Bin Anfänger, Dummy ... Newbie
Der momentane Stand meiner Überlegungen ist:
main
Warte auf Eingang G0
G0 = low
Lösche Variable Counter und mache sonst nichts.
G0 = high
Springe in UPlinks
(Das gleiche für rechts)
goto main
UPlinks
Counter +1 wenn Counter <= 10
G4 = high ;Impuls Ausgang 1
call WAIT wenn Counter z.B. < 10 (Wenn das UP normal durchläuft 25ms, mal 10 dann käme der Counter auf 10
wenn bei 250ms)
Call WAITschnell wenn Counter > =10
G4 = low ;Impuls Ausgang 0
call WAIT wenn Counter z.B. < 10 (Wenn das UP normal durchläuft 25ms, mal 10 dann käme der Counter auf 10
wenn bei 250ms)
Call WAITschnell wenn Counter >= 10
return
Wait
Lange Schleife
z.B. 10ms
return
WAITschnell
Kurze Schleife
z.B 1ms
Return
So etwa habe ich mir das vorgestellt im Ablaufplan.
Nun will ich das umsetzen in Assembler.
Konstante festlegen: Counter und Endwert
Counter und Endwert(10) am Anfang festlegen.
MOVLW 10
MOWF Endwert
Dann in UPlinks:
Endwert in w laden
MOVLW Endwert
SUBLW Counter
Sobald das Flag Z auf 0 ist ist der Endwert erreicht und das Programm soll ab dann immer in WAITschnell springen, bis im Hauptprogramm der Eingang wieder auf Null geht.
BTFSC Status,Z
call WAIT
BTFSS Status,Z
call WAITschnell
Soll so funktionieren wie das verstellen einer Digitaluhr.
Genaue Zeiten sind nicht so wichtig.
Benötige zum Fein-Einstellen etwa 1 Impuls pro Sekunde und dann für schnell max 100 Hz damit ich keine Schritte verliere.
Kann ich aber an der Hardware testen.
Das Umsetzen auf einfache Weise im Assembler ist mein Problem.
Leider gibt es wenig Codeschnipsel mit anständigen Kommentaren um das zu lernen.
Habe mehrere Tage gebraucht um das Grundprogramm zum laufen zu bringen.
Anfangs-Probleme:Falsche config.., Analoge Eingänge statt Digitale, bfc statt bfs etc.
learning by doing
Jetzt muss ich halt rausfinden wie man das umsetzt, ohne zu kompliziert zu werden.
Natürlich kann man auch Timer1 und 2 einsetzen und genaue Zeiten ausrechnen.
Da zu braucht es aber noch mehr Wissen.
Aber warum mit Kanonen auf Spatzen schießen?
MfG Bernd