mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rat für Zeitausgabe / Zeitberechnung


Autor: µC-noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
was sagt ihr dazu:

Ich hab bei meinem Programm im hintergrund einen Secundentimer Laufen:
Dieser wird über Timer2 gesteuert und geht erst wieder auf null, wenn 
ein Jahr erreicht ist (oder VCC aus/ ControllerReset).
Code:
ISR(TIMER2_COMP_vect)
{
    static unsigned int iCount = 0;

    TCNT2 = (TCNT2 - COUNT_VAL); // set timer2 count register value
    
    iCount++;
    
    if (iCount == COUNT_STEPS)
    {
       centralTimeSec++;
    }
}


Nun ist das als ausgabe für ein LCD natürlich ungünstig:

Deshalb hab ich folgende routine geschrieben:
Diese soll aus der dauerhaft hochlaufenden Secundenzahl
eine Zeitausgabe hh:mm:ss machen.
  if( (centralTimeSec) % 60) == 0 )
  {
    secCounter++;
  }

  if ( centralTimeSec < 59)
    secCounter = 0;

  testSec = (centralTimeSec) - (secCounter * 60);

  if( ( testSec == 0 ) && (centralTimeSec) != 0) )
    testMin = testMin++;

  if( testMin > 59)
  {
    testMin = 0;
    testHour = testHour++;
  }



Was sagt ihr dazu, is das gut oder geht das besser????
Wie ist das mit der Multiplikation, die braucht nicht so viel rechenzeit 
wie beispielsweise eine Division??

Gruß

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

Bewertung
0 lesenswert
nicht lesenswert
µC-noob wrote:

> Was sagt ihr dazu, is das gut oder geht das besser????

Definiere 'besser'.

Ich würde es aber anders machen.
Benötigst du diese hochlaufenden Sekundencounter unbedingt
an anderer Stelle im Programm?
Wenn nicht, dann würde ich diesen Counter durch 3 Variablen
für Sekunden, Minuten, Stunden ersetzen. Der Update ist
dann ziemlich trivial.
uint8_t Sekunden;
uint8_t Minuten;
uint8_t Stunden;

ISR(TIMER2_COMP_vect)
{
    static unsigned int iCount = 0;

    TCNT2 = (TCNT2 - COUNT_VAL); // set timer2 count register value

    Sekunden++;
    if( Sekunden == 60 ) {
      Sekunden = 0;
      Minuten++;
      if( Minuten == 60 ) {
        Minuten = 0;
        Stunden++;
        if( Stunden == 24 ) {
          Stunden = 0;
        }
      }
    }
}

Autor: µC-noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So hatt ichs auch geplant, aber der Counter wird noch an vielen anderen 
Stellen benötigt,...

Außerdem soll der Code für andere Nutzer erweiterbar sein, die schon den 
Wunsch geäußert haben, dass sie gerne einene Zentralzeit in Sekunden 
haben.

Gruß

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

Bewertung
0 lesenswert
nicht lesenswert
PS: Deine Umrechnung sieht mir nicht ganz koscher aus.
Hast du die mal über ein paar Stunden getestet?

Die kanonische Lösung wäre
  Counter = centralTimeSec;

  Stunden = Counter % 3600;
  Counter = Counter / 3600;

  Minuten = Counter % 60;
  Sekunden = Counter / 60;

Wenn dir die Divisionen zuviel Zeit verbrauchen, könnte
man auch auf eine Subtraktionslösung gehen
  Counter = centralTimeSec;

  Stunden = 0;
  while( Counter > 3600 ) {
    Stunden++;
    Counter -= 3600;
  }

  Minuten = 0;
  while( Counter > 60 ) {
    Minuten++;
    Counter -= 60;
  }

  Sekunden = Counter;

Zu Division: Irgendwo in der avr-lib gibt es auch eine
Funktion die gleichzeitig Division und Modulo-Division
macht. Damit könnte man ebenfalls den Zeitbedarf in
der kanonischen Lösung drücken.

Ich finde allerdings die Methode: Mitzählen beim
Inkrementieren immer noch die einfachste Variante.
Alles schön in 8-Bit Arithmetik. Nichts aufwändiges,
lediglich ein paar increments und Vergleiche.

Autor: µC-noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klasse danke,

dein Code gefällt mir weitaus besser als meiner....

THX

Gruß
Jo

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.