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ł?
avr asembler
Nov 16, 2006
2 Replies
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