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.
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
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.
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
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
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.
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.
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?
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.
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
DimMpsAsSingle
2
DimFpsAsSingle
3
DimYAsWord
4
DimZeitAsSingle
5
6
BitwaitPinc.0,Reset
7
StartTimer1
8
BitwaitPinc.1,Reset
9
StopTimer1
10
Y=Tcnt1
11
12
Tcnt1=0
13
14
Cls
15
Zeit=Y/144
16
Mps=1/Zeit
17
Fps=Mps*3.280839895013123
18
Locate1,1
19
LcdMps
20
Locate1,6
21
Lcd"m/s"
22
Locate2,1
23
LcdFps
24
Locate2,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?