Cómo utilizar ANDWF en el lenguaje de ensamblaje PIC18fxxxx de Microchip

0

IDIOMA DE MONTAJE MPLAB PIC18f2550

Estoy intentando "AND" 2 Variables "Si Variable_1 = 0 AND Variable_2 = 1 entonces" "HACER LO QUE SE NECESITA". "End If"

Este abajo no tiene sentido como una función lógica "AND". ¿Funcionará la DECLARACIÓN anterior utilizando ANDWF o ANDLW? ¿Necesito ANDWF para cada variable por separado, o es posible usar otra cosa?

ANDWF f, d Lógica Y entre el contenido de un registro W con el contenido de un registro de archivo 'f'. Si d es 0, el resultado se almacena en el registro W, si d es 1, el resultado se almacena nuevamente en el registro de archivos 'f'. Operación: (W) .Y. (f) ® destino Descripción: Y el registro W con el registro 'f'. Si 'd' es 0, el resultado se almacena en el registro W. Si 'd' es 1, el resultado se almacena de nuevo en el registro 'f'.

He leído la hoja de datos PIC18f2550 y la familia PIC18 Manual de referencia y mirado en todo el internet y Stackexchange. Simplemente no he encontrado una respuesta comprensible. Si "ANDWF & ANDLW" son realmente "AND" Funciones

IDIOMA DE MONTAJE MPLAB PIC18f2550

    
pregunta user66377

3 respuestas

1

El IF , AND , THEN y END IF en su código son declaraciones que afectan el flujo del programa, no operadores matemáticos.

El PIC18F2550 tiene una instrucción CPFSEQ (compare w con f, omita la siguiente instrucción si es igual) que puede usarse para implementar la función AND en su ejemplo, como este: -

_if:
  MOVLW  0
  CPFSEQ Variable_1  ; IF Variable_1 = 0  
  GOTO   _endif      
  MOVLW  1
  CPFSEQ Variable_2  ; AND variable_2 = 1 
  GOTO   _endif      
  .
  .                  ; THEN do what is needed       
  .
_endif:

Nota: este código solo muestra el principio y puede que no sea el más eficiente (por ejemplo, usar TSTFSZ Variable_1 y BRA _endif sería más rápido y más compacto).

    
respondido por el Bruce Abbott
0

Son instrucciones AND de poco a poco, mientras que si estoy leyendo tu pregunta correctamente, estás esperando un AND lógico.

En estas instrucciones AND de bit a bit, cada uno de los 8 bits de un operando se edita AND AND individualmente con los bits apropiados del otro operando y el resultado se almacena donde se especifique.

Entonces, por ejemplo, si su registro W contiene 0x23 y ejecuta ANDLW 0x12, terminará con 0x02 en W.

0x23   == 0b00100011  
0x12   == 0b00010010  
AND-ed == 0b00000010  
    
respondido por el brhans
0

Después de trabajar con el CPFSEQ descubrí que mi pregunta era  En realidad más fácil que la pregunta que necesitaba hacer!

El problema real resultó ser una combinación Y un problema OO.

Si var_1 = 0 AND var_2 = 0 entonces GOTO Loop ..... Si var_1 > 0 O var_2 > 1 luego GOTO Continuar.

Puede que no sea el más eficiente pero funciona.

Principal:

MOVLW b'00000000 '

 MOVWF    RxCount              ;Start Count at Zero

Loop:

MOVLW b'00000000 '..... Establecer RxRegister en Cero Normalmente los cambios en

Programa de rutina.

MOVWF RxRegister

nop ....; Agregado porque el siguiente MOVWF tenía un

número > 0, no funcionó bien.

MOVLW b'00000000 '

CPFSGT RxCount ....; if RxCount = Zero goto "If_Or_And" O de lo contrario GOTO Continuar

GOTO If_Or_And

Continuar

INCF       RxCount

CALL      Other_Routines      ;Get RxRegister Data

        GOTO     Loop 

If_Or_And:

TSTFSZ  RxRegister            ;if RxRegister > Zero then GOTO Continue: 

GOTO    Continue              ;if RxRegister = Zero then GOTO Loop: 

GOTO    Loop    
    
respondido por el user66377

Lea otras preguntas en las etiquetas