Forum: Mikrocontroller und Digitale Elektronik Chrony mit Atmega8


von Gisi (Gast)


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

von Hubert G. (hubertg)


Lesenswert?

Die Quarzfrequenz ist nur dekadisch krumm.
Dein Display wird ein 2 x 8 sein.
Bei Bascom kann ich dir nicht helfen.
Ich würde für deinen Zweck Input Capture nehmen.

von Joe (Gast)


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

von Gisi (Gast)


Lesenswert?

Gleich mal die Schleife und die Rechnung geändert, funkt super danke.
Jetzt möchte ich nur noch die Zahl runden, auf 2 Nachkommastellen und 
auf eine Ganzzahl jemand eine Ahnung wie das geht?

Gisi

von Karl (Gast)


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.

von Gisi (Gast)


Lesenswert?

Also Format und Fusing hab ich hin bekommen.
Bitwait verstehe ich, aber das Number_of_Ticks = TCNT1 nicht wirklich.

Danke
Gisi

von Karl (Gast)


Lesenswert?

Ist einfach die Zahl der Takte. Hast du ja oben schon so ähnlich 
implementiert. Wenn ich mich jetzt nicht verrechnet habe, bei einem 
Prescale von 256 mit 3,686400MHz ist 1s = 51136.

von Karl (Gast)


Lesenswert?

äh, 65536 - 51136, meinte ich.

von Gisi (Gast)


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?

von Karl (Gast)


Lesenswert?

ja, sollte passen

mps=0,1*Y/14400

Könntest bei Bedarf auch alles auf Integer umstellen und mit Format die 
Ausgabe machen. Muss aber auch nicht, wenn der µC mitspielt.

von Gisi (Gast)


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?

von Karl (Gast)


Lesenswert?

Also das kann natürlich auch mit dem Aufbau zusammenhängen. Wenn etwas 
hängt.. Bitwait wartet natürlich so lange, bis etwas passiert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.