En AVR no se como ira, pero los pics de 8bits no tienen division por hardware como mucho multiplicacion, por lo cual dependiendo de la funcion usada para dividir tardara X tiempo, este tiempo lo tendrias que calcular tu manualmente, si se ejecuta en 100Tcy pues esa es tu respuesta. En el caso de multiplicaciones te viene una tabla en el datasheet, por ejemplo en el 18f4550 multiplicar 2 numeros sin signo son 100ns a 40Mhz (10Mips) y multiplicar 2 numeros con signo de 16bits son 4us a 10MIPS
No, AVR tampoco tiene división por HW, lo que digo es que las operaciones se pueden hacer mucho más fácilmente (sobre todo las de
16 bits)
En AVR tienes 32 registros acumuladores, trabajando de a pares puedes hacer operaciones de 16 bit en muy pocas instrucciones y
sin acceso a la RAM.
Ejemplo:
;***************************************************************************
;*
;* "div16u" - 16/16 Bit Unsigned Division
;*
;* This subroutine divides the two 16-bit numbers
;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor).
;* The result is placed in "dres16uH:dres16uL" and the remainder in
;* "drem16uH:drem16uL".
;*
;* [b]Number of words :19 [/b]
;* [b]Number of cycles :235/251 (Min/Max) [/b]
;* Low registers used :2 (drem16uL,drem16uH)
;* High registers used :5 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH,
;* dcnt16u)
;*
;***************************************************************************
;***** Subroutine Register Variables
.def drem16uL=r14
.def drem16uH=r15
.def dres16uL=r16
.def dres16uH=r17
.def dd16uL =r16
.def dd16uH =r17
.def dv16uL =r18
.def dv16uH =r19
.def dcnt16u =r20
;***** Code
div16u: clr drem16uL ;clear remainder Low byte
sub drem16uH,drem16uH;clear remainder High byte and carry
ldi dcnt16u,17 ;init loop counter
d16u_1: rol dd16uL ;shift left dividend
rol dd16uH
dec dcnt16u ;decrement counter
brne d16u_2 ;if done
ret ; return
d16u_2: rol drem16uL ;shift dividend into remainder
rol drem16uH
sub drem16uL,dv16uL ;remainder = remainder - divisor
sbc drem16uH,dv16uH ;
brcc d16u_3 ;if result negative
add drem16uL,dv16uL ; restore remainder
adc drem16uH,dv16uH
clc ; clear carry to be shifted into result
rjmp d16u_1 ;else
d16u_3: sec ; set carry to be shifted into result
rjmp d16u_1
Una división en 19 words, nada mal, no?
Existen rutinas para mejorar espacio usado o velocidad.
Más información sobre estas rutinas:
AVR202: 16 bits Aritmeticshttp://www.atmel.com/Images/doc0937.pdfAVR200: Multiply and Divide Routineshttp://www.atmel.com/Images/doc0936.pdfsaludos.