-         

Ergebnis 1 bis 4 von 4

Thema: Problem Timer <-> Hauptprogramm

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2005
    Ort
    Ichtershausen
    Alter
    48
    Beiträge
    148

    Problem Timer <-> Hauptprogramm

    Anzeige

    Ich bin dabei eine Schrittmotorsteuerung zu implementieren. Dazu takte ich einen Schrittmotortreiber-IC. Der Takt wird über einen Timer erzeugt und in selbigem gleich der Schrittzähler mit hochgezählt bzw runter gezählt.

    Das Problem dabei ist, daß zwar der Timer wunderschön läuft und auch die entsprechenden Variable "Actualposition" setzt, aber das Hauptprogramm schlicht die Abbruchbedingung nicht auswertet.

    Beispiel:
    Actualposition =0 (integer)
    Value =10 (integer)
    bedeutet, daß der Timer 10 mal aufgerufen werden muss, bis die aktuelle Position des Motors der gewünschten Position (in Value) entspricht. Wenn beide gleich sind, dann soll die Do-Loop-Until Klausel verlassen werden und der Timer gestoppt. Danach wird die aktuelle Position ausgegeben. Passiert aber nicht.

    Ich habe das auch schon mit anderen Schleifen-Konstrukten wie While-Do usw. durchprobiert. Hat alles nix gebracht. Auch eine extra auswertung nochmal in der Schleife, wie im Codebeispiel hat mir nix gebracht. Die Abbruchbedingung wird nicht ausgeführt, sondern Actualposition läut munter weiter in die entsprechende Richtung.

    Muss da irgendwo noch ein Wait rein?

    Code:
    $crystal = 6000000  
    Config Timer0 = Timer , Prescale = 256
    On Timer0 Tim0_isr 
    
    Clock Alias Portc.2                                         
    Dirout Alias Portc.3
    ...
    
    
    'Hauptschleife
         Do
           If Actualposition = Value Then       'nur zum test hier nochmal auswerten
            Stop Timer0
           End If
         Loop Until Actualposition = Value                      'solange ungleich
        
         Stop Timer0
         Print Actualposition
    
    ...
    
    'ISR von Timer0
    Tim0_isr:
    
      Timer0 =  Stepdelay                                   ' zeit setzen
      Clock = Not Clock                                       ' negieren und damit takten'
      If Dirout = 0 Then                                        'Richtung auswerten
        Decr Actualposition
      Else
        Incr Actualposition
      End If
    
    Return

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Das mit dem Dirout ist ungünstig, da ja gesetzt wird Portc.3 und gelesen wird ja Pinc.3
    Setz wo einen eigenen Schalter "dim direct as Byte" und setze den und frage den
    Es ist besser, du machst die =value abfrage in der ISR, und der Timer macht dann Selbstmord.
    wenn der mal drüber ist, geht's ewig.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.11.2005
    Ort
    Ichtershausen
    Alter
    48
    Beiträge
    148
    Nun ja die Abfrage in den Timer bauen hatte ich ja auch schon vor gehabt. Das problem ist nur, daß ich mehrere verschiedenen Bedingungen abbilden muss. Vielleicht muss ich halt da noch ein wenig Nachdenken reinstecken.

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Werte verändern und abfragen sollte nur entweder in der ISR ODER im Hauptprogramm passieren. Es sind sonst immer KOnflikte möglich
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Berechtigungen

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