Jump to content
ELFORUM - Forumul electronistilor

Cum se face suma saturata?


cirip

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

Link to comment
  • Replies 10
  • Created
  • Last Reply

Top Posters In This Topic

  • cirip

    3

  • bogdanel

    3

  • Cristiano

    2

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.

Link to comment

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

Link to comment

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.

Link to comment
  • 2 weeks later...

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.

Link to comment

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 ?

Link to comment

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...

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • 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