Sari la conținut
ELFORUM - Forumul electronistilor

16f88 si impartirea la 2


Postări Recomandate

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

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 de modoran
Link spre comentariu

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări