mikrocontroller.net

Forum: Compiler & IDEs Problem beim bitweisen beschreiben einer Variablen


Autor: Fritze (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich versuche eine synchrone serielle Schnittstelle einzulesen. Dabei 
sollten nacheinander 52 Bits gesendet werden, welche ich Bitweise in 
eine "long long" Variable schreiben will.
uint8_t i,zaehler=0;
uint64_t data = 0;

data |= ((PORTD & (1<<PIN_DATA)) << zaehler);
Das hat aber überhaupt kein sinnvolles Ergebnis gebracht.
Zum Testen wollte ich dann mal die Variable übers bitshiften mit Einsen 
beschreiben.
for (i=0; i<64; i++)
{
data |= (1 << i);
}
Und um das Ergebnis überprüfen zu können, hab ich mir die Bytes an den 
PC geschickt.
char b1,b2,b3,b4,b5,b6,b7,b8;

while (!(UCSRA & (1<<UDRE)))
{}
b1=data&0xff;
UDR=b1;
while (!(UCSRA & (1<<UDRE)))
{}
b2=(data>>8)&0xff;
UDR=b2;
.
.
.
Das lieferte mir allerdings auch nicht das erwatete Ergebnis, sondern:
011111110111111101111111011111110111111101111111011111110111111

Könnte mir jemand sagen wo das Problem liegt oder wie man es besser 
machen kann.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Fritze (Gast)

>ich versuche eine synchrone serielle Schnittstelle einzulesen. Dabei
>sollten nacheinander 52 Bits gesendet werden, welche ich Bitweise in
>eine "long long" Variable schreiben will.

Kann man machen, ist aber gerade auf dem AVR relativ langsam. Deutlich 
besser und schneller ist ein 8 Byte Array.

>data |= ((PORTD & (1<<PIN_DATA)) << zaehler);

Uhhhh, ein 64 Bit Schiebeoperation mit einer Variablen. Das ist rein 
logisch OK, praktiscvh aber grottenlangsam.

>Das hat aber überhaupt kein sinnvolles Ergebnis gebracht.

Weil ein Cast fehlt. Altes Problem.

http://www.mikrocontroller.net/articles/FAQ#Welche...

So sollte es laufen, wenn gleich saumäßig langsam.

data |= ((uint64_t)(PORTD & (1<<PIN_DATA)) << zaehler);

>Könnte mir jemand sagen wo das Problem liegt oder wie man es besser
>machen kann.

http://www.mikrocontroller.net/articles/Bitmanipul...

Nutze ein Array und eine Maske, das ist deutlich übersichtlicher und 
schneller. Und es gibt keine komischen Effekte.

MFG
Falk

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.