TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
28 de Agosto de 2014, 04:04:04

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
347719 Mensajes en 39013 Temas por 40623 Usuarios
Último usuario: luisnaranjo
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Almacén del Assembler (Moderadores: maunix, MGLSOFT, PAOLA09, Suky)
| | |-+  Elevar un numero a x potencia - pic 16f877a
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Marcar como favorito Imprimir
Autor Tema: Elevar un numero a x potencia - pic 16f877a  (Leído 5319 veces)
red_alejo42
PIC10
*
Desconectado Desconectado

Colombia Colombia

Mensajes: 1


« : 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


 
En línea
MLO__
Colaborador
DsPIC33
*****
Desconectado Desconectado

Sexo: Masculino
Colombia Colombia

Mensajes: 4495

MLO


« Respuesta #1 : 24 de Septiembre de 2009, 23:10:17 »

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
En línea

El papel lo aguanta todo
jhozate
Colaborador
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Colombia Colombia

Mensajes: 1514



« Respuesta #2 : 24 de Septiembre de 2009, 23:26:09 »

no esta demas que revises este hilo
saludos
En línea

Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA
isfan
PIC10
*
Desconectado Desconectado

España España

Mensajes: 39


« Respuesta #3 : 01 de Octubre de 2009, 18:28:37 »

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
      
En línea
dnilo3a
PIC10
*
Desconectado Desconectado

Colombia Colombia

Mensajes: 3


« Respuesta #4 : 12 de Octubre de 2009, 15:32:47 »

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
En línea
TODOPIC
   

 En línea
Páginas: [1] Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines XHTML 1.0 válido! CSS válido!
Página creada en 0.297 segundos con 23 consultas.