Rotina de divisão em ASM

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Rotina de divisão em ASM

Mensagempor Andre_Cruz » 21 Jan 2010 21:11

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é
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor jorgeluiz » 21 Jan 2010 23:53

se essa for a chamada divisao "cardionica", e' sim a mais rapida possivel em ASM.
Avatar do usuário
jorgeluiz
Byte
 
Mensagens: 448
Registrado em: 26 Mar 2007 02:26

Mensagempor Andre_Cruz » 22 Jan 2010 07:51

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
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor tcpipchip » 22 Jan 2010 09:03

Se for divisao por 2, tá na mao :)
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor RobL » 22 Jan 2010 09:49

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.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor Andre_Cruz » 22 Jan 2010 10:16

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é
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor vtrx » 22 Jan 2010 10:49

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
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor Djalma Toledo Rodrigues » 22 Jan 2010 11:51

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
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Andre_Cruz » 22 Jan 2010 12:09

vtrx,

É isso mesmo que eu preciso, rotina de divisão de 16 bits rápida.

Valewww
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor Djalma Toledo Rodrigues » 22 Jan 2010 13:20

tcpipchip escreveu:Se for divisao por 2, tá na mao :)


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

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Andre_Cruz » 22 Jan 2010 14:18

Djalma,

Infelizmente não é divisão por 2,4,8,16 ...

Valew

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor andre_luis » 23 Jan 2010 09:05

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.

+++

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Andre_Cruz » 23 Jan 2010 09:50

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é
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor RobL » 23 Jan 2010 11:22

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.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor Andre_Cruz » 23 Jan 2010 13:22

RobL,

Valew pela dica vou pesquisar sobre os uC DSP.

Abraço

André
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Próximo

Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x