RLF
Rota hacia la izquierda los bit de un registro seleccionado por el programador. El destino de la operación se puede elegir. Cada rotación equivale a multiplicar por 2
Ejemplo:
RLF PORTC,F
Si antes de la instrucción PORTC vale B'00001000', después de la instrucción vale B'00010000'. Si se hubiera elegido como destino W, PORTC después de la instrucción continua valiendo B'00001000' y W vale B'00010000'
Para recordar Rotate es rotar Left es izquierda File es el registro.
Afecta a:
- C se pone a 1 si hubo acarreo
RRF
Rota hacia la derecha los bits de un registro seleccionado por el programador. El destino de la operación se puede elegir. Cada rotación equivale a dividir por 2
Ejemplo
RRF PORTB,F
Si antes de la instrucción PORTB vale B'10000000' después de la instrucción PORTB vale B'0100000'. Si se hubiera elegido como destino W, PORTB después de la instrucción continua valiendo B'10000000' y W vale B'01000000'
Para recordar Rotate es rotar Right es derecha File es el registro.
Afecta a:
- C se pone a 1 si hubo acarreo
RLF y RRF no se hacen como mencionas ni son multiplicación por 2 en el caso de los pics.
Caso RLF
Se rotan los 8 bits del byte original a la izquierda. El bit 0 del nuevo byte será el valor que había en la bandera C. El nuevo valor de la bandera C será el valor que había en el bit 7 del byte original.
Caso RRF
Se rotan los 8 bits del byte original a la derecha. El bit 7 del nuevo byte será el valor que había en la bandera C. El nuevo valor de la bandera C será el valor que había en el bit 0 del byte original.
Debes leer mejor las especificaciones del pic, checa la sección Instruction Set del Mid-Range Manual.
Santiago, lamento tener que corregirte, pero es como lo digo. Si hacemos una rotación, corresponde a multiplicar o dividir, pero hay que tener cuidado con su uso, porque si yo roto un bit, supongamos a la izquierda, multiplicamos por 2 y lo guardamos en el registro. Si volvemos a rotarlo a la izquierda, volvemos a multiplicarlo por dos con respecto al registro, pero si lo tomamos desde el valor inicial, será por 4, luego por 8, luego por 16.
El bit C, indica si hay acarreo, por ejemplo:
B'10000000' RLF B'0000000' Lo que pasa aquí, el 1 del bit 7, pasa al carry.
Si hacemos:
B'00000001' RRF B'0000000' Aquí pasa exactamente lo mismo que lo anterior, el bit carry acusa el acarreo.
Si quiero multiplicar con estas instrucciones, lo que tengo que hacer, es trabajar con dos registros. O sea, dos multiplicaciones de 8 bit, dan como resultado otro de 16 bit. Por lo tanto, roto a la izquierda el registro, luego chequeo el bit C del registro STATUS, si hubo acarreo, le pongo a 1 al segundo registro que nos dará el resultado que corresponda al mas significativo.
Supongamos que, tenemos estos registros declarados RESAL (resultado más significativo), RESBA (resultado menos significativo)
Arrancamos con los dos registros en cero, luego cargamos B'10000000' a RESBA y ejecutamos la instrucción RLF. RESBA pasará con el valor B'00000000' pero aquí, hubo acarreo y entónces tenemos que poner a 1 el bit menos significativo del registro RESAL.
Si bien el bit del registro STATUS es legible y escribible, cuando se ejecuta la instrucción RRF o RLF este bit se actualiza según corresponda ya que estos dos instrucciones, afectan al dicho bit. En lo que si tienes razón y algo que me olvidé de comentar, es que según como setee al bit C, afectará al resultado, ya que, si en el registro RES tenemos B'00000001' si ajusto al bit C en 1 y ejecuto la instrucción RRF RES vale B'10000000', pero si ajustamos al bit C en 0 y ejecutamos la instrucción RRF RES vale B'00000000' e inmediatamente el bit C se pone a 1 automáticamente.