Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
18.10.2008, 07:53
|
#21
|
Частый гость
Регистрация: 22.03.2007
Сообщений: 21
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Большое спасибо. Я прежде чем заниматься этой проблемой понаходил много материала в сети. Но в любом случае спасибо.
|
|
|
|
18.10.2008, 07:57
|
#22
|
Частый гость
Регистрация: 22.03.2007
Сообщений: 21
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Посмотрел. Это перый материал, что я нашел. Там криво написана подпрограмма подсчета CRC16, но подробно описан алгоритм. Еще раз спасибо!
|
|
|
|
18.10.2008, 10:07
|
#23
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,726
Сказал спасибо: 2,428
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Протокол modbus. Вопросы по интерфейсу
Не попадалась не криво написанная программа расчета CRC16?
|
|
|
|
18.10.2008, 10:30
|
#24
|
Частый гость
Регистрация: 22.03.2007
Сообщений: 21
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Попадалась, я ее сам написал.
Формат кадра следующий:
p[0] - номер вызываемого контроллера
p[1] - функция
p[2] - количество байт информации
p[n] - блок информации (если его нет, то p[2]=0)
p[n-1] - ст.байт CRC
p[n] - мл.байт CRC
//вычисление CRC WinAVR (ATMega
int calc_crc16 (unsigned char *p)
{
int crc16 = 0xffff;
uint8_t c,i; //счетчики циклов
for(c=0; c‹(p[2]+3) ;c++)
{
crc16 ^=p[c]; //eor байта из буфера с crc
for(i=0; i‹8; i++)
{
crc16 = (crc16››1);//сдвиг вправо
if (crc16&0x0001)
crc16 ^= 0xa001;
}
}
return crc16;
}
|
|
|
|
18.10.2008, 12:25
|
#25
|
Прохожий
Регистрация: 03.02.2007
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Сообщение от gora888
|
Попадалась, я ее сам написал.
Формат кадра следующий:
p[0] - номер вызываемого контроллера
p[1] - функция
p[2] - количество байт информации
p[n] - блок информации (если его нет, то p[2]=0)
p[n-1] - ст.байт CRC
p[n] - мл.байт CRC
//вычисление CRC WinAVR (ATMega
int calc_crc16 (unsigned char *p)
{
int crc16 = 0xffff;
uint8_t c,i; //счетчики циклов
for(c=0; c‹(p[2]+3) ;c++)
{
crc16 ^=p[c]; //eor байта из буфера с crc
for(i=0; i‹8; i++)
{
crc16 = (crc16››1);//сдвиг вправо
if (crc16&0x0001)
crc16 ^= 0xa001;
}
}
return crc16;
}
|
Зачем изобретать колесо??? В WinAVR есть библиотечная функция расчета контрольной суммы, считает правильно. Header - crc16.h Там несколько вариантов, в зависимости от полинома и начального значения
|
|
|
|
18.10.2008, 13:12
|
#26
|
Частый гость
Регистрация: 22.03.2007
Сообщений: 21
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Это в версии 2007 года такая функция есть, а в 2006-го не было. Да, собственно дело не в этом. Надо было написать такую же функцию для компа, а в Делфи такой функции нет, а может и есть, но я как новоначальный в программировании персоналок ее бы искал до второго пришществия. Надо было сделать подсчет CRC и в контроллере и в персоналке, что бы считалось одинаково. Поэтому и была написана такая подпрограмма, что бы ее повтроить на персоналке. Причем на С++ она считалась правильно, а в Делфи криво. Пока не разобрался с типом переменной. Си позволяет некоторые вольности типа int crc16=0xffff, а Делфи матерится, т.к. старший бит знаковый. Ну, тем не менее все работает больше года. Передача кадра из PC в контроллер и подтверждение с контрольными суммами, все как у профессионалов
|
|
|
|
18.10.2008, 17:10
|
#27
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,726
Сказал спасибо: 2,428
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Протокол modbus. Вопросы по интерфейсу
В своем вопросе пропустил слово.Интересует программа расчета CRC16 по таблице (для микропроцессора).Прямой расчет занимает много времени.
|
|
|
|
19.10.2008, 06:30
|
#28
|
Прохожий
Регистрация: 03.02.2007
Сообщений: 3
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Протокол modbus. Вопросы по интерфейсу
Сообщение от baiderin
|
В своем вопросе пропустил слово.Интересует программа расчета CRC16 по таблице (для микропроцессора).Прямой расчет занимает много времени.
|
А табличный много памяти Я уже ссылку чуть выше давал, но повторюсь http://freemodbus.berlios.de/ Вот там есть табличный расчет
|
|
|
|
19.10.2008, 07:58
|
#29
|
Почётный гражданин KAZUS.RU
Регистрация: 10.12.2007
Адрес: Екатеринбург
Сообщений: 2,726
Сказал спасибо: 2,428
Сказали Спасибо 893 раз(а) в 580 сообщении(ях)
|
Протокол modbus. Вопросы по интерфейсу
Спасибо kgsh82 .
Просто свободной памяти много,а со свободным временем хуже.
|
|
|
|
15.12.2008, 22:25
|
#30
|
Частый гость
Регистрация: 12.12.2008
Сообщений: 20
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Здравствуйте, товарищи трудящиеся. Пожалуйста, если у кого имеется, дайте русскоязычное описание Modbus. Кому надо, могу дать английское.
__________________
Одни люди, пытаются понять то, во что они верят, а другие поверить в то, что понимают....
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:33.
|
|