Доброго всем времени суток... Собрал я device на PICe и повесил на одну шину (1-Write протокол от DALLAS) два DS18B20 После команы Serch ROM (F0h) Читаем данные и ... Для первого датчика :8400FE0001B8F928h После команы Serch ROM (F0h) Читаем данные и ... Для второго датчика :F000FE0001CFE728h С кодом семейства всё OK - 28h, что значит DS18B20 Судая по datasheets на DS18B20 последний байт CRC-8. Команда Match ROM (55h )не выполняется, что наводит на мысль о не правильных LASERED ROM CODE написал программу подсчета CRC-8 по алгоритму из книги - Ross N. Williams "Элементарное руководство по CRC алгоритмам обнаружения ошибок" Вол алгоритм: Для примера возьмем полином 4й степени (W=4), и пусть этим по линомом будет 10111. В таком случае для выполнения деления нам потребуется 4 битный регистр. (Напомню: выровненное сообщение это наша исходная последовательность, дополненная W нулевыми битами.) Деление выполняется следующим способом: Загрузим регистр нулевыми битами Дополним хвостовую часть сообщения W нулевыми битами While (пока еще есть необработанные биты) Begin Сдвинем регистр на 1 бит влево и поместим очередной еще не обработанный бит из сообщения в 0 позицию регистра. If (из регистра был выдвинут бит со значением "1") Регистр = Регистр XOR Полином End Теперь в регистре содержится остаток, вероятно CRC Вот моя реализация по данному алгоритму CRC-8: xor eax,eax xor edx,edx mov ebx,offset ID_T mov eax,InitReg ;здесь 0 или 0FFh по выбору and eax,0FFh @ExtLoop: mov dl,byte ptr [ebx] mov ecx,8 @InLoop: shl al,1 pushfd shl dl,1 jnc @DL_0 or al,01h @DL_0: popfd jnc @CF_0 xor al,Polynom8 @CF_0: dec ecx test ecx,ecx jnz @InLoop inc ebx cmp ebx,offset Polynom8 jnz @ExtLoop InitReg dd 0 ID_T db 028h,0F9h,0B8h,001h,000h,0FEh,000h,0 Polynom8 db 31h ;полином X^8+X^5+X^4+1 В результате при InitReg = 0 -> CRC-8 = BEh InitReg = FFh -> CRC-8 = 05h Вероятно я в чем-то ошибаюсь... У кого какие мысли?
Я не спец по ПИКам, но мне кажется, что код то не под ПИК. А реализация CRC8 видел в доках по 1W. Вот один вариант, правда под АВР. Код (Text): PROC Do_CRC push ACC push ACCH push ACC ldi ACCH, 8 CRC_1: eor ACC, CRC ror ACC mov ACC, CRC brcc Bit_Zero ldi tmpHL, $18 eor ACC, tmpHL Bit_Zero: ror ACC mov CRC, ACC pop ACC rr ACC push ACC dec ACCH brne CRC_1 pop ACC pop ACCH pop ACC ret ENDP Do_CRC Первый вызов CRC = 0, ACC = data[0] последующие ACC = data[1..2..3..4..5..6..итд]
Код под Win32 C AVR не знаком, хотелось бы под PIC... Может у кого есть описание алгоритма для DS18B20
Нашел ошибку в коде для PIC Вот какие LASERED ROM CODE получились после этого... 1 - 84000001CDB8F928h 2 - F0000001CDCFE728h Сделал вот так: Search ROM потом читаю датчик №1 Search ROM потом читаю датчик №2 И усё работает как надо! LASERED ROM CODES скорей всего корректны, но CRC-8 не совпадает. Вопрос о алгоритме расчета CRC-8 для DALLAS, пока до конца не ясен.
Фу-ффффффф... Ну и работенка. Вот алгоритм длявычисления CRC-8 для DALLAS 1. Нахождение логического исключающего ИЛИ между младшим битом CRC и младшим битом данных. 2. Если результат равен 0, то: a. Сдвиг вправо CRC. 3. Если результат равен 1: a. Поиск нового значения CRC путем вычисления логического исключающего ИЛИ между CRC и полиномом CRC. b. Сдвиг вправо CRC. c. Установка старшего бита CRC в 1. 4. Сдвиг вправо данных. 5. Повтор данной последовательности 8 раз на 1 байт данных. Вот код на Asmе, вполне работоспособный для вычисления CRC-8: xor eax,eax xor edx,edx mov ebx,offset ID_T mov eax,00h @ExtLoop: mov dl,byte ptr [ebx] mov ecx,8 @InLoop: push eax push edx xor al,dl shr al,1 jnc @CF_0 pop edx pop eax xor al,Polynom8 shr al,1 or al,10000000b jmp @ExitLoop @CF_0: pop edx pop eax shr al,1 @ExitLoop: shr dl,1 dec ecx test ecx,ecx jnz @InLoop inc ebx cmp ebx,offset Polynom8 jnz @ExtLoop and eax,0FFh ;Здесь EAX = 84 для данного примера ;Собственно это и есть CRC-8 ID_T db 028h,0F9h,0B8h,0CDh,001h,000h,000h Polynom8 db 18h ;полином X^8+X^5+X^4+1 - ну не уверен что 18h это именно этот полином Только мне не понятно почему не подходит алгоритм из книги - Ross N. Williams "Элементарное руководство по CRC алгоритмам обнаружения ошибок" который я выложил выше и почему берем полином 18h (X^8+X^4+X^3), в datasheet на DS18B20 указан X^8+X^5+X^4+1 т.е. 31h...
http://www.ibutton.com/ibuttons/standard.pdf ст. 127 (136) Черным по белому написана реализация алгоса. То, что я раньше писал (пост #2) копия, но под AVR, изначально было под 8051. 18h по тому, что 31h = 18h * 2 + 01h, где 01h - флаг переноса.