Вс июн 02, 2019 21:57:34
Пт июн 07, 2019 10:36:29
Вс июн 09, 2019 20:57:34
Чт июн 13, 2019 08:44:08
Сб июн 22, 2019 14:03:40
Вт июн 25, 2019 06:06:18
Сб июл 13, 2019 17:04:56
byte datas[9]{1,3,5,7,9,11,15,22,0};
byte flag;
#define crc_7 7 // функция обрабатывает CRC7 (адресный блок)
#define crc_8 8 // функция обрабатывает CRC8 (полный блокнот)
byte xpcrc(byte*, byte); // самоделка программного CRC
//----------
void setup() {
// put your setup code here, to run once:
flag = xpcrc(datas, crc_8);
// datas[crc_8] = flag;
}
void loop() {
// put your main code here, to run repeatedly:
}
//----------
byte xpcrc(byte *pad, byte mod)
{
byte tmp_crc = 0; byte ret_data = 0;
for (byte cnt=0; cnt<mod; cnt++)
{
byte tmp = pad[cnt];//*(pad + cnt);
for (byte a=0; a<8; a++)
{
if ((tmp_crc ^ tmp) & 0x01) // по результату обработки первого узла
{
tmp_crc = ((tmp_crc ^ 0x18) >> 1) | 0x80;
} // если результату обработки первого узла=1
else
{
tmp_crc = (tmp_crc >> 1) & 0x7F;
} // если результату обработки первого узла=0
tmp = tmp >> 1; // сдвигаем текущие данные
}
}
ret_data=tmp_crc;
return ret_data;
}
byte datas[9]{1,3,5,7,9,11,15,22,0};
byte flag;
#define crc_7 7 // функция обрабатывает CRC7 (адресный блок)
#define crc_8 8 // функция обрабатывает CRC8 (полный блокнот)
byte xpcrc(byte*, byte); // самоделка программного CRC
//----------
void setup() {
// put your setup code here, to run once:
flag = xpcrc(datas, crc_8);
datas[crc_8] = flag;
}
void loop() {
// put your main code here, to run repeatedly:
}
//----------
byte xpcrc(byte *pad, byte mod)
{
byte tmp_crc = 0; byte ret_data = 0;
for (byte cnt=0; cnt<mod; cnt++)
{
byte tmp = pad[cnt];//*(pad + cnt);
for (byte a=0; a<8; a++)
{
if ((tmp_crc ^ tmp) & 0x01) // по результату обработки первого узла
{
tmp_crc = ((tmp_crc ^ 0x18) >> 1) | 0x80;
} // если результату обработки первого узла=1
else
{
tmp_crc = (tmp_crc >> 1) & 0x7F;
} // если результату обработки первого узла=0
tmp = tmp >> 1; // сдвигаем текущие данные
}
}
ret_data=tmp_crc;
return ret_data;
}
datas[crc_8] = flag;
Сб июл 13, 2019 17:27:51
Сб июл 13, 2019 20:48:19
Сб июл 13, 2019 21:05:25
flag = xpcrc(datas, crc_8);
// datas[crc_8] = flag;
// flag = xpcrc(datas, crc_8);
// datas[crc_8] = flag;
Вс июл 14, 2019 07:24:38
Вс июл 21, 2019 18:51:43
Пн июл 29, 2019 12:31:40
Вт июл 30, 2019 12:51:59
void setup() {}
void loop() {}
/* ---------- */
/* заголовочный файл библиотеки программного обработчика */
/* Dallas CRC7/CRC8 */
//----------
#ifndef dscrc_H // Блокируем повторное включение этого модуля
#define dscrc_H
//----------
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
//----------
#define crc_7 7 // функция обрабатывает CRC7 (адресный блок)
#define crc_8 8 // функция обрабатывает CRC8 (полный блокнот)
#define test_crc 0 // проверка, при ошибке функция возвращает true
#define gen_crc 1 // генерация с подстановкой в последний
// байт блокнота, функция возвращает значение СКС
byte crc_mlan(byte*, byte, byte); // самоделка программного CRC
#endif
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#include "Arduino.h"
/* ---------- */
/* исполнительный файл библиотеки программного обработчика */
/* Dallas CRC7/CRC8 */
//----------
//******************************************************************
// Секция include: здесь подключается заголовочный файл к модулю
//******************************************************************
#include "dscrc.h" // заголовочный *.h файл текущего проекта
// ----------
// если задано task=test_crc (task=0) то функция
// возвращает или 0 при совпадении CRC
// или 1 при ошибке CRC
// если задано task=gen_crc (task=1) то функция
// возвращает собственно байт CRC
// *pad = адресу начала буфер-массива данных "блокнота"
// mod = crc_7 (mod = 7) для работы с адресным пакетом (8 байт)
// или
// mod = crc_8 (mod = 8) для работы с пакетом данных (9 байт)
//byte dscrc::crc_mlan(byte *pad, byte mod, byte task)
byte crc_mlan(byte *pad, byte mod, byte task)
{
byte tmp_crc = 0; byte ret_data = 0;
for (byte cnt=0; cnt<mod; cnt++)
{
byte tmp = pad[cnt];//*(pad + cnt);
for (byte a=0; a<8; a++)
{
if ((tmp_crc ^ tmp) & 0x01) // по результату обработки первого узла
{
tmp_crc = ((tmp_crc ^ 0x18) >> 1) | 0x80;
} // если результату обработки первого узла=1
else
{
tmp_crc = (tmp_crc >> 1) & 0x7F;
} // если результату обработки первого узла=0
tmp = tmp >> 1; // сдвигаем текущие данные
}
}
if (task)
{
ret_data = tmp_crc; // результат в байте возврата
pad[mod] = tmp_crc; //*(pad + mod) = tmp_crc; результат в последнем байте блокнота
}
else
{
ret_data = (tmp_crc == pad[mod]) ? 0 : 1 ; //(tmp_crc == *(pad + mod)) ? 0 : 1 ;
}
return ret_data;
}
#include "dscrc.h"
byte datas[9]{1,3,5,7,9,11,15,22,0};
byte flag;
void setup() {
// put your setup code here, to run once:
flag = crc_mlan(datas, 8, 1);
}
void loop() {
// put your main code here, to run repeatedly:
}
/* ---------- */
/* заголовочный файл библиотеки программного обработчика */
/* Dallas CRC7/CRC8 */
//----------
#ifndef dscrc_H // Блокируем повторное включение этого модуля
#define dscrc_H
//----------
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
//----------
class dscrc
{
public:
// объявление конструктора
dscrc (byte*); // в текущем приложении это указатель на массив "блокнота"
// объявление (и начальная инициализация) открытых членов класса
#define crc_7 7 // функция обрабатывает CRC7 (адресный блок)
#define crc_8 8 // функция обрабатывает CRC8 (полный блокнот)
#define test_crc 0 // проверка, при ошибке функция возвращает true
#define gen_crc 1 // генерация с подстановкой в последний
// байт блокнота, функция возвращает значение СКС
// объявление функций внешнего доступа
byte crc_mlan(byte, byte); // самоделка программного CRC
// в данном случае целевой массив блокнота заявляется
// в основном файле inc_test1.ino при создании экземпляра класса
private:
// объявление закрытых членов класса
byte *pad; // объявляем закрытый член класса
// копия указателя массива блокнота для внутренних нужд функции
}; // обязательное заключительное ";"
#endif
/* ---------- */
/* исполнительный файл библиотеки программного обработчика */
/* Dallas CRC7/CRC8 */
//----------
//********************************************************************
// Секция include: здесь подключается заголовочный файл к модулю
//********************************************************************
#include "dscrc.h" // заголовочный *.h файл текущего проекта
// ----------
// если задано task=test_crc (task=0) то функция
// возвращает или 0 при совпадении CRC
// или 1 при ошибке CRC
// если задано task=gen_crc (task=1) то функция
// возвращает собственно байт CRC
// *pad = адресу начала буфер-массива данных "блокнота"
// mod = crc_7 (mod = 7) для работы с адресным пакетом (8 байт)
// или
// mod = crc_8 (mod = 8) для работы с пакетом данных (9 байт)
/*
* конструктор
* задаем соответствие физических линий интерфейса
* или данных/переменных главной программы
* закрытым переменным членам класса
*/
dscrc::dscrc(byte *datas)
{
pad = datas; // указатель на массив блокнота привязывается к
// закрытому члену данного экземпляра класса
}
byte dscrc::crc_mlan(byte mod, byte task)
{
byte tmp_crc = 0; byte ret_data = 0;
for (byte cnt=0; cnt<mod; cnt++)
{
byte tmp = pad[cnt];//*(pad + cnt);
for (byte a=0; a<8; a++)
{
if ((tmp_crc ^ tmp) & 0x01) // по результату обработки первого узла
{
tmp_crc = ((tmp_crc ^ 0x18) >> 1) | 0x80;
} // если результату обработки первого узла=1
else
{
tmp_crc = (tmp_crc >> 1) & 0x7F;
} // если результату обработки первого узла=0
tmp = tmp >> 1; // сдвигаем текущие данные
}
}
if (task)
{
ret_data = tmp_crc; // результат в байте возврата
pad[mod] = tmp_crc; //*(pad + mod) = tmp_crc; результат в последнем байте блокнота
}
else
{
ret_data = (tmp_crc == pad[mod]) ? 0 : 1 ; //(tmp_crc == *(pad + mod)) ? 0 : 1 ;
}
return ret_data;
}
#include "dscrc.h"
byte datas[9]{1,3,5,7,9,11,15,22,0};
byte flag;
// выполнение конструктора для создания экземпляра класса
// и задания имени этого экземпляра класса
// в данном примере my_dscrc является экземпляром класса dscrc
dscrc my_dscrc (datas);
void setup() {
// put your setup code here, to run once:
flag = my_dscrc.crc_mlan(8, 1);
}
void loop() {
// put your main code here, to run repeatedly:
}
/* ---------- */
/* заголовочный файл библиотеки программного обработчика */
/* Dallas CRC7/CRC8 */
//----------
#ifndef dscrc_H // Блокируем повторное включение этого модуля
#define dscrc_H
//----------
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
//----------
class dscrc
{
public:
// объявление (и начальная инициализация) открытых членов класса
#define crc_7 7 // функция обрабатывает CRC7 (адресный блок)
#define crc_8 8 // функция обрабатывает CRC8 (полный блокнот)
#define test_crc 0 // проверка, при ошибке функция возвращает true
#define gen_crc 1 // генерация с подстановкой в последний
// байт блокнота, функция возвращает значение СКС
// объявление функций внешнего доступа
byte crc_mlan(byte*, byte, byte); // самоделка программного CRC
// в данном случае целевой массив блокнрта заявляется
// в основном файле inc_test1.ino при создании экземпляра класса
private:
// объявление закрытых членов класса
}; // обязательное заключительное ";"
extern dscrc my_dscrc; // присваиваем прикладное имя my_dscrc
#endif
/* ---------- */
/* исполнительный файл библиотеки программного обработчика */
/* Dallas CRC7/CRC8 */
//----------
//*****************************************************************
// Секция include: здесь подключается заголовочный файл к модулю
//******************************************************************
#include "dscrc.h" // заголовочный *.h файл текущего проекта
// ----------
// если задано task=test_crc (task=0) то функция
// возвращает или 0 при совпадении CRC
// или 1 при ошибке CRC
// если задано task=gen_crc (task=1) то функция
// возвращает собственно байт CRC
// *pad = адресу начала буфер-массива данных "блокнота"
// mod = crc_7 (mod = 7) для работы с адресным пакетом (8 байт)
// или
// mod = crc_8 (mod = 8) для работы с пакетом данных (9 байт)
byte dscrc::crc_mlan(byte *pad, byte mod, byte task)
{
byte tmp_crc = 0; byte ret_data = 0;
for (byte cnt=0; cnt<mod; cnt++)
{
byte tmp = pad[cnt];//*(pad + cnt);
for (byte a=0; a<8; a++)
{
if ((tmp_crc ^ tmp) & 0x01) // по результату обработки первого узла
{
tmp_crc = ((tmp_crc ^ 0x18) >> 1) | 0x80;
} // если результату обработки первого узла=1
else
{
tmp_crc = (tmp_crc >> 1) & 0x7F;
} // если результату обработки первого узла=0
tmp = tmp >> 1; // сдвигаем текущие данные
}
}
if (task)
{
ret_data = tmp_crc; // результат в байте возврата
pad[mod] = tmp_crc; //*(pad + mod) = tmp_crc; результат в последнем байте блокнота
}
else
{
ret_data = (tmp_crc == pad[mod]) ? 0 : 1 ; //(tmp_crc == *(pad + mod)) ? 0 : 1 ;
}
return ret_data;
}
#include "dscrc.h"
byte datas[9]{1,3,5,7,9,11,15,22,0};
byte flag;
void setup() {
// put your setup code here, to run once:
flag = my_dscrc.crc_mlan(datas, 8, 1);
}
void loop() {
// put your main code here, to run repeatedly:
}
Вт июл 30, 2019 13:31:17
я слежу за вашим "блогом", BOB51, поскольку мне интересен избранный вами тернистый путь "первооткрывателя" АмерикиBOB51 писал(а):Правда это "книжная рекомендация" - на практическом тесте экономии байт с 12...
int var = 1;
if(!var){
// здесь 250 килобайт кода
} else {
var = 1;
}
Вт июл 30, 2019 14:09:07
Вт июл 30, 2019 14:15:55
я не использую C++ в принципе, не владею. и желания овладевать нет совсем. конечно, для ознакомления с исходниками "библиотек" для ардуины, моих знаний С++ хватает, но комментировать - увольте, боюсь, сяду в лужу... слишком там много нюансов...BOB51 писал(а):Лучше бы чего про вынос текстовки за пределы основного файла прокомментировали
Вт июл 30, 2019 15:33:04
Вт июл 30, 2019 18:51:26
Вт июл 30, 2019 21:12:32