RTV forum PL | NewsGroups PL

Jak podzielić liczby 16-bitowe w ATmega8 i uzyskać wynik w formacie stałoprzecinkowym?

avr asembler

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak podzielić liczby 16-bitowe w ATmega8 i uzyskać wynik w formacie stałoprzecinkowym?

Michał
Guest

Thu Nov 16, 2006 11:47 am   



Programuję mikrokontroler ATmega8. Operuję na liczbach 16bitowych w
postaci 8bitMSB - część całkowita, 8bitLSB -część ułamkowa w zapisie
stałoprzecinkowym. Teraz chciałbym podzielić dwie takie liczby 16bitowe.
Stosując procedurki dzielenia ze strony Atmelka otrzymuję wynik w
postaci część całkowita i reszta. Zastanawiam się jak tą resztę zamienić
na zapis stałoprzecinkowy tak żeby wynik dzielenia był 8bitMSB - część
całkowita, 8bitLSB -część ułamkowa w zapisie stałoprzecinkowym. Czy ktoś
ma jakiś pomysł?

Adam Dybkowski
Guest

Thu Nov 16, 2006 9:49 pm   



Michał napisał(a):

Quote:
Programuję mikrokontroler ATmega8. Operuję na liczbach 16bitowych w
postaci 8bitMSB - część całkowita, 8bitLSB -część ułamkowa w zapisie
stałoprzecinkowym. Teraz chciałbym podzielić dwie takie liczby 16bitowe.
Stosując procedurki dzielenia ze strony Atmelka otrzymuję wynik w
postaci część całkowita i reszta. Zastanawiam się jak tą resztę zamienić
na zapis stałoprzecinkowy tak żeby wynik dzielenia był 8bitMSB - część
całkowita, 8bitLSB -część ułamkowa w zapisie stałoprzecinkowym. Czy ktoś
ma jakiś pomysł?

Czyli dzielisz liczbę zapamiętaną w konwencji 8.8 przez drugą w tym
samym formacie. Postaram się to wytłumaczyć jak najprościej:
- na przykład dzielisz 10 (0x0a00) przez 3 (0x0300)
- wynik zwykłego dzielenia tych liczb to 2560/768=3.3333
- oczywiście gdy wykonasz tą operację jako dzielenie 2 liczb 16-bitowych
to wyjdzie po prostu 3 i nici z części ułamkowej (pomińmy mało tutaj
przydatną informację o reszcie z dzielenia; aby ją wykorzystać musiałbyś
obliczyć reszta*256/dzielna czyli zrobić jeszcze raz dzielenie)
- dlatego dzielną musisz przesunąć dodatkowo o 8 bitów w lewo i wykonać
dzielenie 0x0a0000 / 0x0300 = 0x0355 czyli 3 i 85/256 czyli 3.332

Inaczej mówiąc:
- dzielna to liczba w formacie 8.8
- dzielnik też w formacie 8.8
- przesuwasz dzielnik o 8 bitów w lewo czyli jest w formacie 8.16
- wynik dzielenia liczb 8.16 / 8.8 wychodzi 8.8 i już.

--
Adam Dybkowski
http://www.amwaw.edu.pl/~adybkows/

Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

Michał
Guest

Fri Nov 17, 2006 9:35 pm   



Adam Dybkowski napisał(a):
Quote:



Czyli dzielisz liczbę zapamiętaną w konwencji 8.8 przez drugą w tym
samym formacie. Postaram się to wytłumaczyć jak najprościej:
- na przykład dzielisz 10 (0x0a00) przez 3 (0x0300)
- wynik zwykłego dzielenia tych liczb to 2560/768=3.3333
- oczywiście gdy wykonasz tą operację jako dzielenie 2 liczb 16-bitowych
to wyjdzie po prostu 3 i nici z części ułamkowej (pomińmy mało tutaj
przydatną informację o reszcie z dzielenia; aby ją wykorzystać musiałbyś
obliczyć reszta*256/dzielna czyli zrobić jeszcze raz dzielenie)
- dlatego dzielną musisz przesunąć dodatkowo o 8 bitów w lewo i wykonać
dzielenie 0x0a0000 / 0x0300 = 0x0355 czyli 3 i 85/256 czyli 3.332

Inaczej mówiąc:
- dzielna to liczba w formacie 8.8
- dzielnik też w formacie 8.8
- przesuwasz dzielnik o 8 bitów w lewo czyli jest w formacie 8.16
- wynik dzielenia liczb 8.16 / 8.8 wychodzi 8.8 i już.


Rzeczywiście nic skomplikowanego. Dzieki serdeczne.

elektroda NewsGroups Forum Index - Elektronika Polska - Jak podzielić liczby 16-bitowe w ATmega8 i uzyskać wynik w formacie stałoprzecinkowym?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map