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


von Pat F. (breaker87)


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:
1
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

von Sonic (Gast)


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.

von D. W. (dave) Benutzerseite


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.

von Pat F. (breaker87)


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

von Pat F. (breaker87)


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

von Sonic (Gast)


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.

von Pat F. (breaker87)


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

von Sonic (Gast)


Lesenswert?

Was sind die bspw. 3999? Hundertstel Sekunden?

von Pat F. (breaker87)


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

von D. W. (dave) Benutzerseite


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)

von ?????????? (Gast)


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:
1
ISR(TIMER0_OVF_vect)
2
{
3
4
// time in second/100
5
 timetick++;
6
 if(timetick == 39)
7
 {
8
  timetick=0;
9
  hundertstelsekunde++;
10
 }
11
12
//compute time
13
 if(hundertstelsekunde==100)
14
 {
15
   hundertstelsekunde=0;  
16
   if(++second>59)
17
   {
18
     second=0;
19
     if(++minute>59)
20
     {
21
        minute=0;
22
   if(++hour>23)
23
   {
24
     hour=0;
25
   }
26
     }
27
   }
28
 }
29
 
30
}
31
32
33
void initTimer0(void)
34
{
35
    TCCR0 = (1 << CS00); // Full 1MHz
36
}
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 ?

von Karl H. (kbuchegg)


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


von dieter (Gast)


Lesenswert?

so isses noch einfacher als mit den if.... statments

von Niels H. (monarch35)


Lesenswert?

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

von Pat F. (breaker87)


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

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.