Sari la conținut
ELFORUM - Forumul electronistilor

Inmultire cu dword pe PIC16F


Mondan

Postări Recomandate

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
  • Răspunsuri 3
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Mondan

    2

  • francezu

    1

  • 10vid

    1

Zile populare

Top autori în acest subiect

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

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