mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rechnen von Zeit und weg


Autor: Fichte (Gast)
Datum:

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

Autor: Hans Meisa (Gast)
Datum:

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

Autor: Fichte (Gast)
Datum:

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

Autor: Gerhard Gunzelmann (Gast)
Datum:

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

Autor: Fichte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Gerhard

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


MFG: Fichte

Autor: Malte Marwedel (Gast)
Datum:

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

Autor: Hagen (Gast)
Datum:

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

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fixed-Point-Mathematic

Autor: Hans (Gast)
Datum:

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

Autor: Hans (Gast)
Datum:

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

Autor: Fichte (Gast)
Datum:

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

Autor: Gerhard Gunzelmann (Gast)
Datum:

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

Autor: Alex (Gast)
Datum:

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

Autor: Fichte (Gast)
Datum:

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

Autor: Evil 2000 (Gast)
Datum:

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

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.