Hallo zusammen, wir haben eine Frage zu Bitfeldern. Aber zuerst mal zur Ausgangssituation: Wir möchten 64 digitale Eingänge über Multiplexer einlesen. Das klappt mit unserem Testprogramm ganz gut. Mittels einer Schleife lesen wir die Bits in ein (unsigned char) Array ein, das über eine Laufvariable weitergeschaltet wird. Das Unschöne daran: Es werden 64 Byte für 64 Bit verschwendet :-( Im Tutorial ist ja die Erstellung von Bitfeldern ausführlich beschrieben. Doch der Zugriff darauf ist eben leider nicht so einfach wie bei Arrays... Oder gibt es da auch ne Möglichkeit mittels Index zuzugreifen? Als eine Lösungsmöglichkeit ist uns eingefallen: Man könnte 8 Bit einlesen (in 8 verschiedene Variable), und dann diese durch Schiebeoperationen in einer 8-Bit-Variable unterbringen. Ist das gängige Praxis? Wäre nett, wenn uns jemand helfen könnte! Grüße Michael und Björn
Ich vermute mal, Du liest die Bits nacheinander über einen Pin ein, dann kannst Du sie auch dabei gleich einschieben:
1 | unsigned long long mybits; // 64 Bit |
2 | |
3 | ...
|
4 | mybits <<= 1; // um 1 schieben, 0 reinschieben |
5 | if( PINA & 1<<PA7 ) // Eingang ist Pin7 von Port A |
6 | mybits |= 1; // Pin übernehmen. |
7 | ...
|
Nochn Tip: Das Einlesen geht über Schieberegister (74HC165) viel einfacher, als über Multiplexer. Peter
Man kann das, aber wie immer: man handelt Speicherplatz gegen Rechenzeit. Der AVR kann nur um ein Bit pro Befehl schieben, also hat man schlimmstenfalls 7 Schleifendurchläufe pro Byte, bis man die passende Bitposition erst einmal hat. Da du für nicht genutzten RAM von Atmel kein Geld zurück bekommst, würde ich das erst dann machen, wenn klar ist, dass der RAM zu knapp wird.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.