www.mikrocontroller.net

Forum: Compiler & IDEs Time für Waits


Autor: Mike (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Mike (Gast)
Datum:

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

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso mußt du die emulieren und warum ist das ungünstig?

Autor: Mike (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Mike (Gast)
Datum:

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

Autor: Grrrr (Gast)
Datum:

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

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

Bewertung
0 lesenswert
nicht 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?
volatile uint16_t ms;
volatile uint8_t  sec;
volatile uint8_t  min;
volatile uint8_t  hour;

ISR(TIMER1_COMPA_vect)
{
  ms++;

  if( ms == 1000 ) {
    ms = 0;
    sec++;
    if( sec == 60 ) {
      sec = 0;
      min++;
      if( min == 60 ) {
        min = 0;
        hour++;
      }
    }
  }
}

Das wird sich nicht um viel reißen :-)

Autor: Peter Dannegger (peda)
Datum:

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

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.