Multiplicação

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Multiplicação

Mensagempor scheleder » 03 Ago 2007 13:36

Estou projetando um reticador com 12f675 que dispara dois scrs e para corrigir o angulo de disparo preciso elevar ao quadrado a diferença entre dois valores: o valor ideal (target) e o valor lido pelo A/D.

Existe alguma forma de multiplicar dois numeros em assembly?
[]'s
João Scheleder Neto
scheleder
Nibble
 
Mensagens: 50
Registrado em: 23 Jan 2007 15:57
Localização: Colombo/PR

Mensagempor chipselect » 03 Ago 2007 13:46

o algoritmo mais simples que existe e o mais fácil de entender é o de soma.

Considere A x B, você inicia a resposta com zero, e repete B vezes a soma da resposta com o valor A. No final tem o equivalente a A x B.

Processo lento, pode-se (deve-se) otimizar, utilizando deslocamento de bits conjugado com operações de somas, por exemplo.

Isso é só a idéia inicial do algoritmo, existem muitos detalhes como por exemplo, multiplicar dois bytes gera um resultado de 16 bits, tem que tomar cuidado caso os números sejam sinalizados, etc...
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor ivan » 03 Ago 2007 17:56

Dei uma googlada e encontrei este algoritmo para PIC16F628
http://www.restena.lu/convict/Jeunes/Ma ... ations.htm

Espero que sirva pra alguma coisa
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor zielpunkt » 03 Ago 2007 18:37

Essa rotina foi obtida no piclist.com (http://www.piclist.com/techref/microchip/math/mul/8x8.htm), onde se pode encontrar muita coisa legal e útil sobre PIC:

Código: Selecionar todos
; from Andrew Warren
; Enter with multiplier in W-Reg, multiplicand in "PRODLO".
; Exits with product in PRODHI:PRODLO.

   MPY8X8:

   CLRF PRODHI

   CLRF COUNT
   BSF COUNT,3

   RRF PRODLO

   LOOP:

   SKPNC
   ADDWF PRODHI
   
   RRF PRODHI
   RRF PRODLO

   DECFSZ COUNT
   GOTO LOOP


Têm outras, por lá. Abço.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor scheleder » 04 Ago 2007 08:22

Esta maneira de atribuir um valor x a uma variavel e ir somando y (x vezes) funciona. mas já imaginaram quando tiver que multiplicar 240 por 250 (ou algo parecido)? vou perder muito tempo nesta rotina.

Essa opção do ivan eh bem interessante, vou dar uma olhada.

Obrigado a todos pelo tempo dispensado.
[]'s
João Scheleder Neto
scheleder
Nibble
 
Mensagens: 50
Registrado em: 23 Jan 2007 15:57
Localização: Colombo/PR

Mensagempor chipselect » 04 Ago 2007 13:08

sim, é lento, por isso precisa otimizar usando deslocamento de registros, conforme mencionado.

Observe que as soluções apresentadas usam isso.

RRF não é rotação ou deslocamento de registros?

Cada vez que se desloca um registro em um bit, isso é equivalente a multiplicar/dividir o valor do registro por 2, depende só da direção em que o registro é rotacionado.
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor tcpipchip » 04 Ago 2007 16:09

Eu fiz um programa no CHFLASH em BASIC para ti...

PIC 16F877A
FREQ 4
OSCILLATOR CRYSTAL
BYTE a

a = a * a

Abaixo o codigo que ele gerou...

Espero que te ajude...

TCPIPCHIP

LIST P= 12F675
INCLUDE "P12F675.INC"
RADIX DEC
ORG 0X0000
CLRF STATUS
GOTO PROGRAM_START
AUX1_H EQU 0X20
AUX1_L EQU 0X21
AUX2_H EQU 0X22
AUX2_L EQU 0X23
AUX EQU 0X24
S0 EQU 0X25
S1 EQU 0X26
A EQU 0X27
MULU8
BCF STATUS, RP0
CLRF AUX1_H
MOVLW 0X08
MOVWF AUX2_H
MULU8_LOOP
BCF STATUS, C
BTFSS AUX1_L, 0
GOTO MULU8_SHIFT
MOVF AUX, W
ADDWF AUX1_H, F
MULU8_SHIFT
RRF AUX1_H, F
RRF AUX1_L, F
DECFSZ AUX2_H, F
GOTO MULU8_LOOP
MOVF AUX1_L, W
RETURN
PROGRAM_START
;
MOVF A, W
MOVWF S1
MOVF A, W
MOVWF AUX
MOVF S1, W
MOVWF AUX1_L
CALL MULU8
BCF STATUS, RP0
MOVWF A
END
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!


Voltar para PIC

Quem está online

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

cron

x