- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 12 von 12

Thema: Zeit zwischen 2 Flanken messen

  1. #11
    RN-Premium User Roboter Genie Avatar von 5Volt-Junkie
    Registriert seit
    05.03.2008
    Alter
    36
    Beiträge
    947
    Anzeige

    Praxistest und DIY Projekte
    So, ich bins wieder

    Ich habe mein Programm jetzt etwas umgestrickt, da nach meinen Berechnungen >65000 Timer1-Takte vollkommen ausreichen sollten.

    Nur das Programm will irgendwie nicht so, wie ich das will.

    Wie man im Code sehen kann, gebe ich die Geschwindigkeit und Momentanwert des Timers aus. Wert des Timer schwank hin und her, was auch i.O. ist aber die Geschwindigkeit nimmt nur einige werte an und zwar "0-5 oder 17 aber meistens 343" Wobei bei 343, als Timerwert 120 angezeigt wird.

    *kopfkratz*



    Code:
    'Geschwindigkeit in FPS (Foot per Second) messen und ausgeben.
    'Foot = 12 Inch
    'Weg = 6 Inch (Abstand zwischen den Lichtschranken )
    'Wenn die erste Lichtschranke (INT0) angesprochen wird, beginnt der Timer, die µs zu zählen
    'Beim Durchbrechen der zweiten Lichtschranke (INT0), stoppt der Timer, rechnet die Geschwindigkeit aus und zeigt diese auf dem LCD an.
    
    'Maximale Geschwindigkeit = 300FPS
    'Minimale Geschwindigkeit = 180FPS
    
    
    'Minimale Zeit zwischen Int0 und Int1 1,667ms
    'Maximale Zeit    "      "    "   "    2,778ms
    
    'Timer1 ohne Prescaler = 65535 Takte = 65,535ms
    
    
    $regfile = "m8def.dat"
    $crystal = 10000000
    '===============================================================================
    
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
    Initlcd
    Cursor Off Noblink
    Cls
    
    'Interrupt-Pins konfigurieren======================================================================
    On Int0 Timerstart
    On Int1 Timerstopp
    Ddrd = &B00000000                                           'PortD als Eingang
    Portd = &B11111111                                          'Pull-Ups von Int0 und Int1 einschalten
    Mcucr = &B00001010                                          'Interrupt bei H/L-Flanke
    Gicr = &B11000000                                           'Interrupts int0 und int1 einschalten
    Sreg.7 = 1                                                  'Interrupts freigeben
    
    
    '===============================================================================
    
    'Timer-Konfiguration============================================================
    Config Timer1 = Timer , Prescale = 1
    On Timer1 Ovf                                               'Bei Timerueberlauf springe zu Ovf-Routine
    
    
    Disable Timer1                                              'Timer1 ausschalten
    Waitms 10                                                   'Warte
    Timer1 = 0                                                  'Timer1 mit 0 vorladen
    
    
    Enable Interrupts                                           'Interrupts An
    
    
    Dim Elapsed As Word                                         'Var. Elapsed fuer gemessene Zeit als Word
    Dim V As Word                                               'Geschwindigkeit als Word
    V = 0
    
    
    Const Mikrosek = 500000                                     'Konst. Wert in die Var. Mikrosek
    Const S = 1
    
    
    Dim Ueberlauf As Byte                                       'Variable fuer Timerueberlaeufe als Byte
    Ueberlauf = 0
    
    
     Enable Timer1
    
    
    'Hauptschleife
    Do
    
    Loop
    End
    
    
    'Sub-Routinen===================================================================
    
    'Bei INT0
    Timerstart:
    
    
    Timer1 = 0                                                  'Timer auf 0 setzen
    Start Timer1                                               'Timer1 starten
    Return
    '====================
    
    'Bei INT1
    Timerstopp:
    
    Stop Timer1                                                 'Timer1 stoppen
    Elapsed = Timer1                                            'Timer-Wert in Elapsed speichern
    
    V = Mikrosek / Elapsed                                      'Geschwindigkeit berechnen
    Cls
    Locate 1 , 1
    Lcd V
    
    Locate 2 , 1
    Lcd Elapsed                                                 'Geschwindigkeit ausgeben
    Waitms 1000
    
                                                      'Timer auf 0 setzen
    Elapsed = 0
    
    V = 0                                                       'Geschwindigkeit auf 0 setzen
    Return
    
    Ovf:
    Incr Ueberlauf
    Return

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Gib mal dies noch mit an:
    $hwstack = 32
    $swstack = 10
    $framesize = 40

    Und dimensioniere V als Long, sonst funktioniert dies nicht:

    Const Mikrosek = 500000
    V = Mikrosek / Elapsed

    Beide Operanden müssen in den Ergebnistyp passen.

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Labornetzteil AliExpress