mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Vergleichen von Zeiten / Werten


Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht 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.
uint32_t best_total
uint32_t lap_total

// --------------------------

best_total = best.min * 10000 + best.sec * 100 + best.csec; // Gesamtzeit der besten Runde ermitteln
lap_total = lap.min * 10000 + lap.sec * 100 + best.csec; // Gesamtzeit der Rundenzeit ermitteln

if(best_total > lap_total) // Wenn Rundenzeit schneller als Bestzeit -> Rundenzeit wird zur Bestzeit
{
    best = lap; // Rundenzeit zur Bestzeit machen
    LED_besttime(1); // LED für Bestzeit gefahren an
}
        
else // Wurde keine Bestzeit erreicht, den buffer zum Rücksetzen des FF löschen
{
    buffer = 0; // Immer neu initialisieren
}

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.
if(best.min < lap.min)  // Wurde keine Bestzeit erreicht, den buffer zum Rücksetzen des FF löschen
{
    buffer = 0;
}

else
{
    if(best.sec < lap.sec)
    {
        buffer = 0;
    }  

    else
    {
        if(best.csec < lap.csec)
        {
            buffer = 0;
        }

        else
        {
            best = lap; // Rundenzeit zur Bestzeit machen
            LED_besttime(1); // LED für Bestzeit gefahren an
        }
    
    }
}


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

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

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

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

Autor: Patrick L. (crashdemon)
Datum:

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

Autor: Patrick L. (crashdemon)
Datum:

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

Autor: Ga. St. (Gast)
Datum:

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

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.