Hallo Leute, ich portiere grade ein Javascript code auf einen avr in C.
Genaugenomen handelt es sich eine crc Prüfsummen berechnung von 40bits .
Der JavaScript teil schaut so aus:
function CRC(crcBits) {
console.log(crcBits.join(""))
let crc = [0, 0, 0, 0, 0, 0, 0];
for (i = 0; i < crcBits.length; ++i) {
let doinvert = (1 == crcBits[i]) ^ crc[6];
crc[6] = crc[5] ^ doinvert;
crc[5] = crc[4];
crc[4] = crc[3];
crc[3] = crc[2];
crc[2] = crc[1] ^ doinvert;
crc[1] = crc[0];
crc[0] = doinvert;
}
console.log(crc.reverse().join(""));
crcBits.push(...crc.reverse());
return crcBits;
}
crcBits ist ein Array enthält 40 bits wie folgt: 1111_0010_1000_1000_1100_0000_1111_0000_0111_0011
da kommt als Prüsumme 1100011.
Aus übersicht's Gründen und Speicher mangel beim AVR , habe die Telegramm Daten in den PROGMEM gepackt.
const byte telegrammArray[10][4] PROGMEM = {
{1, 1, 1, 1},//BOS
{0, 0, 1, 0},//LAND
{1, 0, 0, 0},//ORT1
{1, 0, 0, 0},//ORT2
{1, 1, 0, 0},//KFZ1
{0, 0, 0, 0},//KFZ2
{1, 1, 1, 1},//KFZ3
{0, 0, 0, 0},//KFZ4
{0, 1, 1, 1},//AUFTRAG
{0, 0, 1, 1} //Baustufe, Richtung, Taktische Kurzinfo
};
Zur weiterverarbeitung schreibe ich alles in eine 64 bit Variable die global in der .ino Datei steht:
volatile uint64_t initial_telegrammData = 0x00ULL; //<-global
void initTelegramm() {
volatile byte bitIndex = 40;
for (volatile byte i = 0; i < sizeof(telegrammArray) / sizeof(telegrammArray[0]); i++) {
for (volatile byte y = 0; y < sizeof(telegrammArray[i]) / sizeof(telegrammArray[i][0]); y++) {
bool _word = pgm_read_word(&telegrammArray[i][y]);
if (_word) {
initial_telegrammData |= (1ULL << bitIndex);
}
bitIndex -= 1;
}
}
}
Die crc berechnung schaut so aus:
byte calcCRC(uint64_t data) {
bool crc[] = {0, 0, 0, 0, 0, 0, 0};
volatile byte i = 40;
byte CRC = 0x00;
for (; i > 0; --i) {
Serial.print((bool)(data & ((uint64_t)1<<i)), DEC);
bool doinvert = (1 == (data & ((uint64_t)1<<i))) ^ crc[6];
crc[6] = crc[5] ^ doinvert;
crc[5] = crc[4];
crc[4] = crc[3];
crc[3] = crc[2];
crc[2] = crc[1] ^ doinvert;
crc[1] = crc[0];
crc[0] = doinvert;
}
for (i = 0; i < 7; i++) {
CRC |= (crc[i] << i);
}
return CRC;
}
uint64_t data ist initial_telegrammData.
Das Serial.print((bool)(data & ((uint64_t)1<<i)), DEC); sagt mir das irgendwas nicht stimmt.
Ich erwarte 1111_0010_.........0011. Ausgegeben wird: 1111_0111........0111
Das Problem ist aber allen anschien nach schon in der Funktion initTelegramm zu finden.
Ich habe auch schon das Progmem Array rückwärts durchlaufen und bitIndex um 1 inkrementiert.
Da kam aber auch nur Murks raus.
Jedenfalls der javascript code funktioniert und in C ist eine Krücke versteckt. Nur wo?
Dank schon mal im voraus
.