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