Mondan Postat Noiembrie 29, 2011 Partajează Postat Noiembrie 29, 2011 PIC16F este pe 8 biti.Am gasit algoritm de byte*word->word sau 8biti*16biti=16bitiAstfel produsul este in 2 variabile Produs si Produs+1Eu vreau ceva de genul:16biti*32biti=32biti Rusinos ce-i derept pentru mine, dar nu prea ma descvurc si nu e vorba decat de un voltmetru.Am A/D pe 10 biti si tensiunea se divizeaza si eu trebuie sa o rescalez. In variante 8biti*16biti=16biti se pierde din calitatea citirii.In prezent fac inmultirea prin adunari repetate.Ex. bftss.....ultimul bit al inmultitorului este 1 ? daca da aduna la produs de multiplicandul .....ADD HI .....ADD LO. cu carry intre ele daca depasesteapoi rotestele si vezi cifra "zecilor"", apoi "suntelor" ... dupa acelsi algoritmFaza e ca daca aveti voi un algoritm corect ca au am incercat sa il modofoc pe asta dar imi da rezultate gresite la depsirea a 16 biti ai produlusui ceea ce insemna ca mi-am prin urechile. Link spre comentariu
francezu Postat Noiembrie 29, 2011 Partajează Postat Noiembrie 29, 2011 Salut! Incearca rutina de aici: http://www.piclist.com/techref/microchi ... 2x16-a.htm Link spre comentariu
10vid Postat Noiembrie 29, 2011 Partajează Postat Noiembrie 29, 2011 E dificil (si lent) sa se shifteze si sa se adune numere de 32 biti sau mai mari pe un procesor de 8 biti. De aceea nici nu se merge pe aceasta cale, ci se observa cum un om face niste inmultiri cu numere de ordinul sutelor sau chiar miilor, desi orice om nu cunoaste pe de rost tabla inmultirii decat pana la 100. Solutia e urmatoarea: se "sparg" numerele in bucati mai mici, cu care stim sa lucram. Astfel, pentru 54 x 6 zicem: 5 x 6 (si tinem minte acel 0 care este de fapt un deplasament) = 30 (adaugam deplasamentul ) = 300, apoi, 6 x 6 = 36. Adunam 300 + 36 = 336. La fel si in PIC, se "sparg" numerele in bucati de 8 biti cu care se lucreaza usor si se foloseste o rutina 8x8 simpla, de vreo cateva ori, dupa modelul "fiecare cu fiecare". Rezultatul fiecarei inmultiri 8x8 se adauga la rezultatul final (care este un sir de variabile de 8 biti ......r3:r2:r1:r0) in locatiile corespunzatoare pozitiilor bucatilor pe care le-am luat din cele doua numere de multiplicat. De ex: am doua numere a3:a2:a1:a0 si b1:b0. Sunt la inmultirea lui a3 cu b1. Rezultatul acelei inmultiri va fi adaugat rezultatului final la pozitia: r5:r4:r3:r2:r1:r0. Se observa ca rezultatul e pe 48 biti. Totusi, daca suntem siguri ca rezultatul nu va depasi niciodata 32 biti, aceasta inmultire poate fi evitata. (Asta presupune ca a3 sau b1 e intotdeauna 0, asa ca orice inmultire cu acel registru nu-si are rostul). Link spre comentariu
Mondan Postat Decembrie 6, 2011 Autor Partajează Postat Decembrie 6, 2011 Ok, am luat programul din link si merge.Trebuiesc declarate si niste variabile c 1..4 parca , folosite intern.Deci a fost ok. 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