avr asembler

Nov 16, 2006 2 Replies

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ł?


Michał napisał(a):

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 napisał(a):

Rzeczywiście nic skomplikowanego. Dzieki serdeczne.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required