Autor Tema: número máximo de instruccines por segundo  (Leído 5233 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: número máximo de instruccines por segundo
« Respuesta #15 en: 10 de Mayo de 2012, 23:32:25 »
Hay un PIC18 que tiene 7 PWM  ;-)

Un Atmega2561 tiene 12 PWM programables de 2 a 16 bits.



Luego, en general, no se puede decir nada de cual es mejor. Lo que si se puede decir es las características de cada uno, los MIPS son una mentira más grande...

Ejemplo, en 8bits de ambas familias, te dicen corre a X MIPS pero no te explican cuantas instrucciones son necesarias para, por ejemplo, dividir un número de 16bits. El PIC por ejemplo con su arquitectura de monoacumulador nunca va a ser mejor que su competencia.

Además, decir que se va a X MIPS y necesitar tener un oscialdor de X Mhz no es lo mismo que el micro rinda X MIPS y solo necesite X/4 Mhz, y esto importa y mucho ante regulaciones de radiofrecuencia (como la FCC en USA), y tampoco es lo mismo el consumo de un micro a 48Mhz que a 12Mhz.

Las comparaciones son siempre odiosas, por eso cada vez que me preguntan digo:

"El mejor es el que más conozcas".

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

Desconectado Felixls

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 300
Re: número máximo de instruccines por segundo
« Respuesta #16 en: 11 de Mayo de 2012, 00:45:09 »
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:

Código: [Seleccionar]
;***************************************************************************
;*
;* "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 Aritmetics
http://www.atmel.com/Images/doc0937.pdf

AVR200: Multiply and Divide Routines
http://www.atmel.com/Images/doc0936.pdf

saludos.
« Última modificación: 11 de Mayo de 2012, 00:59:55 por Felixls »


 

anything