Jump to content
ELFORUM - Forumul electronistilor
Sign in to follow this  
cirip

Cum se face suma saturata?

Recommended Posts

Salut,Ma poate ajuta cineva cu un algoritm de suma saturata ptr pici de 8 biti, in asembler? Poate ca si C ar fi bun, atata timp cat se poate vedea algoritmul si nu foloseste mai stiu eu ce functii intrinseci sau de lib(e)rarie.Da, as putea sa testez dupa sumare, dar e cam ciobaneste. Stie cineva un algoritm mai jmekeros?Gogu si piclist nu au fost prea generosi cu raspunsuri.Multumesc,Cirip

Share this post


Link to post
Share on other sites

1. Solutzie eleganta: eu zic sa incerci procedura clasica, in genul suma 2x16bitzi, cu semn, aia din math routines de la microchip, care itzi scoate rezultatul pe 32 bitzi. rezultatul il compari dupa aia cu valoarea la care vrei sa-i aplici saturarea, daca nu trece, il lashi cum e, iar daca da peste incarci rezultatul cu valoarea de saturatzie.2 ptr 16 bitzi fara semn:;******************************** Begin Double precission substraction/additionD_sub comf ACCaLO, F ; negate ACCa ( -ACCa -> ACCa ) incf ACCaLO, F btfsc STATUS, Z decf ACCaHI, F comf ACCaHI, FD_add movf ACCaLO, W addwf ACCbLO, F ; add lsb btfsc STATUS, C ; add in carry incf ACCbHI, F movf ACCaHI, W addwf ACCbHI, F ; add msb retlw 0 ; Double Precision Subtraction ( ACCb - ACCa -> ACCb, or only adition )daca il foloseshti doar ca suma, potzi testa carryul la ieshirea din procedura.

Share this post


Link to post
Share on other sites

Nu stiu daca se poate scapa de comparatie + ajustare. Cum anume doresti sa faci suma (intregi / virgula mobila / virgula fixa si pe cati biti)?

Share this post


Link to post
Share on other sites

Multumesc pentru raspunsuri.Vreau sa lucrez pe 16 biti, intregi cu semn.Am uitat sa specific.Cirip

Share this post


Link to post
Share on other sites

Daca lucrezi cu intregi cred ca metoda cea mai simpla este sa faci suma (vezi operatii cu intregi cu semn la notele de aplicatii Microchip), apoi sa testezi dupa sumare. N-o fi prea eleganta metoda, dar cu siguranta e rapida (sumarea si testarea se efectueaza in cativa cicli). Nu stiu sa existe vreun alt algoritm pentru intregi si chiar daca ar exista, nu cred ca ar putea fi mai rapid.

Share this post


Link to post
Share on other sites

OK, multumesc Cristiano si Bogdanel.Cirip

Share this post


Link to post
Share on other sites
Guest Marus_Rockeru

Ca tot veni vorba ... zice-ti-mi si mie ce inseamna saturarea asta la operatiile aritmetice ? :partyman:

Share this post


Link to post
Share on other sites

Pai in general, numerele sunt reprezentate binar pe x bitzi, cu sau fara semn. Pentru reprezentarea sumei a doua astfel de numere sunt necesari x+1 bitzi. De multe ori, nu prezinta nici un interes practic sa lucrezi cu x+1 bitzi, zona de interes fiind pe x bitzi din numar. Se pune problema ce faci sa transformi rezultatul in numar exprimabi in x bitzi. Potzi sa impartzi cu doi (un shift cu carry pentru reprezentari fara semn) sau potzi sa saturezi rezultatul. Asta se face prin comparare cu valoarea (sau valorile, in cazul numerelor cu semn), daca suma depasheste, se truncheaza la nivelul acestor valori. ex: 0x8e+0x9a=0x128, care nu mai incape intr-un octet. daca il impartzi la doi, iese 94, iar daca il saturezi vine 0xff.

Share this post


Link to post
Share on other sites

Sa renunti la 'cel mai putin semnificativ' bit al rezultatului inteleg ca e corect , dar sa obtii 0xff , asta nu stiu de unde iese.Asta inseamna ca daca facem o "tabla a adunarii" pe 8 biti,cu rezultat pe 8 biti, jumatate din rezultate vor fi 0xff ?

Share this post


Link to post
Share on other sites

Este exacta remarca ta legata de "tabla adunarii". Iar 0xff iese pentru ca tu l-ai scris acolo, rezultatul sumei fiind mai mare, pe 9 bitzi. Daca nu vrei sa lucrezi cu noua bitzi, este foarte confortabil. Vezi de exemplu regulatoarele PID. Daca eroarea este constanta (sa zicem ca mecanismul este blocat intr-un regulator de pozitzie), integratorul va tot integra (care este pana la urma o suma, ca doar suntem in discret) pana da pe laturi, deci overflow. Asta este un prim aspect. Al doilea: PID inseamna Y=P+I+D, iar daca fiecare componenta este reprezentata pe 8 bitzi cu semn, shi ieshirea este de tot 8 bitzi + semn (un pwm sa zicem), este musai sa foloshesti suma saturata, daca vrei ca fiecare dintre termeni sa poata ataca ieshirea in full span. Cand faci un regulator PID analogic, aspectele astea sunt chiar evidente.Apropos Cirip: poate gaseshti cod cu suma saturata in appnote-le cu PID-ul de la microchip...

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines