TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: red_alejo42 en 24 de Septiembre de 2009, 13:28:36
-
Hola señores, soy nuevo en este tema de programación de micro-controladores, tengo que hacer un programa que multiplique o divida o eleve a la potencia dos números de acuerdo a unas condiciones iniciales.
El problema es con el elevar un x número a una x potencia, he intentado hacerlo con multiplicaciones sucesivas, es decri muchas sumas decisivas, pero no me funciona en todos los casos; la potencia en el programa siempre se hara si los dos números son iguales y son distintos a cero, cuando los numeros son 1 y 2, me da bien pero en números mayores como 3 y 4 no, así que por favor les pido que me oriente un poco en este apartado, tal vez estoy fallando en el número de veces que se debe multiplicar, es decir el conteo del exponente.
Esta es la parte del programa que me efectúa la potencia
POTENCIA CLRF CONTADOR
INCF EXPONENTE, 1
MOVF NUM1, 0
SUBWF EXPONENTE, 0
BTFSC STATUS, Z
GOTO OK
GOTO POT_2
OK MOVF NUM2, 0
MOVWF PORTC
GOTO LECTURA
POT_2 INCF CONTADOR, 1
MOVF NUM1, 0
SUBWF CONTADOR, 0
BTFSC STATUS, Z
GOTO POTENCIA
MOVF NUM1, 0
ADDWF NUM2, 1
GOTO POT_2
Exponente y contador están previamente definidos como 0x00
-
Bueno, yo de ASM no se mucho y lo poco que sabia ya se me olvido, pero ... si el numero crece, no te va a alcanzar en un registro de 8 bits y si crece mas pues tocaría en uno de unos 16 bits o 32 bits. Si estas contemplando esos desbordes?
Saludos
-
no esta demas que revises este (http://www.todopic.com.ar/foros/index.php?topic=23812.0) hilo
saludos
-
Hola aqui te mando el programa que hice en un ratillo, lo he probado y me funciona bien espero que te sirva
otra cosa como sabes los registros son de 8 bits y solo puede contar de 0 a 255 (0 - FF)
es decir no puedes elevar max 7 porque 8 ya se te pone en 256 y pondria el registro RESU a 00
Si quieres subir por ejemplo a 9 o algo mas tendria que poner un señalizador en RESU por ejemplo y cada vez que diera 0 ir incrementando en un registro contador
y multiplicando eso tendria el valor pero a ser un valor expotencian, no creo que tenga muchos recursos con las cifras tan elevadas que necesitas.
Puede depurar este programa con menos líneas de código, y podria poner una especie de señalizador
; programa para elevar un numero por si mismo
; version puramente beta
LIST P = 16F877 ;indica tipo de micro
INCLUDE "P16F877.INC" ; librerias incluidas
NUMERO1 EQU 0X20 ; Numero a elevar
TMP_1 EQU 0X21 ; Registro para operaciones temporal 1
TMP_2 EQU 0X22 ; Registo para operaciones temporal 2
RESU EQU 0X23 ; Resultado de la operacion final
ORG 0x00
goto inicio ;vector de interrupcion
ORG 0X05
inicio
movlw 0x07
movwf NUMERO1 ;Aqui va el numero que vamos a elevar el 7 por ejemplo
movwf TMP_1 ;copiamos el Numero al registro TMP_1
movwf TMP_2 ;copiamos el numero al registro TMP_2
recarga
movwf TMP_1
bucle
incf RESU ;incrementamos en 1 el registro RESU
decf TMP_1 ; y decrementamos en 1 el registro TMP_1
btfss STATUS,Z ; registro TMP = 0 ?
goto bucle ; si no es igual a 0 nos metemos en el bucle
decf TMP_2 ; es 0 ahora decrementamos TMP_2 y preguntamos si TMP_2 = 0
btfss STATUS,Z
goto recarga ;si no es igual a 0 nos vamos a la rutina de recarga y recargaremos en registro TMR_1
END
-
hola , segun la prueba de escritorio no me da la potenciacion , el resultado me da una multiplicacion , lo simule en proteus y sip es una multiplicacion .
Alquien me puede colaborar con el codigo de una potenciacion
Gracias