Em Gr schrieb:
> Die volatiles habe ich wegen einem interrupt und sollten überall
> vorhanden sein, also im interrupt und main(oder ist das falsch?)
Das volatile brauchst Du nur bei Variablen, die sowohl in main als auch
im Interrupt verwendet werden. Vermutlich ist das nur bei zahl der Fall.
bit und bit_z brauchst Du dagegen nur im Interrupt, nicht in main.
> Das Rechtecksignal kommt so an:
> 01100000 (Im Rechtecksignal)
Also kommt zuerst eine Null, dann zwei Mal eine Eins und dann fünf
Nullen? Und das empfangene Bit steht (als einziges) ganz rechts in der
Variable bit?
Wenn ja, dann sollte mit diesem Code
1 | zahl |= (bit<<bit_z);
|
2 | bit_z++;
|
das rauskommen:
> Müsste also quasi wenn von rechts nach links anfängt in das Byte zu
> schreiben so da stehen:
> 00000110 also 6.
Wenn etwas anderes rauskommt, lag entweder ein anderes Signal an oder
der Fehler liegt an anderer Stelle im Code. Poste ihn am besten mal
komplett.
> Was ist ein Barrel-shifter??
Ein Barrel-Shifter kann einen Wert mit einem Maschinenbefehl um eine
beliebige Anzahl an Bits verschieben. Auf dem AVR geht das zum Beispiel
nicht, er kann eine Variable mit einem Befehl nur um eine Stelle
verschieben. Bei einer variablen Anzahl an Stellen, wie in dieser
Anweisung
wird der Compiler daraus eine Schleife machen, die bit_z mal läuft und
bit immer eine Stelle weiter nach links schiebt. Erst danach kann der
Wert mit zahl verodert werden. Bei meiner Alternative kann das
Nach-Links-Schieben dagegen jedes Mal mit nur einem Maschinenbefehl
geschehen.