RTV forum PL | NewsGroups PL

Jak wyodrębnić setki, dziesiątki i jedności z 1 bajta liczby 0-125 za pomocą operatorów bitowych?

Potrzebna porada - binarny na dziesietny

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak wyodrębnić setki, dziesiątki i jedności z 1 bajta liczby 0-125 za pomocą operatorów bitowych?

ivaldir
Guest

Fri Jan 05, 2007 3:55 pm   



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

Pawel \"O'Pajak\"
Guest

Fri Jan 05, 2007 3:59 pm   



Powitanko,

Quote:
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).

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

Pozdroofka,
Pawel Chorzempa
--
"-Tato, po czym poznać małą szkodliwość społeczną?
-Po wielkiej szkodzie prywatnej" (kopyrajt: S. Mrożek)
******* >>> !!! UWAGA: ODPOWIADAM TYLKO NA MAILE ->:
> pavel(ten_smieszny_znaczek)klub.chip.pl <<<<*******

ivaldir
Guest

Fri Jan 05, 2007 4:13 pm   



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

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

Pszemol
Guest

Fri Jan 05, 2007 5:39 pm   



"ivaldir" <ivaldir@a.com> wrote in message news:enlos5$6k9$1@news.onet.pl...
Quote:
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).

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:
http://pl.wikibooks.org/wiki/Programowanie:C:Sk%C5%82adnia#Operatory_arytmetyczne

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

Pawel \"O'Pajak\"
Guest

Fri Jan 05, 2007 8:36 pm   



Powitanko,

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

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
--
"-Tato, po czym poznać małą szkodliwość społeczną?
-Po wielkiej szkodzie prywatnej" (kopyrajt: S. Mrożek)
******* >>> !!! UWAGA: ODPOWIADAM TYLKO NA MAILE ->:
> pavel(ten_smieszny_znaczek)klub.chip.pl <<<<*******

ivaldir
Guest

Fri Jan 05, 2007 9:36 pm   



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

ivaldir
Guest

Sat Jan 06, 2007 12:07 pm   



Quote:

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

Piotr Gałka
Guest

Sat Jan 06, 2007 12:19 pm   



Użytkownik "Pszemol" <Pszemol@PolBox.com> napisał w wiadomości
news:enl9tn.6hk.0@poczta.onet.pl...
Quote:
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.

Nie chce mi się sprawdzać, ale według mnie wyjdzie: j=8, d=28, s=128.

P.G.

Krzysiek
Guest

Sat Jan 06, 2007 1:03 pm   



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

Quote:
Użytkownik "Pszemol" <Pszemol@PolBox.com> napisał w wiadomości
news:enl9tn.6hk.0@poczta.onet.pl...
j = x % 10;
d = x % 100;
s = x % 1000;
da wyniki dla x == 128 takie: j = 8, d = 2, s = 1.
Nie chce mi się sprawdzać, ale według mnie wyjdzie: j=8, d=28, s=128.

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

ivaldir
Guest

Sat Jan 06, 2007 5:56 pm   



Quote:

Jedyny racjonalny powód dla którego można szukać sposobu na operatorach
arytmetycznych i logicznych jest oszczędny i szybki w wykonaniu kod.

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


Quote:
Dzielenie i reszta z dzielenia napewno do szybkich nie należą.
Funkcja Makebcd(), jak znam Bascoma, pewnie do szybkich też się nie
zalicza.

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

pozdrawiac

Pawel \"O'Pajak\"
Guest

Sat Jan 06, 2007 10:00 pm   



Powitanko,

Quote:
A co do rozwiazania na
operatorach logicznych i arytmetycznych, to napewno pokombinuje, w koncu
to na makebcd dziala jako tako tylko do 159 Smile.

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
--
"-Tato, po czym poznać małą szkodliwość społeczną?
-Po wielkiej szkodzie prywatnej" (kopyrajt: S. Mrożek)
******* >>> !!! UWAGA: ODPOWIADAM TYLKO NA MAILE ->:
> pavel(ten_smieszny_znaczek)klub.chip.pl <<<<*******

ivaldir
Guest

Sun Jan 07, 2007 1:12 am   



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


Fakt, nie doczytalem, ale od razu przypomnialem ze bylo cos takiego w
technikum, niestety tylko w zeszycie. Odgrzebalem z netu cos takiego,
calkiem czytelne:
http://www.ece.duke.edu/~dwyer/courses/ece52/Binary_to_BCD_Converter.pdf

Pozdrawiac

Pawel \"O'Pajak\"
Guest

Sun Jan 07, 2007 1:53 am   



Powitanko,

Quote:
http://www.ece.duke.edu/~dwyer/courses/ece52/Binary_to_BCD_Converter.pdf

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

Pozdroofka,
Pawel Chorzempa
--
"-Tato, po czym poznać małą szkodliwość społeczną?
-Po wielkiej szkodzie prywatnej" (kopyrajt: S. Mrożek)
******* >>> !!! UWAGA: ODPOWIADAM TYLKO NA MAILE ->:
> pavel(ten_smieszny_znaczek)klub.chip.pl <<<<*******

elektroda NewsGroups Forum Index - Elektronika Polska - Jak wyodrębnić setki, dziesiątki i jedności z 1 bajta liczby 0-125 za pomocą operatorów bitowych?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map