Forum: Mikrocontroller und Digitale Elektronik BASCOM rechnet falsch / rundet komisch ?


von Stefan (Gast)


Lesenswert?

Ich habe zur Zeit das Projekt "Fahrrad-Tacho"-Eigenbau am laufen.

Ich arbeite mich Stück für Stück an die Mikrocontroller-Geschichte ran 
und lerne auch recht gut. Allerdings programmiere ich in Bascom, ich 
hoffe ich werde hier nicht gesteinigt.

Mein Problem aktuell ist, das beim Berechnen des Tageskilometerzählers 
Differenzen durch komische Abrundungen habe. Ich muss das Ergebnis 
später aufrunden, damit es richtig ist. Und das verstehe ich einfach 
nicht. Hier mein Quelltext:
1
$regfile = "M8def.dat"
2
$crystal = 8000000
3
$hwstack = 100
4
$swstack = 100
5
$framesize = 100
6
7
'Ports zuweisen
8
Reed Alias Pind.1
9
10
'Ports definieren
11
Config Reed = Input
12
13
'Variablen
14
Dim Radumfang As Integer
15
Dim Tagesstrecke As Single
16
Dim Umdrehungen As Integer
17
18
'Display
19
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , _
20
   Db7 = Portb.0 , E = Portb.7 , Rs = Portb.6
21
Config Lcd = 40 * 2
22
Cls
23
Cursor Off
24
25
'Radumfang in mm
26
Radumfang = 2120
27
28
29
30
Do
31
   Debounce Reed , 1 , On_reed_anschlag , Sub
32
Loop
33
34
35
On_reed_anschlag:
36
   Umdrehungen = Umdrehungen + 1
37
   Tagesstrecke = Radumfang * Umdrehungen
38
   Tagesstrecke = Tagesstrecke / 1000000
39
40
   Locate 1 , 1
41
   Lcd Radumfang ; " * " ; Umdrehungen ; " = "
42
   Locate 2 , 1
43
   Lcd Tagesstrecke ; " km"
44
Return


Ausgegeben wird das ganze auf einem Display, mit Anzeige der Umdrehungen 
und des Raddurchmessers von 2120 mm. Wenn ich mir mit diesem Code die 
Tagesstrecke anzeigen lasse, bekomme ich bei 100 Umdrehungen 0,21199995 
km heraus. Mein Taschenrechner kommt dort auf 0,2120 km.

Mittels der Funktion Fusing kann ich die Tagesstrecke ja aufrunden 
lassen, dann ist das korrekte Ergebnis da. Aber warum? Theoretisch 
müsste die Rechnung doch eindeutig das Ergebnis auch ohne Rundung 
korrekt sein.

Das beschäftigte mich gestern schon den ganzen Tag.
Hilfe!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 0,21199995
0,212 - 0,21199995 = 0,00000005
Das ist die Genauigkeit einer "normalen" Fließkommazahl.
Also: alles im grünen Bereich.

von Floh (Gast)


Lesenswert?

Stefan schrieb:
> 0,2120 km.

Diese Zahl lässt sich halt wahrscheinlich im Dualsystem mit einem Single 
nicht genau darstellen.
:-)

von Horst H. (horha)


Lesenswert?

Hallo,

das liegt an der begrenzten Genauigkeit von Fliesskommazahlen.
Im Dualzahlensystem ist 1/10 (1/100..   1/1000000.. ) eine unendlicher 
Bruch wird also nie genau sein.
Im Dezimalsystem wäre es genau rechenbar.
http://de.wikipedia.org/wiki/Maschinenzahl

von Stefan (Gast)


Lesenswert?

Danke soweit für die Antworten. Eine Genauigkeit von 0,00000005 sollte 
ja im Grunde genügen.

Um nun die Fahrgeschwindigkeit zu Berechnen, muss ich ja den 
zurückgelegten Weg durch die dafür benötigte Zeit teilen. Wie berechne 
ich das am besten mit Bascom und dem Atmega8?


- Zeit zwischen zwei Impulsen
- Zeit ab steigender Flanke bis zur absteigenden Flanke (
- Impulse pro Sekunde (zu ungenau, wenn mal ein Impulse 1 ms zu spät 
kommt)


Ich tendiere stark zur Zeitmessung zwischen zwei Impulsen. Aber wie 
bewerkstellige ich eine solche Messung mit den Timern?

Darüber überlege ich schon die ganze Zeit.

von Floh (Gast)


Lesenswert?

Stefan schrieb:

bei langsamen sachen das:
> - Zeit zwischen zwei Impulsen

bei schnelleren signalen das:
> - Impulse pro Sekunde (zu ungenau, wenn mal ein Impulse 1 ms zu spät
> kommt)

das würde ich so nicht machen, da du eine sehr hohe Zeitauflösung dafür 
brauchst:
> - Zeit ab steigender Flanke bis zur absteigenden Flanke (

:-)

von Falk B. (falk)


Lesenswert?

@  Stefan (Gast)

>zurückgelegten Weg durch die dafür benötigte Zeit teilen. Wie berechne
>ich das am besten mit Bascom und dem Atmega8?

Mit Festkommaarithmetik, hat auch den Vorteil, dass deine 
Fließkommarundungsfehler verschwinden.

>- Zeit zwischen zwei Impulsen

Genau so. Mit der Input Capture Funktion auch sehr einfach und genau.

MFG
Falk

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.