KM/h Messung mit 2 Lichtschranken?
Hallo,
ich möchte mit 2 Lichtschranken die Geschwindigkeit meines RC-Autos messen.
Jede Lichtschranke ist an einem Interrupteingang des µC.
Ich benutze einen MEGA 8. Kann ich den internen Taktgeber nutzen oder sollte ich einen richtigen Quarz nehmen?
Hier mein (fast) fertiges Programm. Ich konnte es leider noch nicht testen, da die Hardware nocht nicht fertig ist(habe hier nur µC mit zwei Tastern):
Code:
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m8def.dat" 'MEGA8-Deklarationen
$hwstack = 32
$swstack = 8
$framesize = 24
$crystal = 8000000
$baud = 9600 'Baudrate definieren
'-------------------------------------------------------------------------------
'Ein / Ausgänge definieren:
Ddrd = &B00000000 '0=Eingang
'-------------------------------------------------------------------------------
'Variablen
Dim Schritte As Word 'Wert vom Timer
Dim Schritte_old As Word
Dim Kmh As Single
Dim Sperre As Byte '1= gesperrt, wenn Lichtschranke 1 betätigt wurde
'2= gesperrt, wenn Lichtschranke 2 betätigt wurde
'-------------------------------------------------------------------------------
'Timer1
Config Timer1 = Timer , Prescale = 256 'Teiler
Enable Timer1
Enable Interrupts
On Timer1 Errorhandler
Config Int0 = Rising 'Falling
Enable Interrupts 'einschalten Der Interrupts
Enable Int0 'einschalten Von Interrupt Int0
On Int0 Isr0
Config Int1 = Rising 'Falling
Enable Interrupts 'einschalten Der Interrupts
Enable Int1 'einschalten Von Interrupt Int0
On Int1 Isr1
'-------------------------------------------------------------------------------
'-------------------------------------------------------------------------------
Do 'Hauptschleife
If Schritte_old = Schritte Then 'Vergleich, ob neuer Messwert vorhanden oder nicht
'nix
Else
Kmh = 33750 / Schritte 'Timerwert in KM/h umrechnen
Print "Geschwindigkeit: " ; Fusing(kmh , "###.#" ) ; " KM/h"
Schritte_old = Schritte
End If
Loop
'-------------------------------------------------------------------------------
Isr0: 'Aufruf bei Lichtschranke 1 per Interrupt
If Sperre = 0 Then
Timer1 = 0 'Timer auf 0 setzen
Sperre = 1 'für Lichtschranke 1 sperren
End If
'Print "int0 geht" 'nur zum testen
Return
Isr1: 'Aufruf bei Lichtschranke 2 per Interrupt
If Sperre = 1 Then
Schritte = Timer1 'Timerwert übernehmen
Sperre = 2 'für Lichtschranke 1 UND 2 sperren
End If
'Print "int1 geht" 'nur zum testen
Return
Errorhandler: 'wenn Timer1 überläuft
Sperre = 0 'nächste Messung freigeben
'Print "ÜBERLAUF" 'nur zum testen
Return
kurze Beschreibung:
Die 1te Lichtschranke setzt den Timer1 auf 0. Die zweite Lichtschranke schreibt den Wert vom Timer1 in eine Variable. Da die Lichtschranken einen festen Abstand von 30cm haben kann in der Do...Loop in KM/h umgerechnet werden. Die beiden Lichtschranken zählen eine Variable hoch, um versehentliches doppelt betätigen einer Lichtschranke zu verhindern. Wenn der Timer1 nach ca 2 Sekunden Überläuft, wird die Variable zurückgesetzt um für eine neue Messung bereit zu sein.
Zum testen kommt das Ergebnis nur über RS232, später soll es auf eine große 7-Segmentanzeige :-)
Tobias