Forum: Compiler & IDEs Bitstream in Bytevariable (char) schieben


von Marcel Lieser (Gast)


Lesenswert?

Halli Hallo

Hat jemand eine Idee, wie ich einen Bitstrom (welcher ich vom AVR an
PIND.1 einlesen will) in eine Bytevariable streamen kann?

Ich muss das in einer Schleife tun (frage den Distanzsensor von Sharp
ab) und erhalte einen seriellen 8-Bitstrom.

Also irgenwie:

for(int i=8;i<0;i--){
 cmeinChar=PIND.1; //hier bitweise in den char schieben?!?
}

Vielleicht ein Array of Bit machen? Gibts das?

Hat jemand schon mal mit dem Sharp GP2DO2 gearbeitet???

Danke für eure Antworten!
Marcel

von Thomas Fischl (Gast)


Lesenswert?

Hallo Marcel,

ich würd das so machen:

for(int i = 8; i < 0;i--) {
 cmeinChar = cmainChar << 1; // um ein Bit nach links shiften
 cmeinChar = cmainChar | PIND.1; // 1. Bit setzen, falls Eingang "1"
}

Thomas

von Thomas Fischl (Gast)


Lesenswert?

Oha, die For-Schleife müsste natürlich anders aussehen. Beispielsweise
so: for (int i = 0; i < 8; i++) ...

von Marcel Lieser (Gast)


Lesenswert?

Danke für die Info Thomas

Die Schleife ist schon Ok, da ich zuerst das MSB vom Sensor erhalte
(->also rückwärtszählen).

Also ich probier dann das mal aus; scheint von der Logik her in
Ordnung.
Vielen Dank!
Marcel

von Marcel Lieser (Gast)


Lesenswert?

hmm, also ein kleiner schlaufenfehler ist natürlich noch da; diese
blöden <> zeichen
es müsste natürlich so aussehen:


for(int i=8;i>0;i--){
 cmeinChar = cmainChar | PIND.1; // 1. Bit setzen, falls Eingang "1"
 cmeinChar = cmainChar << 1; // um ein Bit nach links shiften
}

von Thomas Fischl (Gast)


Lesenswert?

Hallo nochmal,

also ob du rauf oder runter zählst ist ja in diesem Fall egal. Die
Zählrichtung hat ja nichts mit der Reihenfolge zu tun, in der die Bits
in dein Char reingeshiftet werden.
Im letzten Beitrag hast du die zwei Zeilen vertauscht. War das Absicht?
So wird nämlich das Bit, welches du als erstes reinshiftest (also dein
MSB) beim letzten Durchlauf aus dem Byte "rausgeschoben" und Bit 0
von cmeinChar wird nach Schleifende immer eine Null sein.

Thomas

von Marcel Lieser (Gast)


Lesenswert?

Danke für deine Nerven. Irgendwie habe ich ein heilloses durcheinander
gemacht. wahrscheinlich würde es manchmal Sinn machen, einen Tag lang
nicht daran zu arbeiten. Sonst sieht man vor lauter Pointern,
Schleifen, Bits und Bytes die einfachsten Dinge nicht mehr:-)

Vielleicht bekomme ich diese dumme Infrarotmessung noch hin; die
Ultraschallmessung war dagegen ein Kinderspiel!

marcel

von Matthias (Gast)


Lesenswert?

Hi

es ist nicht ganz egal ob man hoch oder runterzählt. Die meisten
Controller (welcher eigentlich nicht?) können nach einer Operation
Springen wenn das Ergebnis gleich oder ungleich null ist. Wenn man
jetzt hochzählt muß vor dem Sprung noch eine Vergleichsoperation
durchgeführt werden. Ergebnis: Mindestesn einen Maschinenbefehl
gespart.

Matthias

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
Noch kein Account? Hier anmelden.