Chrony mit Atmega8

Gast #2595320
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
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 #2596882
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
Gast #2596923
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 #2597085
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.
Gast #2597137
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 #2597217
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.
Gast #2597579
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.