Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: помогите куском кода
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
laryc
не получается вкурить даташиты! ..почему-то.. нужно вычислять сrc-8 _CCITT = 0X07 c (double ) DATA
Был бы очень благодарен если кто-нибудь даст рабочий код для Си AVRa
laryc
Цитата(laryc @ Feb 3 2016, 14:40) *
не получается вкурить даташиты! ..почему-то.. нужно вычислять сrc-8 _CCITT = 0X07 c (double ) DATA
Был бы очень благодарен если кто-нибудь даст рабочий код для Си AVRa

никто не делится... наверно некоректно поставил задачу... нужна функция для подсчёта CRC-8 переменной двойной точности... алгоритм желательно не табличный
sigmaN
Довольно необычная стоит задача однако )))
Не часто встретишь алгоритмы с использованием double на AVR.
Но раз надо значит надо ))
Предлагаю рассмотреть вариант прогонять через CRC байты, которые в памяти занимает ваша переменная двойной точности.
Получить их можно приведением указателя на double к указателю на char.
Код
uint8_t *byte_ptr = (void*)&double_variable;


Потом можно будет пройтись по байтам и пропустить их через самую обычную реализацию CRC-8.

А вот например первая попавшаяся ссылка из гугла
https://chromium.googlesource.com/chromiumo...ware/lib/crc8.c
Принимает указатель на void*
Код
uint8_t Crc8(const void *vptr, int len)

Так что можно будет вызвать ее и для double
Код
Crc8(&double_variable, sizeof(double_variable));

jcxz
Цитата(sigmaN @ Feb 4 2016, 05:13) *
Потом можно будет пройтись по байтам и пропустить их через самую обычную реализацию CRC-8.

Что Вы такое пишете??? Какая обычная CRC8???
Автор же ясно написал: ему нужна CRC8 именно для double! И чтобы она была написана обязательно на AVR-си, а не каком-то другом!
И что Вы такое пишете про double? Конечно же он жизненно нужен! Как ещё можно умножить 0.4*0.3??? Без дабла ну никак!
cranky.gif
laryc
Спасибо ,конечно! Но ситуация ,как в анекдоте про сношение на улице.... код однако до зарезу нужен, а я не силён в математике
sigmaN
Вам начинать с азов надо,похоже... вопрос задан и ответ на него у вас есть.
Если ответ не понятен и не помогает решить задачу то определенно есть большие пробелы в знаниях и понимании того как это все работает и начинать надо с их устранения.
k155la3
Цитата(laryc @ Feb 4 2016, 06:52) *
Спасибо ,конечно! Но ситуация ,как в анекдоте про сношение на улице.... код однако до зарезу нужен, а я не силён в математике


CRC8 используется у Dallas OWI.
Можете посмотреть, гдето могут быть исходник. Правда, насколько он соответствует CCITT - не знаю.
Если функция нетабличная, то ее легко переделать под любой полином, в том числе и CCITT.
есть исходники (табличные) на
x^8 + x^2 + x + 1 */ (Dallas)
x^8 + x^2 + x + 1 / ATM.
Посмотрите работу-исходники например с DS18B20 - оно там должно быть.
Хотя в интернете можно найти быстрее.



laryc
Цитата(sigmaN @ Feb 4 2016, 15:18) *
Вам начинать с азов надо,похоже... вопрос задан и ответ на него у вас есть.
Если ответ не понятен и не помогает решить задачу то определенно есть большие пробелы в знаниях и понимании того как это все работает и начинать надо с их устранения.

интересно ... а Вы понимаете что Вы пишите? ..... "Корни настоящих событий глубоко переплетаются с корнями прошлых событий..." М. Горбачёв


Цитата(k155la3 @ Feb 4 2016, 16:09) *
CRC8 используется у Dallas OWI.
Можете посмотреть, гдето могут быть исходник. Правда, насколько он соответствует CCITT - не знаю.
Если функция нетабличная, то ее легко переделать под любой полином, в том числе и CCITT.
есть исходники (табличные) на
x^8 + x^2 + x + 1 */ (Dallas)
x^8 + x^2 + x + 1 / ATM.
Посмотрите работу-исходники например с DS18B20 - оно там должно быть.
Хотя в интернете можно найти быстрее.

Спасибо.. я примерно так и мыслю... так и пойду.. но Далласовский алгоритм использует несколько другой полином.. и табличный алгоритм мне несколько тяжеловат.. я как-то встречал алгоритм без таблицы ..он хорош для коротких сообщений т. е. у меня всегда в сообщении пять байт и я могу их засунуть в переменную double и всего-то посчитать crc для одного числа .. вот чего добивается Коля Остенбакен от небезЫзвестной особы... блин придётся посвятить воскресеннье этой рутине ежели кто реально не поможет
esaulenka
Какие-то не те книжки Вы читаете.

Берём гугл. Ищем "алгоритм crc8".
Первая же ссылка - wikibooks.
Копируем "Пример программы расчёта CRC8 на языке Си".
Вызываем:
Код
double myDouble = 1.23;
unsigned char crcResult = Crc8 ((unsigned char *) &myDouble, sizeof(myDouble));

Проверяем. Не сходится.
Внимательно читаем, выясняем, что Вам нужен полином 0x07, а тут используется далласовский 0x31. Меняем ОДНУ цифру 0x31 на 0x07, правим комментарий, повторяем проверку.


PS не силён в double'ах AVR-компиляторов. Но фразу "в сообщении 5 байт" с 8-байтовым double'ом связаны как-то слабо.
sigmaN
Цитата
интересно ... а Вы понимаете что Вы пишите?
Писал ответ на ваш вопрос, объяснив для Вас, что какой-то специализированной функции для double не требуется....И привел конкретные рабочие куски кода. Это же Ваши слова?
Цитата
нужна функция для подсчёта CRC-8 переменной двойной точности


Ежели после моей подсказки вам сложно сообразить что, как Вам выше уже разжевали, можно взять реализацию из букваря и заменить одно число - то я продолжу настаивать на том, что сказал ранее.


Цитата
блин придётся посвятить воскресеннье этой рутине ежели кто реально не поможет
ну тут ясно все с Вашим подходом. Типичный пример того, как человек не желает разобраться в вопросе, но хочет чтоб уже завтра все работало. Так не бывает.

Успехов!
laryc
Цитата(esaulenka @ Feb 5 2016, 18:39) *
Какие-то не те книжки Вы читаете.

Берём гугл. Ищем "алгоритм crc8".
Первая же ссылка - wikibooks.
Копируем "Пример программы расчёта CRC8 на языке Си".
Вызываем:
Код
double myDouble = 1.23;
unsigned char crcResult = Crc8 ((unsigned char *) &myDouble, sizeof(myDouble));

Проверяем. Не сходится.
Внимательно читаем, выясняем, что Вам нужен полином 0x07, а тут используется далласовский 0x31. Меняем ОДНУ цифру 0x31 на 0x07, правим комментарий, повторяем проверку.


PS не силён в double'ах AVR-компиляторов. Но фразу "в сообщении 5 байт" с 8-байтовым double'ом связаны как-то слабо.

попытка не увенчалась успехом .. посмотрите код ..что не так?

//делаем переменную из пяти байт
unsigned long long myDouble = 0;//double не позволяет сдвигать берём long long
myDouble = myDouble+number[0];
myDouble = myDouble<<8;
myDouble = myDouble+number[1];
myDouble = myDouble<<8;
myDouble = myDouble+number[2];
myDouble = myDouble<<8;
myDouble = myDouble+number[3];
myDouble = myDouble<<8;
myDouble = myDouble+number[4];


number[5] = Crc8 ((unsigned char *) &myDouble, sizeof(myDouble));



unsigned char Crc8(unsigned char *pcBlock, unsigned int len)
{
unsigned char crc = 0xFF;
unsigned int i;

while (len--)
{
crc ^= *pcBlock++;

for (i = 0; i < 8; i++)
crc = crc & 0x80 ? (crc << 1) ^ 0x07 : crc << 1;//0x31
}

return crc;
}


мож я действительно как-то не так мыслю... задача у меня такая : принимаю по USARTу пять байт и считаю CRC - 8 по полиному 0х07.. я согласно учебникам решил сделать 40 битовое число чтобы не заморачиваться с массивами и посчитать crc для одного числа .. честно сказать я не очень понимаю как работают указатели - всю жизнь обходился без них (уровень достаточного дилетанта)
sigmaN
1. используйте типы данных из stdint.h. Так будет правильнее.
2. в задаче
Цитата
принимаю по USARTу пять байт и считаю CRC - 8 по полиному 0х07.
я не увидел double...
3. в массиве number[], на сколько я понимаю, у вас уже лежит принятые по UART 5 байт и нет ни единого повода сначала паковать эти 5 байт в одно длинное число, чтобы потом гордо распаковывать на байты внутри функции которая считает crc.
Так что смело вызывайте Crc8 (&number[0], 5); и она подсчитает CRC8 для 5 байт из массива number.

Про указатели почитайте, гугл знает.
k155la3
Цитата(laryc @ Feb 7 2016, 15:07) *
попытка не увенчалась успехом .. посмотрите код ..что не так?
//делаем переменную из пяти байт
unsigned long long myDouble = 0;//double не позволяет сдвигать берём long long


А что Вы имеете ввиду "double не позволяет сдвигать"
- что сдвигать
- куда сдвигать
- зачем

А что именно успехом не увенчалось ?

Цитата(laryc)
мож я действительно как-то не так мыслю... задача у меня такая : принимаю по USARTу пять байт и считаю CRC - 8 по полиному 0х07.. я согласно учебникам решил сделать 40 битовое число чтобы не заморачиваться с массивами и посчитать crc для одного числа .. честно сказать я не очень понимаю как работают указатели - всю жизнь обходился без них (уровень достаточного дилетанта)



unsigned char RxBuf[1000];

RxBuf[0] = GetUSART_Byte();
RxBuf[1] = GetUSART_Byte();
RxBuf[2] = GetUSART_Byte();
RxBuf[3] = GetUSART_Byte();
RxBuf[4] = GetUSART_Byte();

unsigned char * MyPtr = (unsigned char *) &RxBuf[0];

unsigned char MyCRC;

MyCRC = Crc8 ( MyPtr, 5 );
printf("\nMyCRC8 = %.2X", MyCRC);

Не мучайте AVR. Возьмите на PC VisualStudio и наклацайте main() в console-проекте.

Кроме полинома, для ф-ии CRC есть еще как минимум 2 "подстройки"
- "стартовое" значение. В приведенной выше ф-ии unsigned char crc = 0xFF;
но может использоваться и 0x00
- порядок "счета" бит в байте, или направление сдвига (определяет, какой бит в "новом" байте
будет обработан первым - младший или старший)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.