logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[asm] CRC8 x^8 + x^5 + x^4 + 1 czy dobrze kombinuję

Szycha082 09 Sty 2011 21:11 1764 3
  • #1 8983753
    Szycha082
    Poziom 11  
    Witam, napisałem instrukcję liczącą CRC8 z 5 bajtów umieszczonych w pamięci RAM,
    zależy mi na tym aby CRC mieściło się w jednym bajcie dlatego wybrałem CRC8.
    Proszę aby ktoś sprawdził jego poprawność.
    
    ; *********************** GENERATOR CRC **********************
    ; ******************** x^8 + x^5 + x^4 + 1 *******************
    ldi crc,0x00 ;wpisanie wartości początkowej CRC
    ldi XL,0x60 ;poczatek adresowania pamieci dane wejsciowe
    ldi XH,0x00
    ldi tmp2,0x31 ;wartość wielomianu CRC
    loop:
    ldi tmp3,1 ;wartość początkowa licznika liczącego 8 bitów
    ld tmp,x
    eor crc,tmp 
    loop2:
    sbrs crc,0 rjmp nul
    eor crc,tmp2 
    ror crc 
    sbr crc,0b10000000
    rjmp ok
    nul:
    ror crc 
    ok:
    clc ;wyczyszczenie flagi CARRY
    rol tmp3 brne loop2 ;zliczanie 8 bitów 
    inc XL ;gdzy przeliczono 8bitow (bajt) pobierz kolejny do obliczen
    cpi XL,0x65 ;adres ostatniej komórki z danymi -1
    brne loop 
    nop


    Szukałem na forum ale nic nie znalazłem w tej tematyce w ASM
  • #2 8984828
    Konto nie istnieje
    Poziom 1  
  • #3 8985709
    LordBlick
    VIP Zasłużony dla elektroda
    No to ja się też pochwalę dla 1-wire (AVRasm2):
    #ifndef __CRC8_
    #define __CRC8_
    .cseg
    #define CRC8_Sum	TempC
    #define CRC8_Const	TempB
    #define CRC8_BitCnt	cL
    ;	clr CRC8_Sum ; Clear CRC8_Sum (CRC8_Sum) at first byte
    GetByteCRC8_: ; (DataAcc ->CRC8_Sum)
    	push CRC8_BitCnt	; save
    	ldi CRC8_BitCnt, 0x08	; bits counter
    	ldi CRC8_Const, 0x18	; bits CRC-8 change XOR value (from AN27 Maxim-Dallas)
    	mov TempA, DataAcc
    GetByteCRC8_Loop:
    	mov TempD, TempA ; Only 7s bits means
    	eor TempD, CRC8_Sum ; about condition
    	sbrc TempD, 7	 ; of xor 0x18
    	eor CRC8_Sum, CRC8_Const ; 0x18
    	lsl TempD		 ; return bit to 2^0 in CRCSum
    	rol CRC8_Sum
    	lsl TempA
    	dec CRC8_BitCnt
    	brne GetByteCRC8_Loop
    	pop CRC8_BitCnt	; restore
    	ret
    ; Note :
    ;	- eor does not change carry flag.
    ;	- sbrc does not change any flag.
    #endif	// #ifdef __CRC8_
    Mi "łyse eRy" nie podchodzą - kompilator pozwala na przypisywanie nazw, to używam... ;)
  • #4 8990066
    Szycha082
    Poziom 11  
    atom1477 nie wiem czy dobrze rozumuję ale twój algorytm, wygląda całkowicie inaczej, przetestuje go i zobacze czy bedzie dzialal. Mam zamiar go użyć w komunikacji radiowej (zdalne sterowanie).
    Mam jeszcze pytanie trochę z innej beczki, jaki system komunikacji wybrac.
    W tej chwili po odebraniu bajtu umieszczam go w R2 i przesuwam: R7>R8 R6>R7 R5>R6 R4>R5 R3>R4 R3=R2
    generuje CRC z R8...R4 i porownuje z R3 w ktorym po odebraniu 6 bajtow znajduje sie CRC wygenerowane z nadajnika. Czy taka komunikacja jest dobra ?
REKLAMA