5 votos

¿Cuál es la manera más efectiva para guardar/restaurar una foto bit de estado

Quiero guardar/restaurar el PIC a llevar poco. Estoy usando el 16F628A.

SAVE_CARRY
    btfss STATUS, 0
    goto CARRY_OFF 

CARRY_ON
    bsf carry, 0
    return

CARRY_OFF
   bcf carry, 0
   return

RESTORE_CARRY
   btfss carry, 0
   goto RESTORE_CARRY_OFF

RESTORE_CARRY_ON
   bsf STATUS, 0
   return

RESTORE_CARRY_OFF
   bcf STATUS, 0
   return

Debe haber una mejor manera. Es allí?

5voto

John Puntos 453

Una manera de que usted puede hacer:

SAVE_CARRY:
    bsf    carry, 0
    btfss  status, c
    bcf    carry, 0
    return

RESTORE_CARRY
    bsf    status, c
    btfss  carry, 0
    bcf    status, c
    return

Si usted necesita para guardar los registros de la "W" y "Estado", antes de ejecutar un código de interrupción, no hay otra forma:

Save_Context:
    movwf w_temp
    swapf status,w
    movwf status_temp
    ;Your interrupt code here. 

Restore_Context:
    swapf status_temp,w
    movwf status
    swapf w_temp,f
    swapf w_temp,w
    retfie

3voto

Alex Andronov Puntos 178

Si usted quiere guardar/restaurar la llevan a poco, y si no te importa perder el valor cuando la guarda y desbaratando el valor guardado cuando la restaure, sólo tiene que utilizar "rlf saved_carry,f" para guardarlo y "frr saved_carry,f" para restaurarlo. No hay otros registros o flags afectados.

Si la velocidad es de suma importancia y que usted necesita para guardar/establecer algunos otros poco y restaurar más adelante (por ejemplo, RP0), puedes hacer algo como:

Int_Entry:
 btfss STATUS,RP0
 goto Version_with_RP0_clear
 bcf STATUS,RP0
do_interrupt_logic
 bsf STATUS,RP0
retfie
Int_with_RP0_Clear:
do_interrupt_logic
 bcf STATUS,RP0 ; Si la interrupción de la lógica podría haber dejado conjunto
retfie

Eso es un total de cuatro ciclos, no sólo para salvar/restaurar RP0, sino que también puso a un estado conocido para el ISR (si la rama es tomado, RP0 ya está en el estado correcto así que no hay necesidad de establecer). Si la interrupción de la lógica de no afectar a W u otros indicadores (por ejemplo, si se utiliza bsf/bcf/btfss/btfsc/incfsz/decfsz para casi todo), esta lógica puede guardar cuatro ciclos versus ahorro de W y el estado, limpieza de estado, la ejecución de la interrupción y, a continuación, restaurar el estado y W. estos ahorros no son importantes en un montón de casos, pero puede ser muy importante si uno está tratando, por ejemplo, el uso de un TMR2 interrumpir para hacer algo cada 50 ciclos. Desde TMR2IF está en los bancos de registro, uno tiene que quitar RP0 para restablecer TMR2IF. Si TMR2 se detiene cada 50 ciclos y el ISR tomaría 26 de ciclos con la mejora o 30 ciclos sin que, salvando las tres ciclos en el ISR podría aumentar la línea principal de la disponibilidad de la CPU en un 20%.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X