Potrzebna porada - binarny na dziesietny

Jan 05, 2007 14 Replies

Witam, potrzebuje troche pomocy, a wlasciwie gotowca programistycznego. Mianowicie: jak z 1bajtu (liczby w zakresie 0-125 - termometr DS na 1-wire) wyciagnac liczbe setek, dziesiatek i jednosc bawiac sie jedynie operatorami logicznymi, przesunieciami w bajcie, negacjami itp (takie elementarne funkcje).



Pozdrawiam ivaldir



Powitanko,

Nie napisales jaki proc, jak '51, to jest w nim funkcja przeliczania bin->dec dla jednego bajtu.

Pozdroofka, Pawel Chorzempa

Napewno AVR, '51 niezabardzo znam. Bede pisal (bo latwy) w Bascomie, moze w C.

W C mozesz uzyc operatora % - reszta z dzielenia calkowitego.

Podzielisz przez 10 to reszta beda jednostki... Podzielisz przez 100 to reszta beda dziesiatki... I tak dalej...

Dla przykladu, zapis w C taki:

void f (int x) { int j, d, s;

j = x % 10; d = x % 100; s = x % 1000;

/* tu uzywasz do czegos obliczonych zmiennych j, d, s */ }

da wyniki dla x == 128 takie: j = 8, d = 2, s = 1.

Tu masz wyjasnione inne operatory:

formatting link
Basica/Bascomu osobiscie nie polecam, ale ma on sporo zwolennikow.

Powitanko,

Dla jednego bajtu moze byc szybciej podzielic, ale jakbys chcial wieksza liczbe, to:

  1. przesuwasz o jeden bit w lewo
  2. badasz kazdy nibble (nowo powstaly), jesli jest w nim liczba >=5, to dodajesz 3, jak mniejsze, to tylko przesuwasz.
  3. powtarzasz operacje tyle razy, ile jest bitow w przeksztalcanej liczbie, konczac na przesunieciu. Po przeprowadzeniu tej operacji (ktora w kazdym procku bedzie bardzo szybka) w kolejnych nibblach otrzymasz kolejne cyfry liczby dziesietnej.

Pozdroofka, Pawel Chorzempa

No jakos sobie poradzilem, troche to "na krzywy ryj", ale dziala poprawnie i wyswietla caly potrzebny mi zakres liczb (do 125 czyli max czujnika). Sprawe zalatwilem w bascomie za pomoca funckji MAKEBCD wykorzystujac fakt, ze od

100 do 159 4 starsze bity to 10 do 15 ( do 99 funkcja dziala normalnie - starsze 4 bity to cyfra dziesiatek, mlodsze to jednosci). Jakby kogos interesowalo to fragment kodu odpowiedzialny za robote (w bascomie): ... If Licznik < 100 Then Setki = 0 Dziesiatki = Makebcd(licznik) Jednosci = Dziesiatki And 15 Shift Dziesiatki , Right , 4 End If

If Licznik >= 100 Then Setki = 1 Dziesiatki = Makebcd(licznik) Jednosci = Dziesiatki And 15 Shift Dziesiatki , Right , 4 Dziesiatki = Dziesiatki - 10 End If ...

A mia³y byæ wykorzystane tylko operatory logiczne, przesuniecia w bajcie, negacjami itp a Ty wykorzystujesz gotow± funkcjê Makebcd().

Mialo byc, a wyszlo jak zwykle . Kolega Pszemol podal przyklad jak problem rozwiazac w C. Pisalem o operatorach logicznych, przesunieciach w bajcie, negacjach itp, bo fajnie by bylo zrobic gotowca do wykorzystania w praktycznie dowolnym jezyku programowania. A ze ostatecznie przysiadlem do bascoma (i udalo sie - jakos) to podaje rozwiazanie w bascomie. Jak wymysle jak to zalatwic inaczej (bez funkcji) to tez napisze. Narazie to co wymyslilem dziala, wystarcza do tego co potrzebuje, a ze moze komus sie przyda, to podaje rozwiazanie na grupe.

Pozdrawiam ivaldir

U¿ytkownik "Pszemol" snipped-for-privacy@PolBox.com napisa³ w wiadomo¶ci news: snipped-for-privacy@poczta.onet.pl...

Nie chce mi siê sprawdzaæ, ale wed³ug mnie wyjdzie: j=8, d=28, s=128. P.G.

Dnia Sat, 6 Jan 2007 12:19:29 +0100, Piotr Gałka napisał(a):

Pewnie tak będzie działało lepiej:

j = x % 10; d = (x % 100) / 10; s = x / 100;

/* % - w C operator reszty z dzielenia - modulo*/

Nie znam bascoma - ale musi tam być jakiś odpowiednik %...

Jedyny racjonalny powód dla którego mo¿na szukaæ sposobu na operatorach arytmetycznych i logicznych jest oszczêdny i szybki w wykonaniu kod. Dzielenie i reszta z dzielenia napewno do szybkich nie nale¿±. Funkcja Makebcd(), jak znam Bascoma, pewnie do szybkich te¿ siê nie zalicza.

To akurat nie mi niezbedne, jak sie ukontroler wyrobi w 1s to tez starczy :).

Zazyczaj im bardziej banalny jezyk od strony uzytkownika tym bardziej jest marnotrawny jesli idzie o zasoby urzadzenia. Jednak jak wyzej wspomnialem na wydajnosci mi nie zalezy. A co do rozwiazania na operatorach logicznych i arytmetycznych, to napewno pokombinuje, w koncu to na makebcd dziala jako tako tylko do 159 :).

pozdrawiac

Powitanko,

No to Ci podalem wyzej sposob, masz tylko przesuniecia, porownywanie i dodawanie - wszystko najszybsze rozkazy w zramolalym '51. Przeliczenie

24bitowej liczby na dziecietny (czyli 10 cyfr) jest w niezauwazalnie krotkim czasie.

Pozdroofka, Pawel Chorzempa

Fakt, nie doczytalem, ale od razu przypomnialem ze bylo cos takiego w technikum, niestety tylko w zeszycie. Odgrzebalem z netu cos takiego, calkiem czytelne:

formatting link
Pozdrawiac

Powitanko,

O wlasnie, o to chodzilo. Polecam algorytm, sam go stosuje i jest naprawde szybki.

Pozdroofka, Pawel Chorzempa

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required