D35troy3r
28.01.2012, 12:17
Hallo!
Bin gerade dabei eine Geschwindigkeitsmessung für Luftgewehre etc aufzubauen. Soweit so gut, ich habe nun 2 Lichtschranken im Abstand von 6cm aufgebaut. Der Mikrocontroller (Atmega8 ) soll die Zeit in us messen und die Geschwindigkeit in m/s auf einem Display wiedergeben.
Mein Aufbau funktioniert ganz gut, nur bei der Programmierung sitzt warscheinlich ein Fehler...
Denn bei einem ersten richtigen Test wo die Projektilgeschwindigkeit knappe 20m/s betrug zeigt er mir etwa 150m/s an :(.
Zur Funktion:
Das Projektil passiert Lichtschranke 1 und setzt Variable X = 1. Bei jedem Interrupt des Timers wird Y erhöht, solange bis Lichtschranke 2 unterbrochen und X auf 0 gesetzt wurde. Folglich wird die Geschwindigkeit ausgerechnet und auf dem Display für 30ms angezeigt. Durch den Timer ist es aber wesentlich länger als 30ms...
Die ADC-Werte von Licht1, Licht2, Licht3 und Licht4 werden verglichen damit X erst ab einem Wert unter 1022 verändert wird.
Das ganze wurde mit Bascom programmiert:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 100
$swstack = 100
$framesize = 100
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Config Timer1 = Timer , Prescale = 8
Enable Timer1
On Timer1 Takt
Enable Interrupts
Timer1 = 65534
Dim Licht1 As Integer
Dim Licht2 As Integer
Dim Licht3 As Integer
Dim Licht4 As Integer
Dim X As Bit
Dim Y As Word
Config Single = Scientific , Digits = 4
Dim Geschwindigkeit As Single
Licht3 = Getadc(4)
Licht4 = Getadc(5)
Cls
Do
Licht1 = Getadc(4) + 2
If Licht1 < Licht3 Then X = 0
Licht2 = Getadc(5) + 2
If Licht2 < Licht4 Then X = 1
If X = 0 And Y > 0 Then
Geschwindigkeit = 60000 / Y
Locate 2 , 2
Lcd Geschwindigkeit ; "m/S"
Y = 0
Waitms 30
Cls
End If
Loop
End
Takt:
Timer1 = 65534
If X = 1 Then Incr Y
Return
Durch den Timer verlangsamt sich die Ausgabe auf dem Display extrem....könnte man da was machen?
Findet ihr einen Fehler bzw einen Verbesserungsvorschlag?
Wieso stimmt die Ausgabe auf dem Display nicht?
Vielen Dank im vorraus! :)
Gruß
D35troy3r
Bin gerade dabei eine Geschwindigkeitsmessung für Luftgewehre etc aufzubauen. Soweit so gut, ich habe nun 2 Lichtschranken im Abstand von 6cm aufgebaut. Der Mikrocontroller (Atmega8 ) soll die Zeit in us messen und die Geschwindigkeit in m/s auf einem Display wiedergeben.
Mein Aufbau funktioniert ganz gut, nur bei der Programmierung sitzt warscheinlich ein Fehler...
Denn bei einem ersten richtigen Test wo die Projektilgeschwindigkeit knappe 20m/s betrug zeigt er mir etwa 150m/s an :(.
Zur Funktion:
Das Projektil passiert Lichtschranke 1 und setzt Variable X = 1. Bei jedem Interrupt des Timers wird Y erhöht, solange bis Lichtschranke 2 unterbrochen und X auf 0 gesetzt wurde. Folglich wird die Geschwindigkeit ausgerechnet und auf dem Display für 30ms angezeigt. Durch den Timer ist es aber wesentlich länger als 30ms...
Die ADC-Werte von Licht1, Licht2, Licht3 und Licht4 werden verglichen damit X erst ab einem Wert unter 1022 verändert wird.
Das ganze wurde mit Bascom programmiert:
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 100
$swstack = 100
$framesize = 100
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , _
Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Config Timer1 = Timer , Prescale = 8
Enable Timer1
On Timer1 Takt
Enable Interrupts
Timer1 = 65534
Dim Licht1 As Integer
Dim Licht2 As Integer
Dim Licht3 As Integer
Dim Licht4 As Integer
Dim X As Bit
Dim Y As Word
Config Single = Scientific , Digits = 4
Dim Geschwindigkeit As Single
Licht3 = Getadc(4)
Licht4 = Getadc(5)
Cls
Do
Licht1 = Getadc(4) + 2
If Licht1 < Licht3 Then X = 0
Licht2 = Getadc(5) + 2
If Licht2 < Licht4 Then X = 1
If X = 0 And Y > 0 Then
Geschwindigkeit = 60000 / Y
Locate 2 , 2
Lcd Geschwindigkeit ; "m/S"
Y = 0
Waitms 30
Cls
End If
Loop
End
Takt:
Timer1 = 65534
If X = 1 Then Incr Y
Return
Durch den Timer verlangsamt sich die Ausgabe auf dem Display extrem....könnte man da was machen?
Findet ihr einen Fehler bzw einen Verbesserungsvorschlag?
Wieso stimmt die Ausgabe auf dem Display nicht?
Vielen Dank im vorraus! :)
Gruß
D35troy3r