Chrony mit Atmega8

Gast #2595320
Lesenswert?

Hallo,

ich möchte mir mit 2 Lichtschranken einem LCD Display und einem Atmega8 
ein Chronometer, also ein Geschwindigkeits Messgerät für Geschosse 
(Paintball Kugeln) bauen. Ein Paintball Markierer sollte etwa 300FPS 
(ca. 91m/s oder 330km/h) haben.

Das Programm hab ich erst mal aus Google Funden zusammen geschustert.
Es sollte sobald die Kugel die 1. Lichtschranke erreicht eine Zeit zum 
zählen anfangen und sobald sie die, 10cm entfernte 2. erreicht die Zeit 
speichern, umrechnen (am besten in FPS und m/s) und am Display anzeigen.
Wenn noch eine Kugel an den Lichtschranken vorbeikommt sollte wieder die 
dasselbe passieren.
1
$regfile = "m8def.dat"
2
$crystal = 3686400
3
$hwstack = 100
4
$swstack = 100
5
$framesize = 100
6

7
Config Lcdpin = Pin , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , _
8
Db7 = Portd.3 , E = Portd.5 , Rs = Portd.4
9
Config Lcd = 16 * 2
10

11
Config Timer1 = Timer , Prescale = 256
12
Config Pinb.0 = Input
13
Config Pinb.1 = Input
14

15
Config Single = Scientific , Digits = 4
16
Dim Geschwindigkeit As Single
17
Dim Zeit As Single
18
Dim Y As Word
19

20

21
Do
22
If Pinb.0 = 0 Then
23
Timer1 = 0
24
Exit Do
25
End If
26
Loop
27

28
Do
29
If Pinb.1 = 0 Then
30
Y = Timer1
31
Exit Do
32
End If
33
Loop
34

35

36
Cls
37
Zeit = Y * 0.00256
38
Geschwindigkeit = 10 / Zeit
39
Locate 1 , 1
40
Lcd Geschwindigkeit
41
Locate 2 , 1
42
Lcd "m/s"
43

44
Return
45
End

Also mal meine Probleme:
1. Der Timer zählt soweit ich das verstanden habe mit Quarz 
Fequenz/Prescale 3,686400MHz/256=0,0144? also springt der Timer auf 1 
nach 0,0144ms?
2. Wieso funktioniert mit 16*1 Einstellung das Display nur zur Hälfte?
3. Wäre ein 4Mhz Quarz für so eine Messung besser geeignet wegen den 
Umrechnungen (Nachkomastellen)?
4. Wie kann man eine Gleitkomazahl auf eine Ganzzahl oder eine Kommazahl 
mit 2 Nachkomastellen runden?
5. Verbesserungs Vorschläge?

Display: 
http://www.produktinfo.conrad.com/datenblaetter/175000-199999/183261-da-01-en-LCD_Modul_16x1_Zeichen_LED.pdf
Lichtschranke:
http://www.pollin.de/shop/downloads/D120592D.PDF

Danke in Voraus
Gisi
Gast #2595647
Lesenswert?

Der Timer wird mit einer Frequenz von 3,686400MHz/256=14400Hz getaktet.

Timer1 ist ein 16-Bit Timer. Nach 2^16=65536 Takten springt er wieder 
auf null.

Dazu benötigt er 65536/14400Hz = 4,5 Sekunden.

Die Schleifen:

do
Timer1 = 0
loop until PINC.0=0

do
y=timer1
loop until PINC.1=0



Joe
Gast #2596923
Lesenswert?

Sorry, Dein Code ist ganz schön.....Einfach die "Do Loop" zu verlassen, 
und in eine neue Endlosschleife einzusteigen, sollte man vermeiden. Ich 
fürchte, so sonderlich genau wird Deine Messung so nicht sein. Würde es 
so versuchen:
1
Bitwait Pinc.0 , Reset                              
2
Start Timer1
3
Bitwait Pinc.1 , Reset                            
4
Stop Timer1
5
Number_of_Ticks = TCNT1
6
....
7
TCNT1=0

Schau dir mal den Befehl "Bitwait" an. Da kannst Du Dir "If Then" 
sparen. TCNT1 ist ein 16-Bit Pseudoregister und enthält die Zahl der 
Takte zwischen Deinen beiden Ereignissen. Die kannst Du mit Hilfe der 
Frequenz des Quarzes in Sekunden umrechnen.

Mit "Format" oder "Fusing" kannst Du Strings/Zahlen formatiert ausgeben.
Gast #2597137
Lesenswert?

Ah jetzt hab ichs geschnallt....

dann muss ja jetzt nur noch meine Rechnung stimmen:
1
Zeit = Y / 14.4
2
Mps = 100 / Zeit

Den Wert von Timer (Y) bekomme durch die Timer Frequenz die ich /100 
genommen habe (das ich den Weg für die Zeit Berechnung in cm angeben 
kann)

Könnte doch stimmen oder?
Gast #2597579
Lesenswert?

Irgendwas stimmt wohl noch nicht. das Ergebnis ist mehr willkürlich und 
manchmal bleibt alles hängen. Mit dem Format bin ich noch etwas am 
knobeln und Habs erst mal so gelassen.
1
Dim Mps As Single
2
Dim Fps As Single
3
Dim Y As Word
4
Dim Zeit As Single
5

6
Bitwait Pinc.0 , Reset
7
Start Timer1
8
Bitwait Pinc.1 , Reset
9
Stop Timer1
10
Y = Tcnt1
11

12
Tcnt1 = 0
13

14
Cls
15
Zeit = Y / 144
16
Mps = 1 / Zeit
17
Fps = Mps * 3.280839895013123
18
Locate 1 , 1
19
Lcd Mps
20
Locate 1 , 6
21
Lcd "m/s"
22
Locate 2 , 1
23
Lcd Fps
24
Locate 2 , 6
25
Lcd "FPS"

Kann es sein das ich für das Tcnt1 = 0 einen besseren Platz suchen muss?
Und ich hab mal gehört, dass der Timer1 sowieso immer weiter rennt wegen 
dem Start/Stop, ist da was dran?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren