Bitstream in Bytevariable (char) schieben

Gast #77239
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
Gast #77240
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
Gast #77242
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
Gast #77243
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
}
Gast #77244
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
Gast #77245
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
Gast #77246
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.