Cytat: Sprawdziłem i niestety. Puki dzieli 16bit to jest ok. jak zaczyna dzielić 24bit. to są błędy.
Napisałem tę procedurę dosyć dawno i już nie wiem w ilu ATMEGACH to pracuje.
Na szybko napisałem programik do symulacji/testowania w AVR Studio.
;sprawdzanie procedury dzielenia 24/16
.include "m162def.inc"
.equ Dzielna=0xFFFFFF
.equ Dzielnik=1
.org 0
ldi R16,LOW(RAMEND)
out SPL,R16
ldi R16,HIGH(RAMEND)
out SPH,R16
ldi dzielna_B2,((Dzielna>>16) & 0xFF)
ldi dzielna_B1,((Dzielna>>8) & 0xFF)
ldi dzielna_B0,(Dzielna & 0xFF)
ldi dzielnik_B1,((Dzielnik >> 8) & 0xFF)
ldi dzielnik_B0,(Dzielnik & 0xFF)
rcall div24U
STOP: rjmp STOP
.def Reszta_B0=r14
.def Reszta_B1=r15
;.def iloraz_B0=r16 - patrz dzielna
;.def iloraz_B1=r17
;.def iloraz_B2=r18
.def Dzielna_B0=r16
.def Dzielna_B1=r17
.def Dzielna_B2=r18
.def dzielnik_B0=r19
.def dzielnik_B1=r20
.def licznikP=r21
div24u: clr reszta_B0
sub reszta_B1,reszta_B1
ldi LicznikP,25
loop: rol dzielna_B0
rol dzielna_B1
rol dzielna_B2
dec LicznikP
breq return
rol reszta_B0
rol reszta_B1
sub reszta_B0,dzielnik_B0
sbc reszta_B1,dzielnik_B1
brcc loop
add reszta_B0,dzielnik_B0
adc reszta_B1,dzielnik_B1
rjmp loop
return: com dzielna_B0
com dzielna_B1
com dzielna_B2
ret
Przetestowałem dla różnych wartości i na razie wygląda, że to działa.
Czy możecie mi podać wartości dzielnej i dzielnika przy których jest błąd?
P.S. Dzielenie przez zero iloraz=0xFFFFFF a reszta to dwa młodsze bajty dzielnej.
0XFFFFFF to maksymalna warość liczby 3-bajtowej bez znaku - coś jak +niekończonośc- też sensowny wynik
pozdrawiam