Forum: Mikrocontroller und Digitale Elektronik Rechnen von Zeit und weg


von Fichte (Gast)


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

von Hans Meisa (Gast)


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

von Fichte (Gast)


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

von Gerhard Gunzelmann (Gast)


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

von Fichte (Gast)


Lesenswert?

@ Gerhard

Da muss ich dich Leider Entäuschenwenn ich so Rechnebekomme ich keine
Ausgabe auf das LCD.


MFG: Fichte

von Malte Marwedel (Gast)


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

von Hagen (Gast)


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

von Hagen (Gast)


Lesenswert?

Fixed-Point-Mathematic

von Hans (Gast)


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

von Hans (Gast)


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

von Fichte (Gast)


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

von Gerhard Gunzelmann (Gast)


Lesenswert?

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

von Alex (Gast)


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

von Fichte (Gast)


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

von Evil 2000 (Gast)


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

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.