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
Deine Frage hast Du doch schon selbst beantwortet. Solange Du keine Sekunden, Minuten etc. irgendwo brauchst, musst Du die natürlich auch nicht erfassen.
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.
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.
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
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?
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.
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.