Kann man eigentlich auch Zahlenformate selber definieren? Mir würde nämlich für "distance" ein signed Format mit 20Bit + Vorzeichen für den Anwendungsfall genau passen.
Im Prinzip schon:
struct Distance
{
signed value:20;
unsigned sign:1;
};
Distance d;
...
d.value = 0xFFFFF;
d.sign = 1;
aber ob die Variable d tatsächlich nur 3 byte belegt statt 4, bliebe zu prüfen. Auch Wertebereichsüberschreitungen werden weder beim Compilieren noch zur Laufzeit geprüft, fürchte ich.
Gibts irgendwo eine Aufstellung, wie viel Laufzeit ein Befehl hat?
Ja, für die Maschinenbefehle ( Assembler )
" Die meisten Befehle brauchen nur 1 Zyklus ", meine ich irgendwo gelesen zu haben, aber genauer weiss ich nicht. Tip: Datenblatt .
Für unsereins ist eher interessant, wie gut der Compiler arbeitet, bzw. wie man ihn unterstützen kann.
Dein Takt()
braucht sicher keine 400 µs, könnte aber durch ein optimiertes bitWrite evtl. noch verbessert werden:
#define data 3
long bit = 0x00001;
long distance = 0;
...
void Takt() {
newdata = HIGH;
if ( !digitalRead(data)) distance |= bit;
bit <<= 1;
}
Ob es da noch wirklich was bringt, statt mit zwei long mit einem von 3 Bytes und einer 1 byte Bitmaske zu arbeiten, weiss ich nicht.
digitalRead mit einer konstanten Pin-Nummer sollte schon ziemlich per Macros optimiert sein.
...ich könnte am Anfang und am Ende die micros() abfragen. Aber ob das so genau ist?
Sagt dir ziemlich genau, wie lang 2 mal micros() abfragen dauert, mit deinem bitWrite() wird es etwas länger
Deine ganze Frage klingt übrigens ziemlich nach shiftIn().
(Wodurch ändert sich denn der Wert des data - Pins ? Da ist doch sicher irgendwo ein Clock Puls...)
Probierst du gerade, das Rad neu zu erfinden? (Das soll keine Kritik sein, nur sollte man vor dem Neu-Erfinden wissen, was es schon gibt)