Forum: Compiler & IDEs Time für Waits


von Mike (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Deine Frage hast Du doch schon selbst beantwortet. Solange Du keine 
Sekunden, Minuten etc. irgendwo brauchst, musst Du die natürlich auch 
nicht erfassen.

von Mike (Gast)


Lesenswert?

Gut. Ich dachte nur, dass es ungünstig ist, wenn ich für jedes Event, wo 
ich die Zeit stoppe eine 32 bit Variable emulieren muss.

von Rolf M. (rmagnus)


Lesenswert?

Wieso mußt du die emulieren und warum ist das ungünstig?

von Mike (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Mike (Gast)


Lesenswert?

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?

von Grrrr (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

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.