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


CRC25 - kuidas ? - felch - 26-01-2015

Sellist CRC-d kasutab MAVlink (kopterite jms mudelite vaheline side). Sain protokollist lõpuks aru aga ma pean sõnumite saatmiseks oskama ise CRC-d arvutada. Ta on 2-baidine ja algväärtus on 0xFFFF. Edasi...ma ei mõista. Kes "tõlgiks" ?
Kood:
Kood:
#ifdef __cplusplus
extern "C" {
#endif

#ifndef _CHECKSUM_H_
#define _CHECKSUM_H_

#include "inttypes.h"


/**
*
*  CALCULATE THE CHECKSUM
*
*/

#define X25_INIT_CRC 0xffff
#define X25_VALIDATE_CRC 0xf0b8

/**
* @brief Accumulate the X.25 CRC by adding one char at a time.
*
* The checksum function adds the hash of one char at a time to the
* 16 bit checksum (uint16_t).
*
* @param data new char to hash
* @param crcAccum the already accumulated checksum
**/
static inline void crc_accumulate(uint8_t data, uint16_t *crcAccum)
{
        /*Accumulate one byte of data into the CRC*/
        uint8_t tmp;

        tmp=data ^ (uint8_t)(*crcAccum &0xff);
        tmp^= (tmp<<4);
        *crcAccum = (*crcAccum>>8) ^ (tmp<<8) ^ (tmp <<3) ^ (tmp>>4);
}

/**
* @brief Initiliaze the buffer for the X.25 CRC
*
* @param crcAccum the 16 bit X.25 CRC
*/
static inline void crc_init(uint16_t* crcAccum)
{
        *crcAccum = X25_INIT_CRC;
}


/**
* @brief Calculates the X.25 checksum on a byte buffer
*
* @param  pBuffer buffer containing the byte array to hash
* @param  length  length of the byte array
* @return the checksum over the buffer bytes
**/
static inline uint16_t crc_calculate(uint8_t* pBuffer, int length)
{

        // For a "message" of length bytes contained in the unsigned char array
        // pointed to by pBuffer, calculate the CRC
        // crcCalculate(unsigned char* pBuffer, int length, unsigned short* checkConst) < not needed

        uint16_t crcTmp;
        //uint16_t tmp;
        uint8_t* pTmp;
        int i;

        pTmp=pBuffer;
        

        /* init crcTmp */
        crc_init(&crcTmp);

        for (i = 0; i < length; i++){
                crc_accumulate(*pTmp++, &crcTmp);
        }

        /* This is currently not needed, as only the checksum over payload should be computed
        tmp = crcTmp;
        crcAccumulate((unsigned char)(~crcTmp & 0xff),&tmp);
        crcAccumulate((unsigned char)((~crcTmp>>8)&0xff),&tmp);
        *checkConst = tmp;
        */
        return(crcTmp);
}




#endif /* _CHECKSUM_H_ */

#ifdef __cplusplus
}
#endif



RE: CRC25 - kuidas ? - A.R. - 27-01-2015

Kunagi (68.a) oli meil kasutusel CRC kus
Järgmine 8 bitti (perfolindi rida) liideti sellele CRC-le otsa ja 8st ületäitumine
läks +1.

Aga siin on kasutusel sellised operaatorid
http://www.thegeekstuff.com/2012/10/bitwise-operators/

| – Bitwise OR
& – Bitwise AND
~ – One’s complement
^ – Bitwise XOR
<< – left shift
>> – right shift

see XOR on olemas ka TTL kivina ja loogika on

0^0=0
0^1=1
1^0=1
1^1=0

See ^ tuleb eesti klaviatuurilt AltGr ä alt aga
näha on peale järgmise klahvi vajutust.

<< ja >> nihutavad muutujat kas vasakule või paremale N kohta.
Sellised käsud on ka ASMis olemas.

Vast oli abiks ja tõlkija leiad peeglist Smile

(Käisin öösel 2.30 arvutist vaatamas kas ^ oli ikka XOR ---> OLI!!!!)
Kõik ei taha meeles püsida.
Kirjutasin ka katseks selle proge aga vast ei hakka katsetama.


RE: CRC25 - kuidas ? - felch - 27-01-2015

operandide tähendused leidsin ise ka aga ei funksi.
Minu kood:
Kood:
;===============================================================================
;#define X25_INIT_CRC 0xffff
;static inline void crc_init(uint16_t* crcAccum)
;{
;       *crcAccum = X25_INIT_CRC;
;}
;--------------------
;{
;       /*Accumulate one byte of data into the CRC*/
;       uint8_t tmp;
;
;       tmp=data ^ (uint8_t)(*crcAccum &0xff);
;       tmp^= (tmp<<4);
;       *crcAccum = (*crcAccum>>8) ^ (tmp<<8) ^ (tmp <<3) ^ (tmp>>4);
;}
; ---- Arvuta CRC -------
;       crc_init(&crcTmp);

;       for (i = 0; i < length; i++){
;               crc_accumulate(*pTmp++, &crcTmp);
;       }
;

;FE  09  4E  01  01  00  00  00  00  00  02  03  51  04  03  1C  7F
test:            movlw    0xFF        ; crc_init(&crcTmp)
                movwf    TBLPTRLt
                movwf    TBLPTRHt
                movlw    .10
                movwf    t_count
                LFSR    .0,0x25    ; puhver
;       tmp=data ^ (uint8_t)(*crcAccum &0xff);
;       tmp^= (tmp<<4);
;       *crcAccum = (*crcAccum>>8) ^ (tmp<<8) ^ (tmp <<3) ^ (tmp>>4);
tst1:            movf    POSTINC0,W        ; loe databait puhvrist -> W
                xorwf    TBLPTRLt,W         ; databait XOR CRC LOW -> t1_count (tmp=data ^ (uint8_t)(*crcAccum &0xff);)
                movwf    t1_count
                movwf    t2_count    
                bcf        CARRY            ; tmp^= (tmp<<4)
                rlcf    t1_count,F
                rlcf    t1_count,F
                rlcf    t1_count,F
                rlcf    t1_count,W        ; = tmp
                xorwf    t2_count,W
                movwf    t1_count
;*crcAccum = (*crcAccum>>8) ^ (tmp<<8) ^ (tmp <<3) ^ (tmp>>4);
                bcf        CARRY
                rrcf    TBLPTRHt,F
                rrcf    TBLPTRLt,F
                rrcf    TBLPTRHt,F
                rrcf    TBLPTRLt,F
                rrcf    TBLPTRHt,F
                rrcf    TBLPTRLt,F
                rrcf    TBLPTRHt,F
                rrcf    TBLPTRLt,F
                rrcf    TBLPTRHt,F
                rrcf    TBLPTRLt,F
                rrcf    TBLPTRHt,F
                rrcf    TBLPTRLt,F
                rrcf    TBLPTRHt,F
                rrcf    TBLPTRLt,F
                rrcf    TBLPTRHt,F
                rrcf    TBLPTRLt,F
                movff    t1_count,t2_count
                bcf        CARRY
                rlcf    t2_count,F
                rlcf    t2_count,F
                rlcf    t2_count,F
                rlcf    t2_count,F
                rlcf    t2_count,F
                rlcf    t2_count,F
                rlcf    t2_count,F
                rlcf    t2_count,W
                xorwf    TBLPTRLt,F                

                movff    t1_count,t2_count
                bcf        CARRY
                rlcf    t2_count,F
                rlcf    t2_count,F
                rlcf    t2_count,W
                xorwf    TBLPTRLt,F                

                movff    t1_count,t2_count
                bcf        CARRY
                rrcf    t2_count,F
                rrcf    t2_count,F
                rrcf    t2_count,F
                rrcf    t2_count,W
                xorwf    TBLPTRLt,F                

                decfsz    t_count
                goto    tst1
Mis on siin valesti ?


RE: CRC25 - kuidas ? - A.R. - 27-01-2015

http://srecord.sourceforge.net/crc16-ccitt.html
Tegin sellest tekstist programmi, natuke kohendasin
Aga pärast taipasin et see arvutab crc16
Pilt ekraanist
[attachment=77]

Aga kuidas saata seda exe faili ma ei tea.
exe ei sobi, rar ei sobi.
Vähemalt siin.

Kui pakub huvi, siis võib veel otsida.
Kui kuskil on KORRALIK CRC25.C võib uuesti proovida.
Mis seal vahet on?
___________________________
Otsisin on veel üks, suurem,mitmekülgsem.
http://www.zorc.breitbandkatze.de/crc.html
See eelmine tuleb välja kui on valitud CRC-CCITT ja nondirect
Direct on siis paha tulp.
Siin on kaasas ka C tekst ja see transleerus kenasti.

Aga
Valida on ka CRC-16 ja CRC-32.
Tundub et koodid on kas 4x4=16 bitt või 8x4=32 bitt.
Aga mis on siis CRC-25. 6x4+1=25 ????


RE: CRC25 - kuidas ? - A.R. - 28-01-2015

Aga mis on siis CRC-25.

Katsetasin transleerida seda algselt pakutut C-d.
Tuli välja,
on olemas hex PIC18F4550-le (ja Picutajatele)
ning ka disasm fail.
Saab vaadata mis juhtub Debugi all.

Kas on teada mõned sisendkoodid ja neile vastav CNC?
See ÕIGE !!!!!

Probleem on igatahes huvitav Smile


RE: CRC25 - kuidas ? - felch - 28-01-2015

(28-01-2015, 05:09 PM)A.R. Kirjutas: Aga mis on siis CRC-25.

Katsetasin transleerida seda algselt pakutut C-d.
Tuli välja,
on olemas hex PIC18F4550-le (ja Picutajatele)
ning ka disasm fail.
Saab vaadata mis juhtub Debugi all.

Kas on teada mõned sisendkoodid ja neile vastav CNC?
See ÕIGE !!!!!

Probleem on igatahes huvitav Smile

Ohoo ! Saada disasm mulle ka uurimiseks!
Sisendinfo:
09 4E 01 01 00 00 00 00 00 02 03 51 04 03 32 -> CRC= 7F1C
Samas on võimalik, et summa arvutust alustatakse hoopis siit:
00 00 00 00 02 03 51 04 03 32 -> CRC= 7F1C
Kas arvutus käib otse või vastupidise baidijadaga,ma ei tea. Vist otsepidise.
Tegu on MAVLink protokolli CRC-ga. Nende dokumentatsioon on vääga vilets. Ühes kohas õeldakse, et kogu payload'i ulatuses (alumine rida), teisal aga et kogu paketi ulatuses (ülemine rida) v.a. startbait (seda siia ei kirjutanudki). Lisaks tuleb enne viimast akumuleerimist lasta askut läbi veel "seed" mis antud paketi puhul on 0x32. Kas teda käsitletakse kuidagi teisiti? Vist jällegi mitte. Panin ta mõlemasse jadasse kirja aga võib proovida ka ilma.
Minu asmi kood ei tooda mitte mingi nipiga etteantud CRC-d aga kopter näiteks saab just sellisest messist aru, muud saadab pikalt. Ka need CRC-d mis sinu viidatud ja ka muude online kalkulaatoritega rehkendatud.
Kui see tähtis on, siis CRC polünoom 'peaks' olema 0xf0b8.

Link näidisele ja jutule: http://eastbay-rc.blogspot.com/2013/04/mavlink-protocol-notes-packet-decoding.html


RE: CRC25 - kuidas ? - felch - 28-01-2015

Igaks juhuks ka link java koodile https://github.com/arthurbenemann/droidplanner/blob/master/Mavlink/src/com/MAVLink/Messages/CRC.java


RE: CRC25 - kuidas ? - A.R. - 29-01-2015

Kunagi tegin javas haiglatele veremajandust aga
tunnen end C-s kodusemalt.
Kell 6.00 tuli üks mõte

Tark inime vaatab HELPi
uint16_t on 16 bitti
seega
typedef unsigned short uint16_t;
ja mitte
typedef unsigned char uint16_t;

Ei julge vannituppa minna - seal on peegel.
Ei meeldi lolle vaadata.

Nüüd on PC peal ok transleerimine
Aga selle jada CNC tuleb mitte 0x7F1C
vaid 0x5574

Tolle suure kalkulaatori peal sain õige kätte aga tuli togida parameetreid.
Kas on ka mõni teine jada et veel testida?
Ikkagi parem, otsime veel.


RE: CRC25 - kuidas ? - felch - 29-01-2015

(29-01-2015, 08:03 AM)A.R. Kirjutas: Kunagi tegin javas haiglatele veremajandust aga
tunnen end C-s kodusemalt.
Kell 6.00 tuli üks mõte

Tark inime vaatab HELPi
uint16_t on 16 bitti
seega
typedef unsigned short uint16_t;
ja mitte
typedef unsigned char uint16_t;

Ei julge vannituppa minna - seal on peegel.
Ei meeldi lolle vaadata.

Nüüd on PC peal ok transleerimine
Aga selle jada CNC tuleb mitte 0x7F1C
vaid 0x5574

Tolle suure kalkulaatori peal sain õige kätte aga tuli togida parameetreid.
Kas on ka mõni teine jada et veel testida?
Ikkagi parem, otsime veel.
Tänud aja raiskamise ja vaeva nägemise eest !
Kas õige vastus tuli tolle "laia-riba-kassi" kalkulaatoriga? Andsid ette polünoomi F0B8 ja siis jada - mis kujul ikkagi? Mul ei õnnestunud ei selle ega ka mingi muu online kalkulaatoriga õiget tulemust saavutada.

Tööl on vetsus ka peegel, peab vist nurga taha pissile minema... Smile


RE: CRC25 - kuidas ? - A.R. - 29-01-2015

Olen nüüd sealmaal et võtsin ette selle Kassi C teksti.
(ELFAs võeti peale kassidest rääkimist ära sõnaõigus.
Seal on nüüd üks mees steperiga hädas.
Meenutaks noorust ja malemängu aga...)


Kena, Sinu jadas on sees nullid
const unsigned char string[] = {
0x09, 0x4E, 0x01, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00, 0x02,
0x03, 0x51, 0x04, 0x00, 0x32};
Kas on selline massiiv? HEX arvud?

strlen() annab vale pikkuse - esimese NULLINI
Ütlesin et on 15 baiti.
Saan nüüd mitmesuguseid CRCsid.
See algoritm on vägev lubab CRC 1ja 32 vahel suvalist numbrit bitte.
Üritan ikka veel 16 ga aga tekst on ju aastast 2003!!!
kas siis CRC25 oli olemas?
Keetsin kannu kohvi, vast läheb paremaks.
____________________________________________
Vaatasin seda JAVAt, saab nii ja peaaegu sama mis C.
Aga seal pole seda kokkuvõtmise programmi.
Tee kõigi elementidega ja liida kokku -umbes nii.
Aga proovime.