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):
kurze Beschreibung: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
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







Zitieren
Lesezeichen