TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: carlyvalente en 24 de Noviembre de 2005, 07:59:00
-
Como divido una variable en 2 y la guardo en otra variable? Es facil pero no lo logro.
movlw .66
movwf variable1
movlw variable1 / 2
movwf variable2
O como se hace?
Se me quemaron los papeles...
-
HOLA PUES CUANDO QUIERO DIVIDIR NORMALMENTE HAGO RESTAS SUCESIVA ES DECIR EN UNA VARIABLE TIENES EL DATOEL CUAL QUIERES DIVIDIR Y EN OTRA EL 2 O EL DIVISOR SEGUN SEA EL CASO. EMPIEZAS A RESTAR Y VAS CONTANDO CUANTAS VECES PUEDES HACERLO HASTA QUE TU VARIABLES SEA MENOR QUE EL DIVISOR, EL VALOR QUE NUEVO EN LA VARIABLE CORRESPONDE AL RESIDUO Y EL VALOR DEL CONTADOR ES EL RESULTADO DE LA DIVISION.
CUALQUIER COSA AVISAME, POR SI NO ME ENTENDISTE.
-
No entiendo bien tu pregunta, quieres dividir un valor entre 2 (p.e. 66/2=33) te refieres a eso o a dividir una variable entre otra variable??
En todo caso para dividir un numero entre 2 es facil, solo jay que hacer un corrimiento a la derecha y listo:
rrf variable1, w ; lo divide entre 2
Si lo quieres dividir entre multiplos de 2 es asi de sencillo, pero dividirlo entre otros numero hay que hacer un pequeño algoritmo basado en restas para lograr la division.
No se si es lo que necesitas, pero tienes que explicar mejor tu problema...
Nos vemos
-
Exactamente. Es solamente dividir un número entero en 2. Pero es que lo hacía :
movlw variableA /2
movwf variableB
y con el MPLAB me daba cualquier resultado, bueno.... es más... siempre me daba 0x10 cuando debía darme 0x21 (33 en decimal)
Así que rotándolo 1 vez a la derecha obtengo la división en 2?
Joya, bien sencillo.
Chas gracias
-
y rotando uno a la izquierda se multiplica por 2, es curioso esto de los numeros binarios jejeje
un saludo
cchhaa
-
Un poco para aclararte, en Asembler no hay un comando de division (a menos que lo tenga implementado en harware) tambien depende mucho de que micro sea, pues un 16F84 solo tiene para sumar y restar, en cambio un 18F2550 tiene para multplicar tambien, por ello no puede hacer:
movlw variableA /2 ; aca no te va a reconocer el /2 mas bien confundes a la maq
; y te va a botar cualquier cosa
movwf variableB
lo mejor seria hacer lo siguiente:
rrf variableA,w ; rota a la derecha la variableA
movwf variableB ; lo guarda en la variableB
Por ejemplo: si variableA=10001111 (143) despues de la division (rotarlo a la derecha) acaba asi variableB=01000111 (71) como te podras dar cuenta no dara el cociente entero de la division entre 2.
Por otro lado el movlw carga valores constantes o literales no carga variables como variableA, para cargar variables esta el movf.
Bueno, espero haberte aclarado mas las cosas. Un abrazo
-
Sólo veo un error:
rrf variableA,w ; rota a la derecha la variableA
movwf variableB ; lo guarda en la variableB
Si lo rotamos en w veces sería 0 veces. Lo he probado y no rota.
en cambio:
rrf variableA,1 ; rota a la derecha la variableA
movf variableA, w
movwf variableB ; lo guarda en la variableB
así si. Es correcto?
EDITO para agregar una cosita: hacer bcf STATUS,C si se van a realizar operaciones aritméticas sucesivas con el rrf , ya que sino se arma un bolonqui que no veas
-
Escrito originalmente por carlyvalente
Sólo veo un error:
rrf variableA,w ; rota a la derecha la variableA
movwf variableB ; lo guarda en la variableB
Si lo rotamos en w veces sería 0 veces. Lo he probado y no rota.
en cambio:
rrf variableA,1 ; rota a la derecha la variableA
movf variableA, w
movwf variableB ; lo guarda en la variableB
así si. Es correcto?
vamos a ver, segun creo....
w=0 y f=1 por lo que despues de rrf variableA, X << aqui si pones w es igual que si pones un 0 y si pones una f es igual que si pones 1
la unica diferencia es que si pones una w o un 0 el resultado de rotar se guardara en el resgistro w
y si pones una f o un 1 se guardara en el mismo registro que estas rotando, por lo que veo raro que no te funcione el premier codigo, lo has simulado para ver que cambios tienen los registros afectados?
solo se me ocurre que pongas la W en mayusculas a ver
un saludo
cchhaa
-
En mayúsculas ha cambiado la cosa. Así sí rula.
-
HOLA PUES CUANDO QUIERO DIVIDIR NORMALMENTE HAGO RESTAS SUCESIVA ES DECIR EN UNA VARIABLE TIENES EL DATOEL CUAL QUIERES DIVIDIR Y EN OTRA EL 2 O EL DIVISOR SEGUN SEA EL CASO. EMPIEZAS A RESTAR Y VAS CONTANDO CUANTAS VECES PUEDES HACERLO HASTA QUE TU VARIABLES SEA MENOR QUE EL DIVISOR, EL VALOR QUE NUEVO EN LA VARIABLE CORRESPONDE AL RESIDUO Y EL VALOR DEL CONTADOR ES EL RESULTADO DE LA DIVISION.
CUALQUIER COSA AVISAME, POR SI NO ME ENTENDISTE.
Hola Paola...pero como puedo saber que mi variable es menor que el divisor? Que comando usas? (pensando en el set de instrucciones del PIC 16F628A por ejemplo)