Tablica Bitów

DZ
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:1
0

Witam
Staram się sterować TLC5923 w tym celu potrzebuję stworzyć tablicę 16 elementowo gdzie każdy element będzie się składał z 7 bitów a następnie modyfikować wybrany element.
zależałoby mi żeby był to jeden Ciąg znaków bo zapisuje się do tego scalaka jako jedno 112bit słowo, przez interfejs podobny do SPI
Jakieś pomysły jak to zrobić albo propozycje innego rozwiązania ?

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 4 godziny
0

Tablicy się chyba nie da, ale można strukturę:

Kopiuj
struct elementy_t
{
    unsigned int e0 : 7;
    unsigned int e1 : 7;
    unsigned int e2 : 7;
    .
    .
    .
    unsigned int e15 : 7;
};
edytowany 1x, ostatnio: Azarien
MO
  • Rejestracja:około 10 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Tam gdzie jest (centy)metro...
0
Kopiuj
 
#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>

typedef union {
    struct {
        uint8_t val0;
        uint8_t val1;
        //...
        uint8_t val15;
    } data;
    uint8_t table[16];
    struct {
        uint64_t first;
        uint64_t second;
    } stream;
} msg_t;

void clear_msg(msg_t *msg) {
    // Czyści msg.
    msg->stream.first = 0;
    msg->stream.second = 0;
}

void send_prepare(msg_t *msg) {
    // Funkcja przesuwająca bity tak by przygotować je do przesłania przez SPI.
    // Pracuje na msg.stream i zeruje "ogon" danych.
}

void send(const msg_t *msg) {
    // Funkcja przesyłająca dane przez SPI. Pracuje na msg.stream.
}

int main() {
    msg_t msg;

    clear_msg(&msg);
    // Dostęp przez wartości w sekcji .data...
    msg.data.val0 = 0x01;
    msg.data.val1 = 0x02;
    // Dostęp przez tablicę
    msg.table[2] = 0x03;
    // Dostęp przez "strumień"
    msg.stream.second = 0x1122334455667788;

    // Jedynie w celu udokumentowania.
    // W zależności od kolejności bajtów maszyny, inny wynik...
    printf("msg.stream.first = 0x%" PRIX64 "\n", msg.stream.first);
    printf("msg.stream.second = 0x%" PRIX64 "\n", msg.stream.second);

    return 0;
}

Ja bym to zrobił tak. Pola bitowe zawsze się kończą źle na tak niskim poziomie (instrukcje asm są z reguły nieefektywne). W zależności od kolejności bajtów maszyny (big/little)endian, przestaw pola lub zmień sposób obróbki danych.


Każdy problem w informatyce można rozwiązać, dodając kolejny poziom pośredniości,z wyjątkiem problemu zbyt dużej liczby warstw pośredniości — David J. Wheeler

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.