Rechnen von Zeit und weg

Gast #90601
Lesenswert?

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
Gast #90602
Lesenswert?

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
Gast #90603
Lesenswert?

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
Gast #90604
Lesenswert?

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
Gast #90606
Lesenswert?

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
Gast #90607
Lesenswert?

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
Gast #90609
Lesenswert?

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
Gast #90610
Lesenswert?

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
Gast #90611
Lesenswert?

Also es geht nicht bei mir zu mindest ich glaube ich seh den Wald vor
Lauter Bäumen nicht. Ich Poste mal den Kompletten Code.

#include <math.h>  // for abs
#include <stdio.h> // for putsf
#include <delay.h>
#include <mega16.h>

// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x12
#endasm
#include <lcd.h>

#include <stdio.h> // for putsf

void main(void)
{
// Declare your local variables here

char hex[16];
float a;

// Input/Output Ports initialization
// Port A initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In
Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T
State7=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In
Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T
State7=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In
Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T
State7=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func0=In Func1=In Func2=In Func3=In Func4=In Func5=In Func6=In
Func7=In
// State0=T State1=T State2=T State3=T State4=T State5=T State6=T
State7=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;
SFIOR=0x00;

// LCD module initialization
lcd_init(16);

while (1)
      {
      // Place your code here
      a = 10.0/6.0;
      sprintf(hex,"%f",a);
      lcd_gotoxy(0,0);
      lcd_puts(hex);
      };
}



Wer hat noch eine Lösung.??


MFG: Fichte
Gast #90613
Lesenswert?

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
Gast #90614
Lesenswert?

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
Gast #90615
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren