SoloCodigo
Programación Específica => Microcontroladores => Mensaje iniciado por: RJC en Domingo 18 de Junio de 2006, 09:14
-
Necesito multiplicar ADRESH y ADRESL (en realidad solo 10 bites) de este registro, por una constante. alguien sabe com lo puedo hacer?
-
Hola!
Que micro usas? La familia 18F permite la multiplicación por hardware...
Asembler o C?
Cuál es la constante a multiplicar?
En la página de Microchip encontrarás varias notas de aplicación (AN) matemáticas, puedes buscar la que más te convenga...
De todas maneras responde y vemos que se hace.
Saludos
-
Hola, estoy usando pic16f873 y programo en assembler. y estuve leyendo los AN de microchip, pero la verdad es no no entendi mucho.. ojala que puedas ayudarme.. gracias
-
Necesito multiplicar ADRESH y ADRESL (en realidad solo 10 bites) de este registro, por una constante. alguien sabe com lo puedo hacer?
:huh: como sabes la multiplicacion es una suma abreviada, en tu caso quieres multiplicar 10 bits con una constante, o sea que debes sumar el registro el numero de veces de la constante.
voy a buscar una rutina que tengo que hace esto exactamente para posteartela :comp:
saludos :hola:
-
el numero que quiero multiplicar es 0.196 (extraño??) la verdad es k si se puede hacer, un amigo lo hizo pero no lo puedo ubicar ( pk ya esta en su tesis) el me dio una pagina dnde se genera automaticamente la rutina con soo ponerle la cte, pero la probe y no me funciona, es esta, por si les srive http://www.golovchenko.org/cgi-bin/constdivmul (http://www.golovchenko.org/cgi-bin/constdivmul)
el codigo k genera es este
; binaro = binaro * 0.196
; Temp = TEMP
; binaro size = 8 bits
; Error = 0.5 %
; Bytes order = little endian
; Round = no
; ALGORITHM:
; Clear accumulator
; Add input / 8 to accumulator
; Add input / 16 to accumulator
; Add input / 128 to accumulator
; Move accumulator to result
;
; Approximated constant: 0.195312, Error: 0.350765 %
; Input: binaro0, 8 bits
; Output: binaro0, 6 bits
; Code size: 15 instructions
cblock
binaro0
endc
;copy accumulator to temporary
movf binaro0, w
;shift accumulator right 3 times
clrc
rrf binaro0, f
clrc
rrf binaro0, f
clrc
rrf binaro0, f
;add temporary to accumulator
addwf binaro0, f
;shift accumulator right 1 times
rrf binaro0, f
;add temporary to accumulator
addwf binaro0, f
;shift accumulator right 3 times
rrf binaro0, f
clrc
rrf binaro0, f
clrc
rrf binaro0, f
lo prbe con el mplab, y no veo en ninguna parte el resultado de la multiplicacion (le cargo 11111111 al binario0 y deberia dar aprox 200 (en binario por supuesto) y no lo veo (le pongo k lo deje en w) si pueden lo prueban y me dicen ok? gracias
-
No se cuanta precición necesitas, pero fijate que tu constante es 0.196, por 10 es 1.96. Podemos decir que es 2, y si rotamos un registro una posición a la izquierda, lo estamos multiplicando por 2 ;)
En una de esas puedes hacer así, y tienes tu resultado (multiplicado por 10). Todo depende de la exactitud que necesites.
Tal vez puedas compensar tu error luego, por rangos, por ejemplo...
Lo más simple y rápido es progamarlo en C...
Espero haber ayudado, nos cuentas!
Saludos
-
gracias, la rutina k me entrega la pagina estaba bien, fue un error mio, estaba viendo el resultado en otro registr (cosas que pasan) de todas maneras les sirve a todos pk la paina que hace la multiplicacion esta bine buena