Time für Waits

Gast #1621570
Hallo,
ich würde gerne Waits im Code mit einem fortlaufenden timer zu 
realisieren. Wie kommt man da effizienter. Eine 32 Bit Variable mit 
Millisekunden hoch zählen, oder Millisekunden, Sekunden Minuten etc. 
getrennt abspeichern, was dann aber die die Differenzberechnung 
aufwendiger macht.

Viele Grüße
Gast #1621870
Naja der Atmega hat ja nur 8Bit. Also muss der Compiler die emulieren. 
Und ich weiß ja nicht, um wie viel % das länger dauert, als wenn ich mit 
8/16 Bit arbeite.
#1621921
Mike schrieb:
> Und ich weiß ja nicht, um wie viel % das länger dauert

Es dauert 0% länger, denn der Hardwaretimer läuft unabhängig von der 
Software.

Es dauert bloß einige Zyklen länger, einen 32Bit Wert zu vergleichen. 
Und das ist unabhängig von der gewünschten Zeit.


Peter
Gast #1621973
Also ich mache das jetzt so:

volatile uint32_t ms=0;

ISR(TIMER1_COMPA_vect)
{
  ms++;
}

Da wird doch aber jede ms eine 32 Bit variable inkrementiert. Ist das 
nicht aufwendig für den 8 Bit Prozessor?
Gast #1621980
Mike schrieb:
> Da wird doch aber jede ms eine 32 Bit variable inkrementiert. Ist das
> nicht aufwendig für den 8 Bit Prozessor?

Grundsätzlich schon. Aber wo ist dabei das Problem?
Wenn Du ansonsten noch Zeit übrig hast und noch keine Taktzyklen zählen 
musst, brauchst Du Dir keine Gedanken zu machen. Das ist, grob geschätzt 
etwa wie vier 8-Bit Werte inkrementieren.
#1621987
Mike schrieb:
> Also ich mache das jetzt so:
>
> volatile uint32_t ms=0;
>
> ISR(TIMER1_COMPA_vect)
> {
>   ms++;
> }
>
> Da wird doch aber jede ms eine 32 Bit variable inkrementiert. Ist das
> nicht aufwendig für den 8 Bit Prozessor?

Was ist die Alternative?
1
volatile uint16_t ms;
2
volatile uint8_t  sec;
3
volatile uint8_t  min;
4
volatile uint8_t  hour;
5

6
ISR(TIMER1_COMPA_vect)
7
{
8
  ms++;
9

10
  if( ms == 1000 ) {
11
    ms = 0;
12
    sec++;
13
    if( sec == 60 ) {
14
      sec = 0;
15
      min++;
16
      if( min == 60 ) {
17
        min = 0;
18
        hour++;
19
      }
20
    }
21
  }
22
}

Das wird sich nicht um viel reißen :-)
#1621989
Mike schrieb:
> Da wird doch aber jede ms eine 32 Bit variable inkrementiert. Ist das
> nicht aufwendig für den 8 Bit Prozessor?

Ein leerer Interrupt kostet schon 25 Zyklen.
Das 32Bit Increment nochmal 30 Zyklen, also etwa Verdoppelung der 
CPU-Last.
Die CPU-Last ist dann bei 16MHz etwa 0,4%.


Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.