mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
$regfile = "M8def.dat"
$crystal = 8000000
$hwstack = 100
$swstack = 100
$framesize = 100

'Ports zuweisen
Reed Alias Pind.1

'Ports definieren
Config Reed = Input

'Variablen
Dim Radumfang As Integer
Dim Tagesstrecke As Single
Dim Umdrehungen As Integer

'Display
Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , _
   Db7 = Portb.0 , E = Portb.7 , Rs = Portb.6
Config Lcd = 40 * 2
Cls
Cursor Off

'Radumfang in mm
Radumfang = 2120



Do
   Debounce Reed , 1 , On_reed_anschlag , Sub
Loop


On_reed_anschlag:
   Umdrehungen = Umdrehungen + 1
   Tagesstrecke = Radumfang * Umdrehungen
   Tagesstrecke = Tagesstrecke / 1000000

   Locate 1 , 1
   Lcd Radumfang ; " * " ; Umdrehungen ; " = "
   Locate 2 , 1
   Lcd Tagesstrecke ; " km"
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!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan schrieb:
> 0,2120 km.

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

Autor: Horst Hahn (horha)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 (

:-)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.