Урок просто бомба! Как вник в идею, старался писать код с небольшим опережением, ставя видео на паузу, потом проверял себя. Когда всё заработало, восторг был как у пятилетнего ребёнка, получившего каких-нибудь ништяков! Огромное вам спасибо!))) Есть к вам пожелание: анонсируйте пожалуйста заранее следующую "игрушку". Ладно PIC16F84A в количестве 2 штук мне когда-то кто-то подарил, ладно DS18B20 у меня на работе гроздями. Но если, скажем, вы соберётесь подключать жк дисплей, которого у зрителя не окажется, придётся ждать подарочек из Китая, а это минимум три недели, а порой и несколько месяцев! Хочется, чтобы урок проходил сразу с практикой, написал код, Протеусом проверил и на макетку)))
+Villiam JetWings Ну хорошо, я посторяюсь продумывать уроки так, чтоб можно было что-то заказать и оно успевало прийти вовремя) Я думаю у вас будет ещё больше восторга, когда вы реализуете алгоритм поиска устройств на шине 1 wire) Сегодня сел за новый урок. После небольшого перерыва трудно заставить себя снова снимать)) Ну а после этого урока, который я сейчас снимаю, как раз будет рассмотрен алгоритм поиска устройств)
Твоя способность внедрять в голову относительно непонятные вещи поражает, молодец, так держать! Не думал сделать уроки по более актуальным STM32 (цена/перефирия/возможности наголову выше), хотя цели данных уроков понятны? Мне кажется актуальностью и твоей способностью объяснять простыми словами ты порвал бы эфир!
+Вадим Епт Сам просто начинал с 2004 с ПЛК, там все готово. Это как водитель на современной машине с общими знаниями, как она устроена. Решил наконец-то въехать, как МК устроены. Ваши уроки как раз для "въезда". Просто начитавшись форумов о STM, думаю цена/возможности как раз для современного использования даже в бытовых целях.
+Вадим Епт Я бы в начале с ПИКами закончил) По поводу ЛУТ и фоторезиста. Я бы рекоменодовал ЛУТ. С Лутом проще разобраться и вероятность большая того, что всё получится. С фоторезистом может ни чего не получится или будет получяться с переменным успехом. Для ЛУТа лучше использовать глянцевую фотобумагу, если нужны узкие дорожки. У нас есть магазин Ассорти, в котором раздаются бесплатные журналы с "Выгодной покупкой" (komiinform.ru/content/image-news/120719/assorti.JPG), бумага которая тонкая и глянцевая. На неё схему печатаем, перед этим приклеив лист журнала на лист бумаги А4, так как лист тонкий и принтер жуёт её. Почти у всех студентов получается перевести схему с первого раза. Когда возникнет потребность делать дорожки более узкими и ЛУТ не будет справляться, то можно переходить на фоторезист, но и там в начале нужно начать с широких дорожек и быть готовым к неудачам)
И да сорямба, скачал всего тебя при помощи стороннего ПО (плагины), потому чта ты молодец! Зато твой гнусный голос (покури ченить, может поправит), но по факту, несущий нужное, теперь всегда со мной (бедные твои студни)!
Описание к видео: В уроке написана программа на языке ассемблер для расчёта CRC 1-wire интерфейса. Программа написана для микроконтроллера PIC16F84A в программе MPLAB X. В начале урока показано, как вычислять CRC, используемый в 1-wire интерфейсе. Указано, где можно найти порождающий многочлен, необходимый для расчёта CRC. Показана идея или алгоритм расчёта CRC для микроконтроллера. Также показано, как определить правильность полученный данных по интерфейсу 1-wire. В качестве проверяемых данных использовался адрес ведомого 1-wire устройства. Правильность работы программы продемонcтрирована на схеме, собранной в программе Proteus. Ссылка на таблицу, используемую в уроке: drive.google.com/file/d/0B3lFUSB8ZK9Rb29MZ1JXWVRvelU/view?usp=sharing Ссылка на программу (.txt): drive.google.com/file/d/0B3lFUSB8ZK9Ra1hlREhzbVd5bWM/view?usp=sharing
Спасибо, довольно понятно. Может есть другие приемы подсчета CRC. Просмотрел листинги двух программ так там используется команда XORLW 0x18 и так-же сдвиг вправо. Хотелось бы разобраться почему 0x18 (00011000)
;позволяет проверить и вычислить - реализация алгоритма микросхем ; (AVR) .macro mCRC_1WIRE00 ;(38 байт)Макрос проверки CRC (tr16-21, Z), если правильно, то tr18=0, + получить CRC ;mCRC_1WIRE00 IN, KolIN ;mCRC_1WIRE00 @0, @1 start0: ldi tr30, byte1(@0) ; Z адрес значения IN младший байт ldi tr31, byte2(@0) ; Z адрес значения IN старший байт ldi tr20, @1 ; Количество значений IN т.е. длина проверяемой строки включая значение CRC clr tr18 ; байт B - сдвигающий регистр промежуточного значения который в конце должен быть равен нулю ; 0b00001100 ; x8+x5+x4+1 = 1*x8+0*x7+0*x6+1*x5+1*x4+0*x3+0*x2+0*x1+1*x0 = 100110001 (перевёрнуть) => 100011001 => 0001100 (удалить единицы слева и справа) ldi tr19, 0b00001100 ; байт Данное значение используется для XOR если l0= IN0 xor b0 = 1 start1: ld tr16, Z+ ; байт tr16=IN Загрузка следующего значения IN; ldi tr21, 8 ; байт Счётчик - количество бит = 8
dec tr21 ; уменьшение счётчика на единицу brne start2 ; если счётчик не равен нулю то переход по ссылке на следующий заход dec tr20 ; уменьшение счётчика на единицу brne start1 ; если счётчик не равен нулю то переход по ссылке на следующий заход ; ; проверка ; tr18 должен быть равен нулю, то тогда правильно ; вычисление - после макроса добавить ; st Z+, tr18 ; в конце строки добавить tr18 .endm Данный макрос написан в соответствии с алгоритмом в описании 1WIRE. Позволяет как получать CRC так и проверять правильность. Полученные результаты соответствуют с подходом в Вашей лекции. А вот макрос для MODBUS RTU по алгоритму как в описании MODBUS RTU(по ней можно, как получить так и проверить CRC) не совпадает по значениям CRC с подходом в Вашей лекции. Получается, что для каждого случая должно быть своё описание? Стандартный подход не всегда подходит?
А почему фирмой выбран именно 8 байтный формат записи адреса устройства, не слишком ли это много, от кого такая шифровка, что ли это заказ военных? Михаил, спасибо, урок шикарный, даже противный голос стал почти родным.
+Евгений KZTemir Такую формулу выбрали разработчики интерфейса 1-Wire, для того, чтоб вычислять CRC для своих устройств. Под этой формулой скрывается набора 0 и 1, который указан в уроке. Чтоб было понятно запишем формулу так: 1*Х8+0*X7+0*X6+1*Х5+1*Х4+0*X3+0*X2+0*X1+1 = Х8+Х5+Х4+1. Убрав все X со степенями, а также знак +, получим 100110001. Почему используется запись в виде многочлена, потому что она пришла из математической теории, на сколько мне известно. Почему разработчики выбрали именно такой многочлен. Существует теория математическая из которой можно выбрать такой многочлен, чтоб он позволял надёжней проверять правильность полученных данных. Видимо разработчики подсчитали, что именно такой многочлен им подходит лучше. Чтоб уйти в глубь CRC, нужно найти литературу про CRC или циклический избыточный код и почитать. Но она может оказаться не очен простой, но попробовать можно)
Благодарю! Самое понятное объяснение данной темы!)
Спасибо! Теперь понял. Самое доступное объяснение расчета CRC.
последние уроки относительно сложноваты. но все же разобраться удалось. жду новые уроки)) особенно прерывания и ШИМ) спасибо)
Урок просто бомба! Как вник в идею, старался писать код с небольшим опережением, ставя видео на паузу, потом проверял себя. Когда всё заработало, восторг был как у пятилетнего ребёнка, получившего каких-нибудь ништяков! Огромное вам спасибо!))) Есть к вам пожелание: анонсируйте пожалуйста заранее следующую "игрушку". Ладно PIC16F84A в количестве 2 штук мне когда-то кто-то подарил, ладно DS18B20 у меня на работе гроздями. Но если, скажем, вы соберётесь подключать жк дисплей, которого у зрителя не окажется, придётся ждать подарочек из Китая, а это минимум три недели, а порой и несколько месяцев! Хочется, чтобы урок проходил сразу с практикой, написал код, Протеусом проверил и на макетку)))
+Villiam JetWings Ну хорошо, я посторяюсь продумывать уроки так, чтоб можно было что-то заказать и оно успевало прийти вовремя) Я думаю у вас будет ещё больше восторга, когда вы реализуете алгоритм поиска устройств на шине 1 wire) Сегодня сел за новый урок. После небольшого перерыва трудно заставить себя снова снимать)) Ну а после этого урока, который я сейчас снимаю, как раз будет рассмотрен алгоритм поиска устройств)
Тяжеловато воспринимается, но интересно!.. Здорово!!!
Твоя способность внедрять в голову относительно непонятные вещи поражает, молодец, так держать! Не думал сделать уроки по более актуальным STM32 (цена/перефирия/возможности наголову выше), хотя цели данных уроков понятны? Мне кажется актуальностью и твоей способностью объяснять простыми словами ты порвал бы эфир!
+Вадим Епт Сам просто начинал с 2004 с ПЛК, там все готово. Это как водитель на современной машине с общими знаниями, как она устроена. Решил наконец-то въехать, как МК устроены. Ваши уроки как раз для "въезда". Просто начитавшись форумов о STM, думаю цена/возможности как раз для современного использования даже в бытовых целях.
+Вадим Епт Да и кстати прошу прощения за возможный флуд. По платам "лут" или "фоторезист" для дома?
+Вадим Епт Я бы в начале с ПИКами закончил) По поводу ЛУТ и фоторезиста. Я бы рекоменодовал ЛУТ. С Лутом проще разобраться и вероятность большая того, что всё получится. С фоторезистом может ни чего не получится или будет получяться с переменным успехом. Для ЛУТа лучше использовать глянцевую фотобумагу, если нужны узкие дорожки. У нас есть магазин Ассорти, в котором раздаются бесплатные журналы с "Выгодной покупкой" (komiinform.ru/content/image-news/120719/assorti.JPG), бумага которая тонкая и глянцевая. На неё схему печатаем, перед этим приклеив лист журнала на лист бумаги А4, так как лист тонкий и принтер жуёт её. Почти у всех студентов получается перевести схему с первого раза. Когда возникнет потребность делать дорожки более узкими и ЛУТ не будет справляться, то можно переходить на фоторезист, но и там в начале нужно начать с широких дорожек и быть готовым к неудачам)
+Вадим Епт Не сбивай человека с пути)))
И да сорямба, скачал всего тебя при помощи стороннего ПО (плагины), потому чта ты молодец! Зато твой гнусный голос (покури ченить, может поправит), но по факту, несущий нужное, теперь всегда со мной (бедные твои студни)!
Я несколько лет в этот crc не лез т.к. не понимал. Обходил всякими хотростями. Спасибо
Добрый день! спасибо за интересный материал, будте любезны , поясните пожалуйста, почему вы берете пораждающий многочлен 10001100, а не 00110001?
Описание к видео:
В уроке написана программа на языке ассемблер для расчёта CRC 1-wire интерфейса. Программа написана для микроконтроллера PIC16F84A в программе MPLAB X. В начале урока показано, как вычислять CRC, используемый в 1-wire интерфейсе. Указано, где можно найти порождающий многочлен, необходимый для расчёта CRC. Показана идея или алгоритм расчёта CRC для микроконтроллера. Также показано, как определить правильность полученный данных по интерфейсу 1-wire. В качестве проверяемых данных использовался адрес ведомого 1-wire устройства. Правильность работы программы продемонcтрирована на схеме, собранной в программе Proteus.
Ссылка на таблицу, используемую в уроке:
drive.google.com/file/d/0B3lFUSB8ZK9Rb29MZ1JXWVRvelU/view?usp=sharing
Ссылка на программу (.txt):
drive.google.com/file/d/0B3lFUSB8ZK9Ra1hlREhzbVd5bWM/view?usp=sharing
Спасибо, довольно понятно. Может есть другие приемы подсчета CRC. Просмотрел листинги двух программ так там используется команда XORLW 0x18 и так-же сдвиг вправо. Хотелось бы разобраться почему 0x18 (00011000)
Чтобы добавить помехи можно в PROTEUSe к шине DQ добавить какое нибудь импульсное устройство,которое будет подсирать линию DQ.
;позволяет проверить и вычислить - реализация алгоритма микросхем
; (AVR)
.macro mCRC_1WIRE00 ;(38 байт)Макрос проверки CRC (tr16-21, Z), если правильно, то tr18=0, + получить CRC
;mCRC_1WIRE00 IN, KolIN
;mCRC_1WIRE00 @0, @1
start0:
ldi tr30, byte1(@0) ; Z адрес значения IN младший байт
ldi tr31, byte2(@0) ; Z адрес значения IN старший байт
ldi tr20, @1 ; Количество значений IN т.е. длина проверяемой строки включая значение CRC
clr tr18 ; байт B - сдвигающий регистр промежуточного значения который в конце должен быть равен нулю
; 0b00001100 ; x8+x5+x4+1 = 1*x8+0*x7+0*x6+1*x5+1*x4+0*x3+0*x2+0*x1+1*x0 = 100110001 (перевёрнуть) => 100011001 => 0001100 (удалить единицы слева и справа)
ldi tr19, 0b00001100 ; байт Данное значение используется для XOR если l0= IN0 xor b0 = 1
start1:
ld tr16, Z+ ; байт tr16=IN Загрузка следующего значения IN;
ldi tr21, 8 ; байт Счётчик - количество бит = 8
start2:
mov tr17, tr16 ; бит0 IN0
eor tr17, tr18 ; бит0 l0 = IN0 xor b0 =tr17.0
lsr tr18 ; смещение регистра B вправо
bst tr17, 0 ; бит b7 = l0 tr18.7 = tr17.0
bld tr18, 7 ; бит b7 = l0 tr18.7 = tr17.0
sbrc tr17, 0 ; пропустить следующую команду, если нулевой бит равен 0
eor tr18, tr19 ; байт xor_B----XX--
lsr tr16 ; смещение регистра IN вправо
dec tr21 ; уменьшение счётчика на единицу
brne start2 ; если счётчик не равен нулю то переход по ссылке на следующий заход
dec tr20 ; уменьшение счётчика на единицу
brne start1 ; если счётчик не равен нулю то переход по ссылке на следующий заход
;
; проверка
; tr18 должен быть равен нулю, то тогда правильно
; вычисление - после макроса добавить
; st Z+, tr18 ; в конце строки добавить tr18
.endm
Данный макрос написан в соответствии с алгоритмом в описании 1WIRE. Позволяет как получать CRC так и проверять правильность.
Полученные результаты соответствуют с подходом в Вашей лекции.
А вот макрос для MODBUS RTU по алгоритму как в описании MODBUS RTU(по ней можно, как получить так и проверить CRC) не совпадает по значениям CRC с подходом в Вашей лекции.
Получается, что для каждого случая должно быть своё описание? Стандартный подход не всегда подходит?
А почему фирмой выбран именно 8 байтный формат записи адреса устройства, не слишком ли это много, от кого такая шифровка, что ли это заказ военных?
Михаил, спасибо, урок шикарный, даже противный голос стал почти родным.
Ibutton devices uses 16 bit CRC code
Ссылка на страницу и ссылка на программу - не пашут.
чет вычисленный CRC с таблицы не бьется с калькулятором...
Так и не понял откуда берется именно такой порождающий многочлен. Да, есть формула Х8+Х5+Х4+1 а дальше как в тумане))))
+Евгений KZTemir Такую формулу выбрали разработчики интерфейса 1-Wire, для того, чтоб вычислять CRC для своих устройств. Под этой формулой скрывается набора 0 и 1, который указан в уроке. Чтоб было понятно запишем формулу так: 1*Х8+0*X7+0*X6+1*Х5+1*Х4+0*X3+0*X2+0*X1+1 = Х8+Х5+Х4+1. Убрав все X со степенями, а также знак +, получим 100110001. Почему используется запись в виде многочлена, потому что она пришла из математической теории, на сколько мне известно. Почему разработчики выбрали именно такой многочлен. Существует теория математическая из которой можно выбрать такой многочлен, чтоб он позволял надёжней проверять правильность полученных данных. Видимо разработчики подсчитали, что именно такой многочлен им подходит лучше. Чтоб уйти в глубь CRC, нужно найти литературу про CRC или циклический избыточный код и почитать. Но она может оказаться не очен простой, но попробовать можно)
+MyChipPic Спасибо, теперь всё встало на свои места