Página 1 de 1
Multiplicação

Enviado:
03 Ago 2007 13:36
por scheleder
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?

Enviado:
03 Ago 2007 13:46
por chipselect
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...

Enviado:
03 Ago 2007 17:56
por ivan
Dei uma googlada e encontrei este algoritmo para PIC16F628
http://www.restena.lu/convict/Jeunes/Ma ... ations.htm
Espero que sirva pra alguma coisa

Enviado:
03 Ago 2007 18:37
por zielpunkt
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.

Enviado:
04 Ago 2007 08:22
por scheleder
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.

Enviado:
04 Ago 2007 13:08
por chipselect
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.

Enviado:
04 Ago 2007 16:09
por tcpipchip
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