Autor Tema: Otro problema que me esta rayando.  (Leído 2622 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado misterweb

  • PIC16
  • ***
  • Mensajes: 128
Otro problema que me esta rayando.
« en: 19 de Diciembre de 2017, 18:25:57 »
Hay algo que no entiendo algo que se me pasa o simplemente tengo metida una bruja en mi ordenador:

En el siguiente codigo si el valor registro DIVIDEL le meto un el valor mayor en hexadecimal de 84h por ejemplo  85h hasta FF, hace que la resta  que hace mas adelante.

Código: [Seleccionar]
SUBWF TEMP1,W   ; F - W >  DESTINO WORK   ===  DIVIDENDO - DIVISOR -> WORK.
BTFSC STATUS,N   ; CHEQUEA SI LA RESTA A SIDO NEGATIVA Y SI ES ASI SALTA.
   

STATUS =  Tenga un valor 13 =  10011 los que significa que la resta por ejemplo de :

87 - 5  se segun STATUS  lo considere negativo el resultado y haga que se meta en la instruccion:  bra SALIDA.

Si el valor que metemos a DIVIDEL es 84 o menor no existe ese problema.

Este seria el codigo
Código: ASM
  1. MOVLW 0H
  2.     MOVWF COCIENH
  3.     MOVWF COCIENL
  4.    
  5.     MOVLW 84h
  6.     MOVWF DIVIDEL
  7.  
  8.     MOVLW 3h
  9.     MOVWF DIVIDEH
  10.     MOVLW 5H
  11.     MOVWF DIVISOR
  12.     MOVFF DIVIDEL,TEMP1
  13. LAZO
  14.     MOVF DIVISOR,W
  15.     SUBWF TEMP1,W   ; F - W >  DESTINO WORK   ===  DIVIDENDO - DIVISOR -> WORK.
  16.     BTFSC STATUS,N   ; CHEQUEA SI LA RESTA A SIDO NEGATIVA Y SI ES ASI SALTA.
  17.     BRA SALIDA
  18.  
  19.     MOVWF TEMP1 ; SI LA OPERACION NO HA SIDO CERO METE LA RESTA EN TEMP1
  20.     INCFSZ COCIENL,F  ; INCREMENTA EL COCIENTE.
  21.     BRA LAZO
  22.     CALL INCR_COCIENH
  23.     BRA LAZO    
  24.  
  25. SALIDA
  26.     MOVWF TEMP1 ; GUARDA EL RESULTADO DE WORK EN TEMP1
  27.     DCFSNZ DIVIDEH    ; DECREMENTA LA PARTE ALTA DEL DIVIDENDO Y SI ES CERO NO SALTES
  28.     BRA EXIT
  29.     INCFSZ COCIENL,F  ; INCREMENTA EL COCIENTE.
  30.     BRA LAZO   
  31.     CALL INCR_COCIENH
  32.     BRA LAZO

Me estare volviendo loco...

 Saludos.

Desconectado misterweb

  • PIC16
  • ***
  • Mensajes: 128
Re:Otro problema que me esta rayando.
« Respuesta #1 en: 19 de Diciembre de 2017, 18:49:19 »
Me respondo a mi mismo... acabo de ver el problema, que creo que sea eso:

Si la resta es superior de un numero superior a 127 lo considera negativo:

01111111 = 127   ----   1xxxxxxx  es negativo.

En fin creo que sea ese el problema.

Lo cual complica la cosa bastante.

Saludos.
« Última modificación: 19 de Diciembre de 2017, 18:51:29 por misterweb »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Otro problema que me esta rayando.
« Respuesta #2 en: 19 de Diciembre de 2017, 21:06:46 »
Cuando estamos usando ASM, es bueno dar el PIC cual estas usando, imagino que es uno de la familia PIC18 por la instruccion BRA, aunque veo que no usas los ACCESS/BANK.

Segun el datasheet ( la biblia del ASM ):

Citar
N: Negative bit
This bit is used for signed arithmetic (2’s complement). It indicates whether the result was negative (ALU MSB = 1).

OV: Overflow bit
This bit is used for signed arithmetic (2’s complement). It indicates an overflow of the 7-bit magnitude which causes the sign bit (bit 7 of the result) to change state.

Si tu interes es saber si es mas grande / igual / o mas pequeño de 2 numeros SIN signo, entonces tenes que usar los bits C y Z

- Si W es menor que F, entonces C = 1 (resultado positivo) y Z = 0 (porque no es cero)
- Si W es igual a F, entonces C = 1 (resultado positivo) y Z = 1 (porque es cero)
- Si W es mayor a F, entonces C = 0 y Z = 0

Desconectado misterweb

  • PIC16
  • ***
  • Mensajes: 128
Re:Otro problema que me esta rayando.
« Respuesta #3 en: 21 de Diciembre de 2017, 08:29:13 »
Muchas gracias por la contestacion KILLERJC de nuevo.

En este caso estoy haciendo una subrutina  que haga Dividendo - Divisor
va restando el divisor al dividendo hasta que llegue a cero y cuando lo supere evidentemente sea negativo y aprovechar la bandera N para detectarlo, pero claro no cai que cualquier resultado mayor de 127 lo considera ya negativo.

El caso es cuando empiezo la subrutina  y resta por ejemplo 97h - 05h es mayor de 127   y esto segun simulacion MPLAB me deja el registro estatus en   STATUST = 13h = 10011

O Lo que es lo mismo   N=1   OV=0   Z=0  DC=1 C=1

Una jodienda pero bueno es lo que hay.... aunque evidentemente hay soluciones para todo.

Entre ello jugar con :

- Si W es mayor a F, entonces C = 0 y Z = 0

Como tu dices.

Un saludo.
« Última modificación: 21 de Diciembre de 2017, 09:48:51 por misterweb »

Desconectado misterweb

  • PIC16
  • ***
  • Mensajes: 128
Re:Otro problema que me esta rayando.
« Respuesta #4 en: 21 de Diciembre de 2017, 10:25:32 »
 Ahora si funciona:

Código: ASM
  1. inicio    
  2.  
  3.     MOVLW 0H
  4.     MOVWF COCIENH   ; Parte alta del cocciente
  5.     MOVWF COCIENL   ; Parte baja del cociente
  6.    
  7.     MOVLW 89h       ;
  8.     MOVWF DIVIDEL    
  9.  
  10.     MOVLW 90h
  11.     MOVWF DIVIDEH
  12.  
  13.     MOVLW 5H
  14.     MOVWF DIVISOR
  15.    
  16.     INCF DIVIDEH,F   ; HAY QUE INCREMENTAR LA PARTE ALTA DE DIVIDENDO UNA UNIDAD.
  17.    
  18.     MOVFF DIVIDEL,TEMP1
  19.  
  20. LAZO
  21.     MOVF DIVISOR,W
  22.     SUBWF TEMP1,W  ; F - W >  DESTINO WORK   ===  DIVIDENDO - DIVISOR -> WORK.
  23.     BTFSS STATUS,C  ; CHEQUEA SI LA RESTA A SIDO NEGATIVA Y SI ES ASI SALTA.
  24.     BRA SALIDA
  25.  
  26.     MOVWF TEMP1 ; SI LA OPERACION NO HA SIDO CERO METE LA RESTA EN TEMP1
  27.     INCFSZ COCIENL,F  ; INCREMENTA EL COCIENTE.
  28.     BRA LAZO
  29.     CALL INCR_COCIENH
  30.     BRA LAZO    
  31.  
  32. SALIDA
  33.     MOVWF TEMP1 ; GUARDA EL RESULTADO DE WORK EN TEMP1
  34.     DCFSNZ DIVIDEH    ; DECREMENTA LA PARTE ALTA DEL DIVIDENDO Y SI ES CERO NO SALTES
  35.     BRA EXIT
  36.     INCFSZ COCIENL,F  ; INCREMENTA EL COCIENTE.
  37.     BRA LAZO   
  38.     CALL INCR_COCIENH
  39.     BRA LAZO
  40.    
  41. INCR_COCIENH
  42.     INCF COCIENH
  43.    
  44.     RETURN
  45.        
  46. EXIT   
  47.     NOP
  48.    
  49.     GOTO EXIT
  50.        
  51.     END


molte grazie  .......... saludos.


 

anything