Witam serdecznie,
Chciałbym się podzielić z Państwem programowym rozwiązaniem szybkiego dzielenia przez (małą) stałą liczby 8 bit.
Długo szukałem jakiegokolwiek wytłumaczenia dlaczego AVRy nie zostały wyposażone w moduł sprzętowego dzielnia, i niestety wprost tej informacji nie
znalazłem.
Uniwersalne procedury, zgodnie z opracowaniem Atmela o nazwie AVR200 na wykonadzie dzielenia zużywają 58 lub 97 cykli, oraz 66 lub 14 bajtów kodu.
Celem zwiększenia szybkości wykonywania kodu można zastosować poniższy sposób:
Dla przykładu, dzielenie zmiennej U (8bit) przez 3:
Dzielenie przez 3, to inaczej mnożenie przez 0,3333.. Część AVRów atmela ma sprzętowy moduł mnożenia, wykonujący mnożenie w 2 cyklach.
Przykład dla Bascom:
potencjometr podłączony pod ADC(7). W zmiennej Pot, w zależności od wartości z potencjometru mamy wartości od 15 do 100.
Niestety BASCOM dla Atmegi328P podczas kompilacji nie wykorzystuje sprzętowego mnożenia (MUL) tylko programowe, przez co zysk z takiego dzielenia nie jest aż
tak duży. Dla porównania:
Dzielenie w Bascomie U = U / 3 zajmuje 112 cykli, a dzielenie jak wyżej 48 cykli.
Przy okazji będę wdzięczny za informację (jeśli ktoś wie) dlaczego AVRy nie mają dzielenia będę wdzieczny.
pozdrawiam
Chciałbym się podzielić z Państwem programowym rozwiązaniem szybkiego dzielenia przez (małą) stałą liczby 8 bit.
Długo szukałem jakiegokolwiek wytłumaczenia dlaczego AVRy nie zostały wyposażone w moduł sprzętowego dzielnia, i niestety wprost tej informacji nie
znalazłem.
Uniwersalne procedury, zgodnie z opracowaniem Atmela o nazwie AVR200 na wykonadzie dzielenia zużywają 58 lub 97 cykli, oraz 66 lub 14 bajtów kodu.
Celem zwiększenia szybkości wykonywania kodu można zastosować poniższy sposób:
Dla przykładu, dzielenie zmiennej U (8bit) przez 3:
Dzielenie przez 3, to inaczej mnożenie przez 0,3333.. Część AVRów atmela ma sprzętowy moduł mnożenia, wykonujący mnożenie w 2 cyklach.
Przykład dla Bascom:
Kod: text
potencjometr podłączony pod ADC(7). W zmiennej Pot, w zależności od wartości z potencjometru mamy wartości od 15 do 100.
Niestety BASCOM dla Atmegi328P podczas kompilacji nie wykorzystuje sprzętowego mnożenia (MUL) tylko programowe, przez co zysk z takiego dzielenia nie jest aż
tak duży. Dla porównania:
Dzielenie w Bascomie U = U / 3 zajmuje 112 cykli, a dzielenie jak wyżej 48 cykli.
Przy okazji będę wdzięczny za informację (jeśli ktoś wie) dlaczego AVRy nie mają dzielenia będę wdzieczny.
pozdrawiam
Moderowany przez dondu:SYNTAX - Wklejając kod programu używaj proszę znacznika SYNTAX. Składnia jest wtedy kolorowana i łatwo kod analizować, a dodatkowo posty są krótkie.
