-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: PIC 12F675 Tastendruckzeit auswerten in Assembler

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2013
    Ort
    Lebach, Germany
    Alter
    55
    Beiträge
    6

    PIC 12F675 Tastendruckzeit auswerten in Assembler

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    938
    Hallo Bernd.

    Es vereinfacht in vielen Fällen die Programmieraufgabe ungemein, wenn das Programm ein Nebeneinander von asynchronem Hauptprogramm und mit fester Frequenz aufgerufener Interruptroutine realisiert.
    Der Controller prüft dann z.B. in festen Zeitabständen die Signale der Hardware, z.B. den Tastereingang und verdichtet diese Inputs zu Systemzuständen, z.B. 'Taste nicht gedrückt' oder 'Taste seit nn Millisekunden ununterbrochen gedrückt' oder noch weiter verdichtet zur Benutzereingabe 'Feinpositionierung' und 'Eilgang', jeweils abgeleitet aus nn.
    Dazu wird bei jedem Durchlauf der ISR (Interrupt Service Routine) ein Zähler um eins erhöht, wenn die Taste gedrückt ist, oder aber ausgewertet und genullt, wenn sie nicht gedrückt ist. Zeiten <20 Millisekunden betrachtet man dann als Kontaktprellen, Werte größer xx als Feinpositionierung, größer yy als Eilgang; das alles passt i.d.R. locker in die ISR bei z.B. 1ms ISR-Zyklus und 4MHz Prozessortakt.
    Auf diese Weise ist auch eine schnell reagierende Notabschaltung machbar, die selbst dann funktioniert, wenn das Hauptprogramm vielleicht gerade auf Daten von der seriellen Schnittstelle wartet, die langwierige Fütterung einer LCD-Anzeige abarbeitet oder gar in einer Endlosschleife hängt!

    Die ISR kann auch gut die Erzeugung der Schrittmotorimpulse übernehmen. Feinpositionierung und Eilgang unterscheiden sich ja nur dadurch, dass ein 1ms-Interrupt (das ist mein Liebling) nur bei jedem 200sten oder jedem zweiten (Beispielwerte!) Aufruf einen Schrittmotorimpuls ausgibt. Dazu braucht es noch nicht mal ein Hauptprogramm.

    Ist jetzt eine wenig klarer geworden, wie die Lösung aussehen kann? Wenn nicht, dann frag ruhig noch mal nach.

    Gruß
    Christian.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2013
    Ort
    Lebach, Germany
    Alter
    55
    Beiträge
    6

    Frage Tastendruck auswerten, Schnelle Impulse oder langsame Ausgeben

    Hallo Christian
    Habe mein Grundprogramm mal angehängt:
    Impulsgeber_Fertig_ohne_Takt_Erhöhung_2.txt

    Sorry, habe gar nichts verstanden.
    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

  4. #4
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.969
    Hallo!

    Fürs Lernen kann's nicht schaden: http://www.roboternetz.de/wissen/ind.../PIC_Assembler . Leider kann ich dir nicht helfen, weil ich die Mnemonics vom ASM Quellcode aus unnötigem Text zu "fischen" hasse.
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2013
    Ort
    Lebach, Germany
    Alter
    55
    Beiträge
    6
    Zitat Zitat von PICture Beitrag anzeigen
    Hallo!

    Fürs Lernen kann's nicht schaden: http://www.roboternetz.de/wissen/ind.../PIC_Assembler . Leider kann ich dir nicht helfen, weil ich die Mnemonics vom ASM Quellcode aus unnötigem Text zu "fischen" hasse.
    Hallo
    Danke für den link.
    Was heißt das in Satz2 auf deutsch?
    Wie kann ich das anders beschreiben?
    VG Bernd

  6. #6
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.969
    Falls du "Mnemonics" meinst, sind es zugeordnete englische Namen für Maschinenbefehle (z.B. "movf", "bcf", "bsf", usw.), die als Binärzahlen für Menschen sehr unverständlich sind.

    Sorry, aber ich analisiere keine Quellcoden, wenn ich sie selber nicht brauche und fange immer mit Schaltplan + Zeitdiagrammen der Signale an.
    Geändert von PICture (16.05.2013 um 15:44 Uhr)
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2013
    Ort
    Lebach, Germany
    Alter
    55
    Beiträge
    6
    OK
    Sorry.
    Was ich nicht verstehe.Warum Antwortest Du, wenn Du nicht helfen willst und dich die Problemstellung nicht interessiert?

    Für mich war das die Frage, ob man das so umsetzen kann?

    Der "unnötige Text" sollte einfach nur erklären, was es bewirken soll.
    Nee, ich wollte wissen, was unter unnötigem Text zu verstehen ist.

    Schaltplan ist denke ich, hier nicht so relevant.
    Ein Eingang für LINKS drehen, ein Eingang für RECHTS drehen.
    Ein Ausgang für DIR, Ein Ausgang für Impuls.
    Signalverlauf: Beide Eingänge AUS, beide Ausgänge AUS
    Eingang LINKS bis etwa 5 Sekunden ein, Ausgang DIR AUS, Ausgang Impuls EIN/AUS 50ms Takt
    Eingang LINKS größer 5 Sekunden ein, Ausgang DIR AUS, Ausgang Impuls EIN/AUS 10ms Takt

    Das gleiche für RECHTS.
    Nur der Vollständigkeit halber.
    Falls sich noch jemand findet der mir da weiterhelfen will.
    Danke.

    Bernd

    Höflichkeit ist eine Zier, weiter kommt man ohne Ihr.

  8. #8
    Erfahrener Benutzer Lebende Robotik Legende Avatar von PICture
    Registriert seit
    10.10.2005
    Ort
    Freyung bei Passau in Bayern
    Alter
    66
    Beiträge
    10.969
    Zitat Zitat von DL4VAL Beitrag anzeigen
    Was ich nicht verstehe.Warum Antwortest Du, wenn Du nicht helfen willst und dich die Problemstellung nicht interessiert?
    Ich habe beantwortet, weil ich jedem helfen will. Dafür muss ich mir jedoch das Problem vorstellen können, was aber bisher leider nicht möglich war.

    Zitat Zitat von DL4VAL Beitrag anzeigen
    Schaltplan ist denke ich, hier nicht so relevant.
    Ich habe nur µC Beschaltung von Ein- und Ausgängen gemeint, möchte aber darüber nicht diskutieren.

    Ausserdem anstatt "learning by doing" ist "learning befor doing" sicher effizienter.
    Geändert von PICture (16.05.2013 um 20:31 Uhr)
    MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    938
    Bevor die Diskussion weiter entgleitet: Ich denke, jeder wird mit der Zeit seine eigene bevorzugte Herangehensweise an neue Dinge entwickeln - und die scheinen nicht immer kompatibel zu einander zu sein. Vielleicht lässt man das einfach so stehen.

    @DL4VAL
    Ich selbst bin froh, wenn ich mich nach einem halben Jahr im Source-Konzept eines abgeschlossenen Hobbyprojekts wieder zurecht finde. Bis auf wenige Detaillösungen habe ich mir allen Sourcecode meiner Projekte Schritt für Schritt selbst erarbeitet und zum funktionieren gebracht.
    Diesen Weg und die damit verbundenen Erfolgserlebnisse will ich dir gar nicht ersparen bzw. vorenthalten. (Wenn du da Faulheit herausliest, würde ich das nicht mal dementieren).

    In den angehängten Quelltext mag ich mich nicht im Detail(siehe oben) einlesen. Allerdings hab ich nach dem org 0x00 ein 'goto Init' gesehen, da würde ich immer ein 'call Init' erwarten, damit der Programmfluss auch wieder zurück kommt und dann das 'goto main' ausführt (goto ist hier möglich aber unfein). Mich wunderts, dass überhaupt was halbwegs sinnvolles passiert.

    Ich schlage stattdessen vor bzw. empfehle dir:
    - fang mit der Einrichtung eines Timerinterrupts an, z.B. 1ms Zyklus.(d.h. Prescaler, Timer-Config, Preloadwert setzen, PIE & GIE-Register passend machen)
    - dann lass je Durchlauf eine Zählervariable inkrementieren
    - werte das Bit 7 der Zählervariable aus: wenn gesetzt, dann LED einschalten, andernfalls LED ausschalten
    Fertig ist eine Blinkfunktionalität (wenngleich vermutlich zu hektisch)

    Dann: baue eine Delayfunktion in der ISR, die den Controller nicht für andere Aufgaben blockiert:
    - wenn restzeit > 0, dann dekrementiere restzeit
    - wenn restzeit == 0, dann
    - invertiere den Pegel auf der Steppertreiber-Pulsleitung ; das ist der eigentliche Nutzen
    - setze restzeit auf den Startwert
    Fertig ist die frequenzstabile Pulserzeugung für den Steppertreiber

    Wenn die Pulserzeugung klappt, kannst du die Richtungssteuerung dazubauen

    Dann vielleicht die Zeitmessung für die EIN-Zeit einer Taste (wie bereits beschrieben)
    und so weiter ...

    Spiele mit den Möglichkeiten, sammle Erfahrung und lass das Datenblatt nicht kalt werden.

    Gruß
    RoboHolIC

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2013
    Ort
    Lebach, Germany
    Alter
    55
    Beiträge
    6
    Zitat Zitat von RoboHolIC Beitrag anzeigen
    Bevor die Diskussion weiter entgleitet: Ich denke, jeder wird mit der Zeit seine eigene bevorzugte Herangehensweise an neue Dinge entwickeln - und die scheinen nicht immer kompatibel zu einander zu sein. Vielleicht lässt man das einfach so stehen.

    @DL4VAL
    Ich selbst bin froh, wenn ich mich nach einem halben Jahr im Source-Konzept eines abgeschlossenen Hobbyprojekts wieder zurecht finde. Bis auf wenige Detaillösungen habe ich mir allen Sourcecode meiner Projekte Schritt für Schritt selbst erarbeitet und zum funktionieren gebracht.
    Diesen Weg und die damit verbundenen Erfolgserlebnisse will ich dir gar nicht ersparen bzw. vorenthalten. (Wenn du da Faulheit herausliest, würde ich das nicht mal dementieren).

    In den angehängten Quelltext mag ich mich nicht im Detail(siehe oben) einlesen. Allerdings hab ich nach dem org 0x00 ein 'goto Init' gesehen, da würde ich immer ein 'call Init' erwarten, damit der Programmfluss auch wieder zurück kommt und dann das 'goto main' ausführt (goto ist hier möglich aber unfein). Mich wunderts, dass überhaupt was halbwegs sinnvolles passiert.

    Ich schlage stattdessen vor bzw. empfehle dir:
    - fang mit der Einrichtung eines Timerinterrupts an, z.B. 1ms Zyklus.(d.h. Prescaler, Timer-Config, Preloadwert setzen, PIE & GIE-Register passend machen)
    - dann lass je Durchlauf eine Zählervariable inkrementieren
    - werte das Bit 7 der Zählervariable aus: wenn gesetzt, dann LED einschalten, andernfalls LED ausschalten
    Fertig ist eine Blinkfunktionalität (wenngleich vermutlich zu hektisch)

    Dann: baue eine Delayfunktion in der ISR, die den Controller nicht für andere Aufgaben blockiert:
    - wenn restzeit > 0, dann dekrementiere restzeit
    - wenn restzeit == 0, dann
    - invertiere den Pegel auf der Steppertreiber-Pulsleitung ; das ist der eigentliche Nutzen
    - setze restzeit auf den Startwert
    Fertig ist die frequenzstabile Pulserzeugung für den Steppertreiber

    Wenn die Pulserzeugung klappt, kannst du die Richtungssteuerung dazubauen

    Dann vielleicht die Zeitmessung für die EIN-Zeit einer Taste (wie bereits beschrieben)
    und so weiter ...

    Spiele mit den Möglichkeiten, sammle Erfahrung und lass das Datenblatt nicht kalt werden.

    Gruß
    RoboHolIC
    Hallo RoboHolIC
    Danke für die Antwort.
    Da ich schon seit Jahren Excel-VBA beruflich programmiere, weiß ich was Du meinst.
    Nur habe ich mir verschiedene Funktionen geschrieben, die ich als Baustein immer wieder einsetzen kann.
    Spart natürlich Arbeit.
    Irgendwann habe ich auch das "unnötige" Kommentieren angefangen. (Sorry, sollte jetzt keine Anspielung auf vorhergehendes sein)
    Das Kommentieren habe ich Anfangs aus Faulheit auch weggelassen. Nachträglich aber eingefügt, um wieder zu verstehen was abläuft.
    Ich dachte für Assembler gibt es vielleicht auch so "Bausteine" die man einsetzen kann.
    Im Codesys gibt es auch vordefinierte Bausteine und xxx.lib die man verwenden kann.

    Zum Lernen:
    PIC`s (Assembler) sind wie alle, einem selbst neu, neuen Programmiersprachen erst mal sehr unübersichtlich.(Befehle sind nicht in Kopf)
    Einfache Beispiele zum Einarbeiten habe ich bei Sprut gefunden. Ich habe stundenlang verschiedene Sachen gelesen.
    Ein einfaches Beispiel mit Kommentaren, in dem nur ein Eingang digital abgefragt wird und dann z.B. eine LED an einem Ausgang AN/AUS geht habe ich nicht gefunden. "Hallo Welt" für Assembler
    Die Informationen mit analog/digital Eingang und das man die am Anfang (INIT) umstellen muss, konnte ich nur mühsam finden.
    Wie Sprut auf seiner Seite schreibt: Er hat noch kein gutes Buch zu PIC`s gefunden. Danke an Sprut seine Seiten sind super.
    Wenn das Projekt fertig ist, stelle ich den kommentierten Quelltext ein. Habe gelesen, dass viele Anfänger mit solche Problemen kämpfen.

    OK, wird jetzt alles zu lang.
    Meine Schaltung funktioniert jetzt ja, soweit. Habe mir auch so meine Gedanken über Lösungen der schnelleren Taktausgabe gemacht.
    Verschiedene Sachen aus meiner Siemens S5 Zeit, wie Merker etc. sind mir da wieder in den Sinn gekommen.


    Ich werde auch noch googeln was die ISR ist.
    GOTO und REM aus meiner Basiczeit, werde ich dann auch durch Call und ; ersetzen. Danke.
    Das mit den Timern vom 12F675 werde ich ausprobieren, wenn das Teil über die Verzögerungs-Schleifen läuft.
    Schön das man einen PIC mehrmals brennen kann.

    Dann Danke mal vorerst.

    Gruß Bernd
    Geändert von DL4VAL (17.05.2013 um 13:52 Uhr) Grund: Schreibfehlerteufel

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Problem mit XORLW [PIC 12F675]
    Von TimoH im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 06.12.2010, 11:10
  2. pic 12f675 geht nicht
    Von martini007 im Forum PIC Controller
    Antworten: 12
    Letzter Beitrag: 01.12.2009, 19:50
  3. PIC 12F675 kaputt??
    Von martini007 im Forum PIC Controller
    Antworten: 7
    Letzter Beitrag: 18.10.2009, 13:58
  4. Interne Pull-Up beim PIC (12F675) - WIE einrichten?
    Von Radfahrer im Forum PIC Controller
    Antworten: 3
    Letzter Beitrag: 14.10.2009, 19:32
  5. Zeichen von PIC 12F675 über Rs232 versenden
    Von der dritte Mann im Forum PIC Controller
    Antworten: 0
    Letzter Beitrag: 22.11.2005, 21:30

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •