Elektroonikafoorum.com
CRC25 - kuidas ? - Printerisõbralik versioon

+- Elektroonikafoorum.com (https://elektroonikafoorum.com)
+-- Foorum: Arutelud (https://elektroonikafoorum.com/forum-3.html)
+--- Foorum: Programmeerimine (https://elektroonikafoorum.com/forum-5.html)
+--- Teema: CRC25 - kuidas ? (/thread-592.html)

Lehed: 1 2 3


RE: CRC25 - kuidas ? - felch - 04-02-2015

(04-02-2015, 09:08 PM)admin Kirjutas:
(04-02-2015, 08:50 PM)A.R. Kirjutas: Aga kust tuli see 0x32 see on veel (eel)viimane probleem.

sõnumi ID järgi valid MAVLINK_MESSAGE_CRCS massiivist.
Käesoleva sõnumi ID on 0, seega massiivist võtad index 0 pealt väärtuse 50 (0x32 hexis). MAVLINK_MESSAGE_CRCS väärtust kasutad ainult crc kalkuleerimisel ja saadetavas (vastuvõetavas) sõnumisse seda ei panda.
Kood:
MAVLINK_MESSAGE_CRCS=[
50,124,137,0,237,217,104,119,0,0,0,89,0,0,0,0,0,0,0,0,214,159,220,168,
24,23,170,144,67,115,39,246,185,104,237,244,222,212,9,254,230,28,28,
132,221,232,11,153,41,39,214,223,141,33,15,3,100,24,239,238,30,240,183,
130,130,0,148,21,0,243,124,0,0,0,20,0,152,143,0,0,127,106,0,0,0,0,0,0,
0,231,183,63,54,0,0,0,0,0,0,0,175,102,158,208,56,93,0,0,0,0,235,93,124,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42,
241,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,49,
170,44,83,46,0]
https://github.com/marhar/eastbay-mavlink/blob/master/demos/parse-stream.py#L46
Tänud, seda ma tean. Kirjutasin ka aga vast jäi abistajatel 2 silma vahele (tervelt 65mm ju! Smile )
Sain tuttava profielektrooniku abiga töötava C-keelse kalkulaatori. Tõesti töötab ! Selgub, et C teeb mingit automaagilist ja talle sobivat muutujate lõdva randmega muundamist 16-bitisest formaadist 8-bitisesse ja vastupidi. Selguse mõttes kirjutas Eiko koodi nati ringi, et kõik oleks 16-bitine. Tõlgin selle kohe, kui aega saan asmi ja riputan siia üles. Ehk on siis ka itestele "dinosaurustele" abiks Smile Muide, asmi tundmine võib vaid jama kaela tuua, kuskilt lugesin,et sääraseid friike peetakse potensiaalselt kahjulikeks (teavad liiga palju). Ehk siiski KaPo nii ei arva...
Vist mainisn, et koodi mõte on lugeda taeva heleduse analüsaatori näitu (Unihedron, tulemus= magnituudi kaaresekundi kohta), GPSi koordinaate ja võimalusel ka lennukõrgust ning kiirust kopterile pandud meerikult et registreerida valgusreostuse taset Tallinna kesklinna tänavatel öisel ajal.
Vslmid koodi riputan ka siia üles. Hetkel oskan juba Unihedroniga ja tavalise GPS-vastuvõtjaga sotid sirgeks rääkida ja SD-kaardile kirja panna.
Ärge siis UFOsid kahtlustage, kui kesklinna taevas mingil ööl imelikke tulesid näha - see võin olla mina (kui lennuamet loa annab)...


RE: CRC25 - kuidas ? - madis - 05-02-2015

Ääremärkusena:

C - l on kõik viiruse tunnused, võiks öelda et parim viirus üldse kuna levib nii mööda arvuteid kui inimesi !

Sest miks kasutada iganenud definitsioone nagu
byte, word, dword...

selle asemel ikka
int (16 või 32 bitti)
unsigned int (seesama aga..mis aga ?)
short int (8 bitti või 16 bitti)
char (hetkel vist 8 bitti aga noh nt unicode põhjal võiks olla ju 16 bitti ? mida char tähendaski.. ? )

jne, sest siis saab ju teha asja PLATVORMIST SÕLTUVAKS mis küll minu teada läheb C mõttega vastuollu aga noh kokkuvõttes äkki mõte ei olnud see mida me eeldame vaid hoopis midagi õelamat Smile


RE: CRC25 - kuidas ? - A.R. - 05-02-2015

(05-02-2015, 12:56 AM)madis Kirjutas: Sest miks kasutada iganenud definitsioone nagu
byte, word, dword...

teha asja PLATVORMIST SÕLTUVAKS

Eks ta nii ole. Ostad PICi programmaatori koos translaatoriga ja
see ei tunnista byte, word, dword
tahab hoopis short ja long

On nõus ka tekstiga
unsigned long long tmp
Seda tingimusel et
// tmp^= (tmp<<4);
tmp = (tmp ^ (tmp << 4)) &0xFF; //1. ok Annab 7F1C
unsigned char, mis võiks sobida, annab vale koodi.
Seda MPLAB IDE translaatoriga.

Kui sama asja teha lcc-32 all siis unsigned char on sobiv.
ja seal sobib ka tmp^= (tmp<<4);

Jälle on siis tulnud aeg vaadata DisASMiga mis seal TEGELIKULT toimub.

Niipalju siis PLATVORMIST ja SÕLTUVUSEST

Aga see-eest annab MPLAB võimaluse saada see programm ka ASMina.
Olen kuulnud et mõned mehed kirjutavad selles keeles.
Õnneks vist mitte masinkäskudes perfolinti nagu 1968. a. tuli teha.


RE: CRC25 - kuidas ? - madis - 05-02-2015

Lõppsõnaks ütleks:

main(a,b)char**b;{int c=1,d=c,e=a-d;for(;e;e--)_(e)<_( c)?c=e:_(e)>_(d)?d=e:7;
while(++e<a)printf("\xe2\x96%c",129+(**b=8*(_(e)-_( c))/(_(d)-_( c))));}


HELL YEAH !


RE: CRC25 - kuidas ? - felch - 05-02-2015

(05-02-2015, 02:32 PM)madis Kirjutas: Lõppsõnaks ütleks:

main(a,b)char**b;{int c=1,d=c,e=a-d;for(;e;e--)_(e)<_( c)?c=e:_(e)>_(d)?d=e:7;
while(++e<a)printf("\xe2\x96%c",129+(**b=8*(_(e)-_( c))/(_(d)-_( c))));}


HELL YEAH !

Maybe...
Ma sain vahepeal asmi rutiini tööle. Tänud ideede eest !

Kood:
;===============================================================================
; CRC 1 baidi arvutamise algo
;#define X25_INIT_CRC 0xffff
;        tmp=data  ^ (*crcAccum &0xff);
;        tmp^= (tmp<<4);
;         tmp &= (0x00ff);
;        *crcAccum = (*crcAccum>>8) ^ (tmp<<8) ^ (tmp <<3) ^ (tmp>>4);
;          result=  (*crcAccum);      
; näidis testjada:
; http://www.privatprojekte.de/multicopter/telemetriedecoder.html
;FE  09  4E  01  01  00  00  00  00  00  02  03  51  04  03  1C  7F + 32
; ülalolev testjada laadida aadressile 0x20 ja edaspidi
; 0xFE jätta välja
; CRC=0x7F1C
; enne viimast tehet lasta CRC-st läbi bait 0x32 (magic byte ehk seed)
; funkab küll !!!
#define crcH TBLPTRHt
#define crcL TBLPTRLt
#define tmpH tempor0_h
#define tmpL tempor0_l
#define tmpHa t1_count
#define tmpLa t2_count

test:            movlw    0xFF        ; crc_init(&crcTmp)
                movwf    TBLPTRLt
                movwf    TBLPTRHt
                clrf    tmpH
                clrf    tmpL
                movlw    .15
                movwf    t_count
                LFSR    .0,0x20
tst1:            movf    POSTINC0,W        ; loe databait puhvrist -> W
                xorwf    crcL,W             ; databait XOR CRC LOW -> tmp=data  ^ (*crcAccum &0xff);
                movwf    tmpL
                movff    tmpH,tmpHa        ; säilita algne tmp
                movff    tmpL,tmpLa

                bcf        CARRY            ; (tmp<<4)
                rlcf    tmpL,F
                rlcf    tmpH,F
                bcf        CARRY
                rlcf    tmpL,F
                rlcf    tmpH,F
                bcf        CARRY
                rlcf    tmpL,F
                rlcf    tmpH,F
                bcf        CARRY
                rlcf    tmpL,F
                rlcf    tmpH,F
                movf    tmpHa,W            ; XOR
                xorwf    tmpH,F
                movf    tmpLa,W            
                xorwf    tmpL,F
                clrf    tmpH            ; tmp &= (0x00ff)

;        *crcAccum = (*crcAccum>>8) ^ (tmp<<8) ^ (tmp <<3) ^ (tmp>>4);
                movff    tmpH,tmpHa        ; tee tmp-st koopia
                movff    tmpL,tmpLa
                bcf        CARRY            ; crcAccum>>8
                rrcf    crcH,F
                rrcf    crcL,F
                bcf        CARRY
                rrcf    crcH,F
                rrcf    crcL,F
                bcf        CARRY
                rrcf    crcH,F
                rrcf    crcL,F
                bcf        CARRY
                rrcf    crcH,F
                rrcf    crcL,F
                bcf        CARRY
                rrcf    crcH,F
                rrcf    crcL,F
                bcf        CARRY
                rrcf    crcH,F
                rrcf    crcL,F
                bcf        CARRY
                rrcf    crcH,F
                rrcf    crcL,F
                bcf        CARRY
                rrcf    crcH,F
                rrcf    crcL,F            

                bcf        CARRY            ; tmp= (tmp<<8)
                rlcf    tmpLa,F
                rlcf    tmpHa,F
                bcf        CARRY
                rlcf    tmpLa,F
                rlcf    tmpHa,F
                bcf        CARRY
                rlcf    tmpLa,F
                rlcf    tmpHa,F
                bcf        CARRY
                rlcf    tmpLa,F
                rlcf    tmpHa,F
                bcf        CARRY
                rlcf    tmpLa,F
                rlcf    tmpHa,F
                bcf        CARRY
                rlcf    tmpLa,F
                rlcf    tmpHa,F
                bcf        CARRY
                rlcf    tmpLa,F
                rlcf    tmpHa,F
                bcf        CARRY
                rlcf    tmpLa,F
                rlcf    tmpHa,F

                movf    tmpHa,W            ; XOR
                xorwf    crcH
                movf    tmpLa,W        
                xorwf    crcL

                movff    tmpH,tmpHa        ; loe algne tmp
                movff    tmpL,tmpLa
                bcf        CARRY            ; tmp= (tmp<<3)
                rlcf    tmpLa,F
                rlcf    tmpHa,F
                bcf        CARRY
                rlcf    tmpLa,F
                rlcf    tmpHa,F
                bcf        CARRY
                rlcf    tmpLa,F
                rlcf    tmpHa,F

                movf    tmpHa,W            ; XOR
                xorwf    crcH
                movf    tmpLa,W        
                xorwf    crcL

                movff    tmpH,tmpHa        ; loe algne tmp
                movff    tmpL,tmpLa
                bcf        CARRY            ; tmp= (tmp>>4)
                rrcf    tmpHa,F
                rrcf    tmpLa,F
                bcf        CARRY        
                rrcf    tmpHa,F
                rrcf    tmpLa,F
                bcf        CARRY        
                rrcf    tmpHa,F
                rrcf    tmpLa,F
                bcf        CARRY        
                rrcf    tmpHa,F
                rrcf    tmpLa,F

                movf    tmpHa,W            ; XOR
                xorwf    crcH
                movf    tmpLa,W        
                xorwf    crcL

                decfsz    t_count
                goto    tst1            ; loop until "iso siiperi"
                return