Forum: Mikrocontroller und Digitale Elektronik Vergleichen von Zeiten / Werten


von Patrick L. (crashdemon)


Lesenswert?

Hallo Leute,

möchte gerne folgenden Code den ich einst für einen Atmega8 geschrieben 
habe auf einen Attiny2313 portieren. Problem ist jetzt das auf dem 
Atmega8 recht verschwenderisch mit dem Speicher umgehen konnte, was 
jetzt auf dem Attiny2313 nicht mehr möglich ist, da da der SRAM ja um 
einiges kleiner ist.
1
uint32_t best_total
2
uint32_t lap_total
3
4
// --------------------------
5
6
best_total = best.min * 10000 + best.sec * 100 + best.csec; // Gesamtzeit der besten Runde ermitteln
7
lap_total = lap.min * 10000 + lap.sec * 100 + best.csec; // Gesamtzeit der Rundenzeit ermitteln
8
9
if(best_total > lap_total) // Wenn Rundenzeit schneller als Bestzeit -> Rundenzeit wird zur Bestzeit
10
{
11
    best = lap; // Rundenzeit zur Bestzeit machen
12
    LED_besttime(1); // LED für Bestzeit gefahren an
13
}
14
        
15
else // Wurde keine Bestzeit erreicht, den buffer zum Rücksetzen des FF löschen
16
{
17
    buffer = 0; // Immer neu initialisieren
18
}

Also dachte ich daran obenstehenden Code durch if-Anweisungen ersetzen 
zu können, was aber offensichtlich nicht so einfach geht.
Gibt es schon eine gängige angehensweise für solche Vergleiche?
Ich will ja im Prinzip nur wissen ob die aktuelle Rundenzeit schneller / 
kleiner als die gespeicherte Bestzeit ist.
1
if(best.min < lap.min)  // Wurde keine Bestzeit erreicht, den buffer zum Rücksetzen des FF löschen
2
{
3
    buffer = 0;
4
}
5
6
else
7
{
8
    if(best.sec < lap.sec)
9
    {
10
        buffer = 0;
11
    }  
12
13
    else
14
    {
15
        if(best.csec < lap.csec)
16
        {
17
            buffer = 0;
18
        }
19
20
        else
21
        {
22
            best = lap; // Rundenzeit zur Bestzeit machen
23
            LED_besttime(1); // LED für Bestzeit gefahren an
24
        }
25
    
26
    }
27
}

von Karl H. (kbuchegg)


Lesenswert?

Die Frage ist, warum du von vorne herein überhaupt alles in Minuten, 
Sekunden, Zehntel aufgeschlüsselt hast?

Bau dein Programm komplett auf Zehntelsekunden auf und du hast das 
Problem erst mal gar nicht. Lediglich zur Ausgabe musst du deine 
Zehntelsekunden umwandeln.


Allerdings: Damit wirst du dein Programm nicht retten. Da finden sicher 
andere Stellen, an denen man einsparen kann.

von Karl H. (kbuchegg)


Lesenswert?

> Ich will ja im Prinzip nur wissen ob die aktuelle Rundenzeit schneller
> kleiner als die gespeicherte Bestzeit ist.

Sie kann auch langsamer sein. Massiv langsamer

Geh deinen Code mal mit folgenden Werten durch

Bisheriges Bestes

  2 Minuten   16 Sekunden    5 Zehntel

und die vergleichst du jetzt laut deinem Code mit

  4 Minuten    8 Sekunden    2 Zehntel


Was kriegt dein Code raus?
Was sollte rauskommen?

Geh im Kopf (oder mit Papier/Bleistift) deinen Code durch und du wirst 
deinen Denkfehler entdecken.

von Patrick L. (crashdemon)


Lesenswert?

> Beu dein Programm komplett auf Zehntelsekunden auf und du hast das
> Problem erst mal gar nicht. Lediglich zur Ausgabe musst du deine
> Zehntelsekunden umwandeln.

Ja im Prinzip mach ich das schon, der ISR Overflow Interrupt zählt bei 
jedem
Aufruf um 10^-2 Sekunden hoch (overflow_ticks++) (4Mhz Quarz, Vorteiler 
8 vom Timer 1). Berechne dann in der main mit der Funktion splitTicks() 
die jeweiligen Zeitteile (csec, sec, min) und schreibe die dann direkt 
in die betreffende Struktur, ich denke das es dadurch übersichtlicher 
wird als wenn man immer die Gesamtzeit (overflow_ticks) speichert. Wobei 
du schon recht hast eig. brauch ich die einzelzeiten ja nur für die 
Ausgabe auf dem LCD.

> Allerdings: Damit wirst du dein Programm nicht retten. Da finden sicher
> andere Stellen, an denen man einsparen kann.

Deswegen mal anbei der komplette Code. Im Moment passt der Code auf dem 
µC, sobald ich aber die Funktionen intro() und go_sleep() auskommentier 
kommt es mysteriöserweise zu Probleme, data scheint dann wohl während 
der Laufzeit vollzulaufen obwohl das Avr-Studio sagt es ist noch platz 
frei.

mfg Patrick

von Patrick L. (crashdemon)


Lesenswert?

> Was kriegt dein Code raus?
> Was sollte rauskommen?

Ja richtig, das ist mir dann beim Debuggen auch aufgefallen, deswegen 
bin ich ja zu dem schluß gekommen das dass wohl doch nicht so einfach 
geht wie ich mir das schnell zusammengehackt hatte.

Hmm kann den Code irgendwie nicht nochladen... also hier der Link
http://defcon-cc.dyndns.org/upload/files/laptimer.c

von Ga. St. (Gast)


Lesenswert?

Ich glaub ich stehe gerade etwas auf dem Schlauch, aber ich sehe den ja 
wohl ziemlich offensichtlichen Fehler in der if-Konstruktion nicht.

Wenn best.min 2 und lap.min 4 ist, so ist doch die erste Bedingung wahr, 
Buffer wird zurückgesetzt und der else-Zweig wird nie ausgewertet, oder? 
Was übersehe ich hier?

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.