Лень разбираться, лучше кину кусок работающего кода
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено =AK= 03 апреля 2004 г. 02:10
В ответ на: (PIC) CRC8 Dallas маленький вопросик тем, кто уже это делал отправлено Wud 02 апреля 2004 г. 19:25


; *****************************
; *** Read/write one ID bit ***
; *****************************
; from/to C
_IDBIT set_bank 1 ; access
bcf TRISB,DSDAT ; set low, form Tlow1=1-15us 1
nop ; delay 1
btfsc STATUS,C ; output bit =1 ? 1
bsf TRISB,DSDAT ; yes, finish Tlow1 1 = 4us
call _DLY7US ; Trdv=15us max 7
set_bank 0 ; access to port B 1
btfss PORTB,DSDAT ; does DS hold the line low? 1 = 13us
bcf STATUS,C ; yes, read 0
call _DLY60US ; delay 60us
set_bank 1 ; acces to tris
bsf TRISB,DSDAT ; finish Tlow0=60-120us
set_bank 0 ; default
call _DLY60US ; finish time slot
return ;

; **************************
; *** Read/write ID byte ***
; **************************
; from/to W, calculate CRC
; WRK and CNT are used
_IDREAD movlw 0FFh ; for ID read: write all 1
_IDBYTE movwf WRK ; temp store write byte
movlw 8 ; 8 bits
movwf CNT ; counter

; *** cycle
_IDBY1 rrf WRK,1 ; get write bit into C, store the read bit
call _IDBIT ; send/receive bit
movlw 18h ; CRC const
btfss STATUS,C ; received C=0 ?
goto _IDBC0 ; yes

; *** ID bit is 1
_IDBC1 bcf ERROR_FLAGS,IDALL0 ; clear flag "all ID bits are 0"
btfsc CRC,0 ; CRC,0=0 ?
goto _C1_CRC1 ; no
; *** C=1, CRC,0=0: xor 18, shift 1
_C1_CRC0 xorwf CRC,1 ; CRC:=CRC xor 18
rrf CRC,1 ; shift 1: C was 1; 0 xor 1 = 1
goto _R_C1 ; loop, keep C=1
; *** C=1, CRC,0=1: shift 0
_C1_CRC1 bcf STATUS,C ; set C=0
rrf CRC,1 ; shift 0
_R_C1 bsf STATUS,C ; restore 1 in C
goto _IDBL ; loop

; *** ID bit is 0
_IDBC0 btfsc CRC,0 ; CRC,0=0 ?
goto _C0_CRC1 ; no
; *** C=0, CRC,0=0: shift 0
_C0_CRC0 rrf CRC,1 ; still C=0
goto _R_C0 ; loop, keep C=0
; *** C=0, CRC,0=1: xor 18, shift 1
_C0_CRC1 xorwf CRC,1 ; CRC:=CRC xor 18
bsf STATUS,C ; shift 1
rrf CRC,1 ; shift CRC
_R_C0 bcf STATUS,C ; restore 0 in C

; *** Loop
_IDBL decfsz CNT,1 ; count bits
goto _IDBY1 ; loop
rrf WRK,W ; store the last bit (restore C), get result
return ;


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru