Problem beim bitweisen beschreiben einer Variablen

Gast #1889725
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.
1
uint8_t i,zaehler=0;
2
uint64_t data = 0;
3

4
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.
1
for (i=0; i<64; i++)
2
{
3
data |= (1 << i);
4
}
Und um das Ergebnis überprüfen zu können, hab ich mir die Bytes an den 
PC geschickt.
1
char b1,b2,b3,b4,b5,b6,b7,b8;
2

3
while (!(UCSRA & (1<<UDRE)))
4
{}
5
b1=data&0xff;
6
UDR=b1;
7
while (!(UCSRA & (1<<UDRE)))
8
{}
9
b2=(data>>8)&0xff;
10
UDR=b2;
11
.
12
.
13
.
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.
#1889753
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_Datentypen_haben_Konstante.3F

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

1
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/Bitmanipulation#Siehe_auch

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

MFG
Falk

Antwort schreiben

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.

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.