mikrocontroller.net

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


Autor: Marcel Lieser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Fischl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Fischl (Gast)
Datum:

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

Autor: Marcel Lieser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcel Lieser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: Thomas Fischl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcel Lieser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.