Hallo an alle die das Mathe Erfunden haben
Ich habe eine Frage Ich möchte ein Fahrradcomputer Bauen und der soll
mir zbs. eine Strecke berechnen dh. Kilometer / km/h.
Rechnen würde ich sowas so:
ausgabe = (10/5);
und dann die Ausgabe ich bekomme aber nur Aufgerundete Zahlen niemals
den wirklichen wert.
Wer kann mir weiter helfen.
MFG: Fichte
ich würd ja gerne weiterhelfen, aber ich versteh dich nicht richtig.
ich bin eingentlich des "mahtes" mächtig.
womit rechnest du? mit taschenrechner oder direkt im sourccode?
wenns der source code ist poste den doch mal.
mfg
HansMeisa
Ja im Sourcecode soll dies PAssieren so Also mein Test Sourcecode
kannste haben.
void main(void)
{
// Declare your local variables here
char hex[16];
int land;
int bahn;
int a;
a=(20/6);
sprintf(hex,"%d",a);
lcd_gotoxy(0,0);
lcd_puts(hex);
da kommen bei mir "3" Raus Anstatt 3,33
MFG: Fichte
Hallo Fichte
Das Ergebnis ist das Produkt von Integer-Mathematik.
Wenn Du Ergebisse mit Komma willst, mußt Du Deine Variable als
"float" deklarieren:
...
float a;
a = 10/6;
sprintf(hex,"%f",a);
...
Gruß
Gerhard
Wenn ich davon ausgehe, dass der Tacho bei jeder Radumdrehung einen Puls
bekommt und der Radumfang bekannt ist, so würde ich jeden Puls zählen
und dann mit dem Radumfang multiplizieren.
Also s = n*Radumfang.
Für die Geschwindigkeit würde ich versuchen die Dauer zwischen zwei
Pulsen möglichst genau zu messen. Dann würde ich den Radumfang durch
die Zeit teilen.
Um Kommazahlen zu vermeiden, würde ich in Millimetern und Millisekunden
rechnen (die Zahlen werden dann allerdings recht groß).
Bei der Anzeige dürften sich kleinere Rundungsfehler einschleichen,
wichtig ist aber, dass sich diese Rundungsfehler bei dem
Kilometerzähler nicht aufaddieren.
Beispiel: Radumfang: 3,25m = 3250mm; Zeit=0,2s = 200ms
v1 = 3250mm/200ms = 16,25m/s -> 16m/s
v2 = v1*36/10 = 57,6 km/h -> 57km/h
Bei kleineren Zahlen würde die Genauigkeit nachlassen:
v3 = 325cm/200ms = 1,625cm/ms -> 1cm/ms
v4 = v3*36 = 36km/h
Und wenn man erst multipliziert wirds noch genauer:
v5 = (3250mm*36)/(200ms*10) = 117000mm/2000ms = 58,5km/h -> 58km/h
Dann rechne (10 * 1000) / 6, also in Meter um. Wenn das Resultat >=
1000 ist setzte einen an dritter Dezimalposition einen Punkt.
Also 10Km/ 6 = 1.667 im Integer würde stehen 2 beim Aufrunden oder 1
beim abrunden. Bei 10Km * 1000 / 6 = 1666.6667, Integer aufgerundet
ergibt 1667. Da 1667 >= 1000 kommt in den String ein Dezimalpunkt rein,
ergibt als Text 1.667
Gruß Hagen
tjo keine anzeige am lcd kommt von der nicht reingelinkten
float-library... schau mal in die makefile..da is irgendwo sowas
drinnen...
# Minimalistic printf version
LDFLAGS += -Wl,-u,vfprintf -lprintf_min
# Floating point printf version (requires -lm below)
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt
draus machst dann
# Minimalistic printf version
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min
# Floating point printf version (requires -lm below)
LDFLAGS += -Wl,-u,vfprintf -lprintf_flt
und dann sollte was am lcd stehen... übrigends würde ich auf 1ne
kommastelle runden lassen...also statt "%f" "%0.1f" hin
schreiben... der 1ser steht für die stellen nach dem komma der 0er ist
da damit nicht bloss z.b ".2" rauskommt.. schaut besser aus wenn da
0.2 steht g
73 de oe6jwf
upps nochwas vergessn...
float a;
a = 10/6;
sprintf(hex,"%f",a);
...
das wird dir auch was gerundetes geben... das muss so ausschaun...
float a;
a = 10.0/6.0;
sprintf(hex,"%f",a);
...
damit ist 10 und 6 ein double und damit gehts sonnst isses wieder eine
integer division bei der das ergebnis ein float wird... sprich bringt
nix... so gehts...
73 de oe6jwf
Hallo Fichte
was will eigentlich das lcd_puts() ? mit "_puts" verbinde ich
put-string, evtl muß das dann ASCII-String sein ?! schau mal in Deiner
Doku darüber nach
gerhard
Vielleicht ist der Kommentar von mir ja überflüssig, aber WinAVR enthält
eine Funktionsbibliothek namens stdlib.h.
Mit ihrer Hilfe kann man diverse Typkonvertierungen durchführen, welche
für LCD-Ausgaben nötig sind.
Bsp: int --> string (array) itoa (...);
double --> string dtostrf (...);
analog gibt es auch eine Funktion, die dir einen float Wert in ein
Array schreibt, welches du dann einfach auf dem Display ausgeben
kannst.
Gruss, Alex
So ich habs Raus was es ist bzw. mit Hilfe ein Kumppels.
Alles das was ihr bzw. ich in C Geschrieben habe war Richtig.
Nun kommt der Hacken an der SAche in CV gibt es unter
"Project","Configure","C Compiler" und wählt unten links in den
Feld bei "(s)printf features:" den eintrag "float, with, pre..."
Und das wars.!!!!
MFG: Fichte
CodeVisionAVR Revision History
[...]
V1.23.7 Commercial Release
[...]
the printf and sprinft Standard I/O functions now support printing
floats (%f, %e, %E) with width and precision. To enable printing
floats, select Project|Configure|C Compiler|(s)printf features: float,
width, precision.
the printf, sprintf, scanf and sscanf Standard I/O functions are now
reentrant
[..]
Quell-URL: http://www.hpinfotech.ro/html/cvavr_history.htm