cirip Postat Aprilie 17, 2006 Partajează Postat Aprilie 17, 2006 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 spre comentariu
bogdanel Postat Aprilie 18, 2006 Partajează Postat Aprilie 18, 2006 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 spre comentariu
Cristiano Postat Aprilie 18, 2006 Partajează Postat Aprilie 18, 2006 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 spre comentariu
cirip Postat Aprilie 18, 2006 Autor Partajează Postat Aprilie 18, 2006 Multumesc pentru raspunsuri.Vreau sa lucrez pe 16 biti, intregi cu semn.Am uitat sa specific.Cirip Link spre comentariu
Cristiano Postat Aprilie 19, 2006 Partajează Postat Aprilie 19, 2006 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 spre comentariu
cirip Postat Aprilie 19, 2006 Autor Partajează Postat Aprilie 19, 2006 OK, multumesc Cristiano si Bogdanel.Cirip Link spre comentariu
Vizitator Marus_Rockeru Postat Aprilie 30, 2006 Partajează Postat Aprilie 30, 2006 Ca tot veni vorba ... zice-ti-mi si mie ce inseamna saturarea asta la operatiile aritmetice ? :partyman: Link spre comentariu
Vizitator ozy Postat Aprilie 30, 2006 Partajează Postat Aprilie 30, 2006 Si eu vreau sa stiu!.. Link spre comentariu
bogdanel Postat Aprilie 30, 2006 Partajează Postat Aprilie 30, 2006 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 spre comentariu
Vizitator ozy Postat Aprilie 30, 2006 Partajează Postat Aprilie 30, 2006 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 spre comentariu
bogdanel Postat Aprilie 30, 2006 Partajează Postat Aprilie 30, 2006 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 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