PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : externen timer auslesen (74hc193) und differenz berrechnen



TomSawer
19.03.2011, 14:04
Hallo!

Ich habe einen 4bit up/dwn timer an einen Port des Atmega angeschlossen.
Der Timer wird mit 1Khz ausgelesen. Als return möchte ich die differenz als int8_t
von -8 bis +8.
Zudem soll der Code, aufgrund der hohen Frequenz, effizient sein!

So funktionierts schonmal... aber da kann man sicher mächtig optimieren!
Jemand nen Tipp??? Viele Dank!
ISR, 1Khz {
static int old; // alter Zählerstand
int new, dir, diff;

new = PINC & 0x0F; // neuer Zählerstand, 4 bit ausmaskiert

if (new > old) {
diff = new - old;
dir = 1;
}
else {
diff = old - new;
dir = -1;
}

if (diff > 8) {
diff = (16 - diff);
dir *= -1;
}

diff *= dir;

old = new;
return diff;
}

sternst
19.03.2011, 23:18
Eines vorweg:
ISR, 1Khz {
...
return diff;
}Hä???


Nun zum Optimieren:


static int old; // alter Zählerstand
int new, dir, diff;Warum sind das alles 16-Bit-Variablen, wo du doch nur mit 4 Bit rechnest und du im Text sogar explizit die 8-Bit-Variante int8_t erwähnst?



if (new > old) {
diff = new - old;
dir = 1;
}
else {
diff = old - new;
dir = -1;
}

if (diff > 8) {
diff = (16 - diff);
dir *= -1;
}

diff *= dir;
Das würde ich so schreiben:

diff = new - old;
if (diff > 8)
diff -= 16;
if (diff < -8)
diff += 16;

TomSawer
20.03.2011, 13:50
oooopsieeee... 2 mal geposted!

TomSawer
20.03.2011, 13:50
Super Danke Stefan!

Hatte nur in meinem Beitrag int geschrieben. Weiß nicht warum.
in meinem Program war natürlich alles int8_t!

Macht man solche "Kürzungen" auch mit boolscher algebra oder mit scharfem Verstand und Erfahrung?

Schöne Woche! Tom