costi002 Postat Octombrie 22, 2018 Partajează Postat Octombrie 22, 2018 Salutare, Ieri am pierdut toata ziua incercand sa imi dau seama de ce nu obtin rezultatul corect la calculul unui CRC polinomial. Pana nu am compilat partea ce se ocupa de calculul CRC pe un alt mediu si blocand softul in anumite momente, nu am reusit sa gasesc cauza. Rezolvarea am gasit-o, dar nu inteleg unde gresesc. Mai jos e rutina ce se ocupa de calcul crc_rez=0x0; for(index = 0; index <length ; index++) { crc_rez ^= (rez_temp[index]);//rez_temp tine datele pentru care trebuie ca aflam CRC-ul de 16 biti for(i = 0; i < 8; i++) { ///* carry = crc_rez & 0x0001; crc_rez = crc_rez/2;//aici am incercat si cu crc_rez>>=1;rezultatul este eronat crc_rez=crc_rez&0x7fff;//stergem manual bitul 15 pentru a avea rezultatul corect if(carry != 0) { crc_rez ^= poly;//poly este 0x8408 } } } Problema apare la impartirea la 2 (sau shift right cu 1) a registrului crc_rez, care este declarat ca int, nu imi sterge bitul 15. De exemplu, 0x8408/2 el il vede ca 0xC204 in loc de 0x4204. Am incercat atat in simulator cat si cu un 16f88 fizic. Programul functioneaza corect acum, dar, de ce nu face impartirea la 2 corect? Acest lucru ma deruteaza, inseamna ca pot aparea aceste probleme oricand si oriunde in program. Orice idee, de elucidare a acestui mister, este bine venita. Toate bune. Link spre comentariu
modoran Postat Octombrie 22, 2018 Partajează Postat Octombrie 22, 2018 (editat) Problema e foarte simpla, trebuie folosit unsigned int acolo ( sau si mai bine uint16_t ), nu int, bitul 15 ( de fapt 16, depinde cum numeri ) e bitul pentru semn. Programul tau face impartirea la 2 in mod corect in ambele cazuri daca faci citirea in decimal. Editat Octombrie 22, 2018 de modoran Link spre comentariu
costi002 Postat Octombrie 22, 2018 Autor Partajează Postat Octombrie 22, 2018 Minunat, am schimbat in unsigned si merge corespunzator. Pot dormi linistit la noapte. Multumesc. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum