58. 1-wire CRC на ассемблере (Урок 49. Теория)

Поделиться
HTML-код
  • Опубликовано: 25 янв 2016
  • В уроке написана программа на языке ассемблер для расчёта CRC 1-wire интерфейса. Программа написана для микроконтроллера PIC16F84A в программе MPLAB X. В начале урока показано, как вычислять CRC, используемый в 1-wire интерфейсе. Указано, где можно найти порождающий многочлен, необходимый для расчёта CRC. Показана идея или алгоритм расчёта CRC для микроконтроллера. Также показано, как определить правильность полученный данных по интерфейсу 1-wire. В качестве проверяемых данных использовался адрес ведомого 1-wire устройства. Правильность работы программы продемонcтрирована на схеме, собранной в программе Proteus.
    Ссылка на таблицу, используемую в уроке:
    drive.google.com/file/d/0B3lF...
    Ссылка на программу (.txt):
    drive.google.com/file/d/0B3lF...
    Спасибо за Like и за Подписку на мой канал.
    Получить информацию о канале можно и со страницы в вконтакте! Страница в вконтакте: mychippic

Комментарии • 29

  • @SkoffildBY
    @SkoffildBY 4 года назад +2

    Благодарю! Самое понятное объяснение данной темы!)

  • @yriks75
    @yriks75 2 года назад

    Спасибо! Теперь понял. Самое доступное объяснение расчета CRC.

  • @user-im9fi5ee4i
    @user-im9fi5ee4i 8 лет назад +2

    последние уроки относительно сложноваты. но все же разобраться удалось. жду новые уроки)) особенно прерывания и ШИМ) спасибо)

  • @user-wy9jf2eb8o
    @user-wy9jf2eb8o 8 лет назад

    Тяжеловато воспринимается, но интересно!.. Здорово!!!

  • @vasilek1989
    @vasilek1989 6 лет назад

    Я несколько лет в этот crc не лез т.к. не понимал. Обходил всякими хотростями. Спасибо

  • @villiamjetwings
    @villiamjetwings 8 лет назад +1

    Урок просто бомба! Как вник в идею, старался писать код с небольшим опережением, ставя видео на паузу, потом проверял себя. Когда всё заработало, восторг был как у пятилетнего ребёнка, получившего каких-нибудь ништяков! Огромное вам спасибо!))) Есть к вам пожелание: анонсируйте пожалуйста заранее следующую "игрушку". Ладно PIC16F84A в количестве 2 штук мне когда-то кто-то подарил, ладно DS18B20 у меня на работе гроздями. Но если, скажем, вы соберётесь подключать жк дисплей, которого у зрителя не окажется, придётся ждать подарочек из Китая, а это минимум три недели, а порой и несколько месяцев! Хочется, чтобы урок проходил сразу с практикой, написал код, Протеусом проверил и на макетку)))

    • @MyChipPic
      @MyChipPic  8 лет назад +1

      +Villiam JetWings Ну хорошо, я посторяюсь продумывать уроки так, чтоб можно было что-то заказать и оно успевало прийти вовремя) Я думаю у вас будет ещё больше восторга, когда вы реализуете алгоритм поиска устройств на шине 1 wire) Сегодня сел за новый урок. После небольшого перерыва трудно заставить себя снова снимать)) Ну а после этого урока, который я сейчас снимаю, как раз будет рассмотрен алгоритм поиска устройств)

  • @mikhailrychkov2267
    @mikhailrychkov2267 8 лет назад +1

    Твоя способность внедрять в голову относительно непонятные вещи поражает, молодец, так держать! Не думал сделать уроки по более актуальным STM32 (цена/перефирия/возможности наголову выше), хотя цели данных уроков понятны? Мне кажется актуальностью и твоей способностью объяснять простыми словами ты порвал бы эфир!

    • @mikhailrychkov2267
      @mikhailrychkov2267 8 лет назад +1

      +Вадим Епт Сам просто начинал с 2004 с ПЛК, там все готово. Это как водитель на современной машине с общими знаниями, как она устроена. Решил наконец-то въехать, как МК устроены. Ваши уроки как раз для "въезда". Просто начитавшись форумов о STM, думаю цена/возможности как раз для современного использования даже в бытовых целях.

    • @mikhailrychkov2267
      @mikhailrychkov2267 8 лет назад

      +Вадим Епт Да и кстати прошу прощения за возможный флуд. По платам "лут" или "фоторезист" для дома?

    • @MyChipPic
      @MyChipPic  8 лет назад +1

      +Вадим Епт Я бы в начале с ПИКами закончил) По поводу ЛУТ и фоторезиста. Я бы рекоменодовал ЛУТ. С Лутом проще разобраться и вероятность большая того, что всё получится. С фоторезистом может ни чего не получится или будет получяться с переменным успехом. Для ЛУТа лучше использовать глянцевую фотобумагу, если нужны узкие дорожки. У нас есть магазин Ассорти, в котором раздаются бесплатные журналы с "Выгодной покупкой" (komiinform.ru/content/image-news/120719/assorti.JPG), бумага которая тонкая и глянцевая. На неё схему печатаем, перед этим приклеив лист журнала на лист бумаги А4, так как лист тонкий и принтер жуёт её. Почти у всех студентов получается перевести схему с первого раза. Когда возникнет потребность делать дорожки более узкими и ЛУТ не будет справляться, то можно переходить на фоторезист, но и там в начале нужно начать с широких дорожек и быть готовым к неудачам)

    • @timichpyatigorsk9093
      @timichpyatigorsk9093 8 лет назад

      +Вадим Епт Не сбивай человека с пути)))

    • @mikhailrychkov2267
      @mikhailrychkov2267 8 лет назад

      И да сорямба, скачал всего тебя при помощи стороннего ПО (плагины), потому чта ты молодец! Зато твой гнусный голос (покури ченить, может поправит), но по факту, несущий нужное, теперь всегда со мной (бедные твои студни)!

  • @MyChipPic
    @MyChipPic  8 лет назад

    Описание к видео:
    В уроке написана программа на языке ассемблер для расчёта 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

  • @Alexcymantrene
    @Alexcymantrene Год назад

    Добрый день! спасибо за интересный материал, будте любезны , поясните пожалуйста, почему вы берете пораждающий многочлен 10001100, а не 00110001?

  • @yuraholod8050
    @yuraholod8050 3 года назад

    Спасибо, довольно понятно. Может есть другие приемы подсчета CRC. Просмотрел листинги двух программ так там используется команда XORLW 0x18 и так-же сдвиг вправо. Хотелось бы разобраться почему 0x18 (00011000)

  • @alexmiska2115
    @alexmiska2115 8 лет назад

    Чтобы добавить помехи можно в PROTEUSe к шине DQ добавить какое нибудь импульсное устройство,которое будет подсирать линию DQ.

  • @stazher123
    @stazher123 3 года назад

    Ссылка на страницу и ссылка на программу - не пашут.

  • @romanpetrov280
    @romanpetrov280 6 лет назад

    чет вычисленный CRC с таблицы не бьется с калькулятором...

  • @qwegmgm4524
    @qwegmgm4524 3 года назад

    ;позволяет проверить и вычислить - реализация алгоритма микросхем
    ; (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 с подходом в Вашей лекции.
    Получается, что для каждого случая должно быть своё описание? Стандартный подход не всегда подходит?

  • @augustsevasix681
    @augustsevasix681 6 лет назад

    А почему фирмой выбран именно 8 байтный формат записи адреса устройства, не слишком ли это много, от кого такая шифровка, что ли это заказ военных?
    Михаил, спасибо, урок шикарный, даже противный голос стал почти родным.

    • @KamalSehairi
      @KamalSehairi 5 лет назад

      Ibutton devices uses 16 bit CRC code

  • @kztemir5570
    @kztemir5570 8 лет назад

    Так и не понял откуда берется именно такой порождающий многочлен. Да, есть формула Х8+Х5+Х4+1 а дальше как в тумане))))

    • @MyChipPic
      @MyChipPic  8 лет назад +4

      +Евгений 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 или циклический избыточный код и почитать. Но она может оказаться не очен простой, но попробовать можно)

    • @kztemir5570
      @kztemir5570 8 лет назад +1

      +MyChipPic Спасибо, теперь всё встало на свои места