Tablica Bitów

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 ?

0

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

struct elementy_t
{
    unsigned int e0 : 7;
    unsigned int e1 : 7;
    unsigned int e2 : 7;
    .
    .
    .
    unsigned int e15 : 7;
};
0
 
#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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1