www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hundertstel in hh:mm:ss


Autor: Pat F. (breaker87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Leute!

Ich veruche jetzt schon seit einiger Zeit eine Funktion in "C" zu 
schreiben, die mir hundertstel Sekunden in das Format 
"hh:mm:ss,hundertstel" umwandelt.
Leider war ich bis jetzt vollkommen erfolglos dabei...

Die Ausgabe soll in einen String übergeben werden, um diesen dann 
seriell zu übertragen...
etwa so:
sprintf(time, "%d. %d:%d:%d,%d", nummer,stunden,minuten,sekunden,hundertstel);
Das ganze sollte dann so aussehen:

>   1. 01:23:34,56
>   2. 01:23:35,67
>   3. ...........


Eine weitere Variante die ich auch noch benötigen würde, wäre dann die 
differenz anzeigen zu lassen:

>   1.  01:23:34,56
>   2. +00:00:01,11
>   3. ...........


Ich hoffe ihr könnt mir bei meinem Problem weiterhelfen...

lg Patrick


PS: Ich verwende CVAVR und einen Mega8

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meinst du sowas?

us_Zaehler = TCNT1;
us_Zaehler = (us_Zaehler)/2000;    // µs berechnen (auf 1/2000 genau)
Sekunden = (h_Zaehler*3600) + (min_Zaehler*60) + (s_Zaehler) + 
(ms_Zaehler/1000) + (us_Zaehler/1000);
kmh = (m_Strecke_d/Sekunden)*3.6;  //auf km/h umrechnen
printf ("Zeit: %02g.%02g:%02g:%02g.%03g.%03g => % 4.3g 
km/h\r\n",d_Zaehler,h_Zaehler,min_Zaehler,s_Zaehler,ms_Zaehler,us_Zaehle 
r*1000,kmh);//  Messwerte ausgeben

Das ist 'ne Geschwindigkeitsmessung. Timer1 Output-Compare-INT jede 
Millisekunde als ms-Zähler, den Zählerstand beim Beenden der Messung 
auslesen und in (in meinem Fall) µs umrechnen. Das müsstest du natürlich 
in hundertstel sekunden tun.

Autor: D. W. (dave) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was waren deine Ansätze bis jetzt? Kann ja nicht sein, dass du garnix 
hinbekommen hast.

Kannst ja mal mit Stück Papier 3999 Sekunden in h:m:s umwandeln, im Kopf 
halt.

Autor: Pat F. (breaker87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
David W. wrote:
> Was waren deine Ansätze bis jetzt? Kann ja nicht sein, dass du garnix
> hinbekommen hast.
>
> Kannst ja mal mit Stück Papier 3999 Sekunden in h:m:s umwandeln, im Kopf
> halt.

Ich hab mich mal etwas mit EXCEL gespielt und hab dort mal 
herumgerechnet (mit einfachen WENN und ODER) - das hat aber auch nicht 
so geklappt...

also bei deiner Rechnung sollten 01:06:39 herauskommen, wenn ich mich 
nicht verrechnet habe...


lg

Autor: Pat F. (breaker87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, aber in C bekomme ich das nicht so auf die Reihe, wie wenn ich das 
Händisch mache...
Das was Sonic geschrieben hat, verstehe ich nicht so ganz - um ehrlich 
zu sein...


lg

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Recht einfach:
- Start der Messung: Timer1 =0, Timer1 starten
- Output-Compare-INT zählt im Millisekundentakt hoch
- im INT werden Sekunden, Minuten, Stunden und Tage hochgezählt
  (einzelne Variablen)
- Stop der Messung: Timer1 stoppen
- Zählerstand Timer1 auslesen, 2000 entspricht 1ms bei 16MHz
  d.h., Auflösung beträgt 1/2000 ms
Jetzt kann gerechnet werden.

Autor: Pat F. (breaker87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich bekomme einen Wert von einem anderen Mikrocontroller per TWI 
übertragen. Diesen Zahlenwert möchte ich jetzt "einfach" aufspalten also 
ich denke mal genau umgekehrt als bei deiner Lösung...

Ich bekomme beispielsweiße den Wert 3999 übertragen und möchte diesen 
umwandeln lassen, damit ich dann eben eine Anzeige "hh:mm:ss,ff" 
erhalte...


lg

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sind die bspw. 3999? Hundertstel Sekunden?

Autor: Pat F. (breaker87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry..
ich meinte 3999000 hundertstel...

also ich habe mir das so berechnet:
Stunden=Hundertstel/3600000
Minuten=Hundertstel/60000
Sekunden=Hundertstel/1000

Stunden=1,110833333 ==> 1h

aus den Nachkommastellen erhalte ich die Minuten:

0,110833333*60=6,65 ==> 6min

aus den Nachkommastellen erhalte ich die Sekunden:

0,65*60=39 ==> 39s


Daraus erhalte ich dann 01:06:39,000...

Jetzt brauch ich nur eine Funktion dafür in C...
Gibt es einen Befehl, mit dem ich nur die Nachkommastellen einer Zahl 
verwenden kann? - also die stelle vor dem Komma vernachlässigen kann?


lg

Autor: D. W. (dave) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
3999 % 60 = 39 (s)
3999 / 60 = 66
66 % 60 = 6 (min)
66 / 60 = 1
1 % 24 = 1 (h)
1 / 24 = 0
0 % 30 = 0 (d)

Bei 1/100 musst du natürlich noch nen %100 /100 davorsetzen.
% = mod = Rest bei einer Division
/ = Ganzzahldivision, schneidet also die Dezimalen nach dem Komma ab 
(ohne Runden)

Autor: ?????????? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Patrick F.:
Irgendwo mußt Du ja Deine Zeit herbekommen, oder ?
Wo soll das ganze denn laufen µC oder PC oder Armbanduhr ?
Nehmen wir mal ATMEL Mega8 µC an:
ISR(TIMER0_OVF_vect)
{

// time in second/100
 timetick++;
 if(timetick == 39)
 {
  timetick=0;
  hundertstelsekunde++;
 }

//compute time
 if(hundertstelsekunde==100)
 {
   hundertstelsekunde=0;  
   if(++second>59)
   {
     second=0;
     if(++minute>59)
     {
        minute=0;
   if(++hour>23)
   {
     hour=0;
   }
     }
   }
 }
 
}


void initTimer0(void)
{
    TCCR0 = (1 << CS00); // Full 1MHz
}
OK ist nicht ganz genau da 10000/256=39,0625 sind und nicht 39 aber das 
Prinzip ist klar !
Mit einem Baudratenquarz der auf die Zweierpotenzen eingestellt ist 
kannst Du's ganz exakt ausrechnen !
Wo liegt das Problem ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Gibt es einen Befehl, mit dem ich nur die Nachkommastellen
> einer Zahl verwenden kann? - also die stelle vor dem Komma
> vernachlässigen kann?

Om Gottes willen nicht mit Flieskomma rechnen. Das
brauchst du nicht.

Alles was du brauchst sind in C / und %

/   Division zweier Zahlen
%   Rest der bei der Division entsteht
    ( So wie in der Grundschule: Eine Mutter hat 3 Kinder und
      7 Äpfel. Wenn jedes Kind gleich viele Äpfel bekommt, wieviele
      Äpfel bleiben dann der Mutter übrig.)


Bsp:  95 Sekunden sind wieviele Minuten und Sekunden

  95 % 60 -> 35
  95 / 60 -> 1

      95 Sekunden sind also 1 Minute und 35 Sekunden


  4876 Sekunden

   14876 % 60  ->    56  Sekunden
   14876 / 60  ->   247  Minuten
                      |
      +---------------+
      v
     247 % 60  ->     7 Minuten
     247 / 60  ->     4 Stunden


  4876 Sekunden sind also
    * 4876 Sekunden
    * 247 Minuten und 56 Sekunden
    * 4 Stunden und 7 Minuten und 56 Sekunden

Warum immer division durch 60.
   Weil 1 Minute 60 Sekunden hat
   Weil 1 Stunden 60 Minuten hat

Wenn du auch noch Tage brauchst, dann dividierst du
die Stunden klarerweise durch 24.
Und um von Hunderstelsekunden auf Sekunden zu kommen
ist das eine Division durch 100


Autor: dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so isses noch einfacher als mit den if.... statments

Autor: Niels Hüsken (monarch35)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Int-generierung mit vollen Prozessortakt ist zum scheitern verurteilt. 
Wo soll denn da noch die Rechenzeit für die IFs herkommen?

Autor: Pat F. (breaker87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
>> Gibt es einen Befehl, mit dem ich nur die Nachkommastellen
>> einer Zahl verwenden kann? - also die stelle vor dem Komma
>> vernachlässigen kann?
>
> Om Gottes willen nicht mit Flieskomma rechnen. Das
> brauchst du nicht.
>
> Alles was du brauchst sind in C / und %
>
> /   Division zweier Zahlen
> %   Rest der bei der Division entsteht
>     ( So wie in der Grundschule: Eine Mutter hat 3 Kinder und
>       7 Äpfel. Wenn jedes Kind gleich viele Äpfel bekommt, wieviele
>       Äpfel bleiben dann der Mutter übrig.)
>
>
> Bsp:  95 Sekunden sind wieviele Minuten und Sekunden
>
>   95 % 60 -> 35
>   95 / 60 -> 1
>
>       95 Sekunden sind also 1 Minute und 35 Sekunden
>
>
>   4876 Sekunden
>
>    14876 % 60  ->    56  Sekunden
>    14876 / 60  ->   247  Minuten
>                       |
>       +---------------+
>       v
>      247 % 60  ->     7 Minuten
>      247 / 60  ->     4 Stunden
>
>
>   4876 Sekunden sind also
>     * 4876 Sekunden
>     * 247 Minuten und 56 Sekunden
>     * 4 Stunden und 7 Minuten und 56 Sekunden
>
> Warum immer division durch 60.
>    Weil 1 Minute 60 Sekunden hat
>    Weil 1 Stunden 60 Minuten hat
>
> Wenn du auch noch Tage brauchst, dann dividierst du
> die Stunden klarerweise durch 24.
> Und um von Hunderstelsekunden auf Sekunden zu kommen
> ist das eine Division durch 100

Vielen Dank!

Genau dannach habe ich gesucht...

Jetzt sollte ich es schaffen...


lg Patrick

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.