Página 1 de 2
Rotina de divisão em ASM

Enviado:
21 Jan 2010 21:11
por Andre_Cruz
Estou trabalhando em ASM, com uma rotina de divisão de 16 bits da microchip, ela usa a técnica de rotação de bits e subtração.
Testei no Hitech e faz a mas rapido a divisão que essa rotina, gostaria de saber se existe alguma técnica pra se fazer essa divisão de maneira mais rapida.
Abraço
Agradeço a respostas de todos.
André

Enviado:
21 Jan 2010 23:53
por jorgeluiz
se essa for a chamada divisao "cardionica", e' sim a mais rapida possivel em ASM.

Enviado:
22 Jan 2010 07:51
por Andre_Cruz
jorgeluiz,
A rotina que eu estou utilizado tem no application node 544 na microchip.
Não conheço essa técnica de divisão, "cardionica", você tem uma rotina utilizando essa técnica para disponibilizar ?
Valeww
Abraço

Enviado:
22 Jan 2010 09:03
por tcpipchip
Se for divisao por 2, tá na mao


Enviado:
22 Jan 2010 09:49
por RobL
Se sua divisão é entre duas variáveis, o caminho é um se for entre uma variável e uma contante o caminho é outro.
Se seu micro tem multiplicação por hardware o caminho é um se não tem o caminho é outro.
Em todos os casos, uso transformar divisão em produto pelo inverso. O valor menor que 1 (do inverso) multiplico por múltiplos de 256 ("ajuste¨) até ficar um inteiro confortável. Faço o produto entre os inteiros e ao final , simplesmente dispenso os bytes equivalentes ao ajuste (com múltiplos de 256). Por exemplo se bastou multiplicar uma vez por 256, ou seja, deslocar um byte a esquerda, simplesmente dispenso o última byte (é o mesmo que dividir por 256)
Dependendo do valor do último byte, se maior que 128 somo 1 ao byte mais baixo do resultado, se menor, simplesmente dispenso.
Creio ser o caminho mais rápido e simples.

Enviado:
22 Jan 2010 10:16
por Andre_Cruz
RobL,
A divisão é entre quatro variáveis, cada duas variaveis forma o numero que eu preciso em 16 bits.
É um PIC 12F675, tem divisão e multiplicação por multiplo de 2, no set de instrução.
Me interessei pelo seu método, tem como você "desenhar" (Detalhar e exemplificar) ?
Agradeço a todos.
Abraço
André

Enviado:
22 Jan 2010 10:49
por vtrx
André,se for oque entendí,voce precisa de rotinas de divisão rápidas?
Tem vários sites sobre isso.
Ve se esse link te ajuda;
http://www.convict.lu/Jeunes/Math/Fast_operations2.htm
http://www.convict.lu/Jeunes/Math/Fast_operations.htm

Enviado:
22 Jan 2010 11:51
por Djalma Toledo Rodrigues
Dividir é saber quantas vezes o Divisor cabe no Dividendo .
10 / 2 =
10 - 2 = 8
8 - 2 = 6
6 - 2 = 4
4 - 2 = 2
2 - 2 = 0
Coube 5 vezes
Lógico que em binário faria Complemento a 2
do Divisor e somaria .
DJ

Enviado:
22 Jan 2010 12:09
por Andre_Cruz
vtrx,
É isso mesmo que eu preciso, rotina de divisão de 16 bits rápida.
Valewww

Enviado:
22 Jan 2010 13:20
por Djalma Toledo Rodrigues
tcpipchip escreveu:Se for divisao por 2, tá na mao

Faço com meu tatatataravô. parto ao meio
----
DJ

Enviado:
22 Jan 2010 14:18
por Andre_Cruz
Djalma,
Infelizmente não é divisão por 2,4,8,16 ...
Valew
Abraço

Enviado:
23 Jan 2010 09:05
por andre_luis
Andre_Cruz escreveu:vtrx,
É isso mesmo que eu preciso, rotina de divisão de 16 bits rápida.
Valewww
Andre,
O algoritmo que voce postou até onde se sabe é o mais rápido mesmo, por ser a única técnica conhecida.
No entanto, esse algorítmo usa uma abordagem determinística. Se usarmos uma abordagem estatística, podemos ter algum ganho.
Voce pode otimizar a performance, se puder fazer uma análise do comportamento do sinal a ser medido, modelando a distribuição dos valores por uma curva, na qual voce possa extrair o desvio-padrão.
Desse modo, sabendo qual é a faixa de valores mais prováveis, voce poderia adaptar a rotina para realizar, não divisoes sucessivas, mas sim aproximações sucessivas, partindo inicialmente de uma das extremidades da curva.
Isso significa, que numa grande quantidade de medições a tendencia seria de um ganho na performance, embora pontualmente isso não fosse garantido.
Mas, naturalmente, cada caso é um caso, e pode ser que isso não atenda á sua necessidade, caso sua rotina não possa exceder um determinado tempo de processamento.
+++
+++

Enviado:
23 Jan 2010 09:50
por Andre_Cruz
andre_teprom,
Realmente é a rotina mais rápida que eu já testei até o momento.
A idéia de usar os valores mais requeridos, uma espécie de memória cache, é boa mas não sei se na prática vai diminuir o tempo de execução da rotina.
Estou pesquizando a familia 18F, e aumentar a frequência de clock de 20 MHz (12F675), para um 18F452 a 40MHz, encontrei um PIC não me lembro agora de cabeça qual é, mas ele efetua a multiplicação por hardware, tem algum que tenha divisão por hardware ?
Com outros microcontroladores ARM, AVR, estou perguntando porque não conheço nem um dos dois uC, citados mas uC é tudo igual só muda a fábrica, a lógica é sempre muito parecida. É possivel efetuar a divisão de duas variaveis de 16 bits, levando de 50uS a 10uS ?
Agradeço a visita e a resposta de todos.
Abraço
André

Enviado:
23 Jan 2010 11:22
por RobL
Se quiser muita rapidez em leitura analógica (tratamento de sinal analógico) e cálculo rápido, de uma olhada nos DSPs.
Esses tem o que você procura, só não sei dizer no seu caso, que iniciou com um PIC12F675 se seria seu foco, mas certamente lhe dará muito mais "alegria".
Os micros são diferentes, mudam o nome : DSP é um micro dedicado a tratamento de sinais analógicos com grande poder de cálculos.
Nota: um micro com multiplicação por hardware fará uma divisão muito mais eficiente que um sem.

Enviado:
23 Jan 2010 13:22
por Andre_Cruz
RobL,
Valew pela dica vou pesquisar sobre os uC DSP.
Abraço
André