Страница: 1 | 2 |
|
Вопрос: Помогите с CRC-8(16)!!! Совсем я замучался...
|
Добавлено: 26.01.05 14:36
|
|
Номер ответа: 17 Автор ответа: Stn
Вопросов: 1 Ответов: 14
|
Профиль | | #17
|
Добавлено: 31.01.05 21:40
|
Шарп, ну погоди, не нервничай :о))
Давай по порядку... В теме ветки я все обозначил... Алгоритмы crc 8 и (заметь!) 16тый... Прально? прально.
Теперь относительно самих процедур. Та, которую выложил ты, у меня есть и статья Вильямса тоже есть, давно уже. Моя процедура работает не правильно, потому я ее на всякий пожарный тоже выложил...
А что касается 8ого crc, то у меня пока он тоже не работает, точнее не тот crc на выходе.
Если есть какой нибудь софт, способный crc8 вычислить (у меня есть, могу поделиться), то скажи мне crc этой строки: "123456789" (есть вариант, что при crc16 ответ будет - е5сс), а при crc8 (теоретически. посчитал на калькуляторе :о) ) - dd01 (а если берем один байт, то просто - DD).На 256 можно даже не делить...
Вот такие дела...
Пойду отдохну, иконы попишу... :о))
Всего самого наилучшего!
и до новых встреч!
Ответить
|
Номер ответа: 18 Автор ответа: Stn
Вопросов: 1 Ответов: 14
|
Профиль | | #18
|
Добавлено: 02.02.05 00:23
|
Может кому пригодится...
;*****************************************************************************
;* ПРОЦЕДУРА ВЫЧИСЛЕНИЯ 8-БИТНОЙ CRC для MCS51 *
;*****************************************************************************
;Пример использования:
mov CRC,#0 ;Перед вычислением надо обнулять CRC.
mov A,BYTE1 ;Названия байтов к примеру.
call DO_CRC
;В CRC сейчас находится контрольная сумма байта BYTE1.
mov A,BYTE2
call DO_CRC
;В CRC сейчас находится контрольная сумма байтов BYTE1 и BYTE2.
mov A,BYTE3
call DO_CRC
;В CRC сейчас находится контрольная сумма байтов BYTE1, BYTE2, BYTE3.
;И так далее.
;-----------------------------------------------------------------------------
; Контрольная сумма.
CRC DATA 1Bh ;переменная CRC
;-----------------------------------------------------------------------------
; Процедура обновления CRC (циклическая контрольная сумма). Параметр в A.
DO_CRC:
PUSH ACC ;сохранить аккумулятор в стеке
PUSH B ;сохранить B в стеке
PUSH ACC ;сохранить аккумулятор в стеке
MOV B,#8 ;счетчик сдвигов = 8
CRC_LOOP:
XRL A,CRC ;"исключающее ИЛИ" над ACC и предыдущим операндом
RRC A ;крутить вправо на бит через флаг переноса
MOV A,CRC ;получить предыдущее значение CRC
JNC ZERO ;пропустить если был 0
XRL A,#18H ;"исключающее ИЛИ" над ACC и операндом 18H
ZERO:
RRC A ;крутить вправо на бит через флаг переноса
MOV CRC,A ;сохранить текущее значение CRC
POP ACC ;получить предыдущее значение
RR A ;крутить вправо
PUSH ACC ;сохранить результат на стеке
 JNZ B,CRC_LOOP ;повторять 8 раз
POP ACC ;чистка стека
POP B ;восстановить B
POP ACC ;восстановить аккумулятор
RET ;выход
;-----------------------------------------------------------------------------
Ответить
|
Номер ответа: 20 Автор ответа: Stn
Вопросов: 1 Ответов: 14
|
Профиль | | #20
|
Добавлено: 02.02.05 12:37
|
Креста, так получается, что все процедуры, которые я попробовал, работают не верно.
Пришлось писать самому. А из аппарата дергать crc не зачем, он и так ее в порт кидает... Вопрос в другом - то, что посылает моя прога телефону должна правильно им обрабатываться, т.е. crc сходиться должен. Пока только часть алгоритма готова... Допишу, выложу.
Если скучно, вот интересный вопрос - как реализовать тень иконки программно? (мучал меня этот вопр. в свое время... :о))) )
Причем в теории то я все разложил по полочкам, даже какой то код появился, но потом все бросил и забыл... Можно реанимировать и забацать на vb & asm :о))
И народу приятно будет.
Ответить
|
Номер ответа: 22 Автор ответа: Stn
Вопросов: 1 Ответов: 14
|
Профиль | | #22
|
Добавлено: 03.02.05 13:07
|
Креста, не все так просто :о))
с "тенями" можно так заморочиться... череп треснет :о)
Ответить
|
Номер ответа: 25 Автор ответа: Stn
Вопросов: 1 Ответов: 14
|
Профиль | | #25
|
Добавлено: 04.02.05 14:44
|
ЛамерОнЛайн, а поподробнее????
ил ты имеешь ввиду стримCRC? или.... ???
Вобщем, расскажи поподробнее или примерчик какой нить выложи.
Спасибо!
Ответить
|
Номер ответа: 26 Автор ответа: Stn
Вопросов: 1 Ответов: 14
|
Профиль | | #26
|
Добавлено: 04.02.05 18:27
|
Вот, еще процедурка на бас.:
' BASIC ROUTINE TO CALCULATE CRC16-CCITT
' WAGNER LIPNHARSKI - NOV/1999 - HTTP://WWW.USTR.NET
'
' A = 16 bits counter - CRC16 CCITT - Accumulator result.
' A should be preset to ZERO at the start.
' C = 8 Bits processing byte, value from zero to 255.
' After processing all "C" bytes, A value should be
' converted to Hex and have bytes inverted,
'
' A$ = "0000" + HEX$
' A$ = RIGHT$(A$,4)
' A$ = RIGHT$(A$,2)+LEFT$(A$,2)
' A1 = VAL(LEFT$(A$,2))
' A2 = VAL(RIGHT$(A$,2))
' A1$ = CHR$(A1)
' A2$ = CHR$(A2)
'
' Transmit A1$, then A2$, as the CRC bytes.
'
' For testing purposes, processing 10 bytes values
' from 00h to 09h, crc to be transmitted is 04h 42h
' The following is the demo example with 10 bytes
A = 0
DATA 0,1,2,3,4,5,6,7,8,9
FOR N = 1 TO 10
READ C
GOSUB CALCCRC
NEXT N
' Here reordening LSB byte is transmitted first.
A$ = HEX$
A$ = RIGHT$("0000" + A$, 4)
A$ = RIGHT$(A$, 2) + LEFT$(A$, 2)
PRINT "FINAL CRC: "; LEFT$(A$, 2); " "; RIGHT$(A$, 2)
END
' The following is the CRC16-CCITT calculation
CALCCRC:
FOR V = 1 TO 8: ' 8 bits in C to process
CY = (A MOD 2) + (C MOD 2): ' If = 1 carry bits different
A = INT(A / 2): ' Shift Right 16 bits A
C = INT(C / 2): ' Shift Right 8 bits C
IF CY = 1 THEN A = A XOR 40961: ' Apply Algoritm
NEXT V
RETURN
Ответить
|
Страница: 1 | 2 |
Поиск по форуму