Problema con la instrucción RLF y RRF en PIC 12F683

Buenas a todos!
Soy nuevo en esto y he empezado con el PIC12F683 con el leguaje ensamblador. He cogido este porque era el que tenia :p
Bueno el caso es que estaba haciendo un programa con dos leds que haga que se encienda un led y cuando se apague se encienda el otro y asi sucesivamente.
He utilizado la instruccion RLF para desplazar el bit al otro pin donde tengo conectado el otro led y luego hago un bucle.

El caso es que el pic lo que hace es que pone en el pic 000001 y cuado ejecuta RLF pone todos los pines a 000000 en vez de 000010.
¿Donde esta el problema?
Os dejo el codigo del programa:

Código:
	list      p=12F683        ; list directive to define processor
	#include <p12F683.inc>    ; processor specific variable definitions

	errorlevel  -302          ; suppress message 302 from list file

	__CONFIG   _FCMEN_ON & _IESO_OFF & _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT 





;------------mapa de memoria---------

CONTADOR1 equ 0x20
CONTADOR2 equ 0x21
;------------------------------------
;-----------Oscilador interno--------
bsf STATUS,RP0
call 3FFh
movwf OSCCON;
bcf STATUS,RP0
;------------------------------------



;____________PROGRAMA______________________
;Configuracion de puertos
bsf STATUS,RP0 ;Va al Banco 1
clrf TRISIO ; Pone todos como salida
bcf STATUS,RP0 ; Vuelve al Banco 0
;--------------------------------------
Inicio
movlw 01h
movwf GPIO ; Enciende el led1
call RETARDO
call RETARDO
rlf GPIO,1 ;Apaga el 1º led y enciende el otro: 000100
call RETARDO
call RETARDO

goto Inicio ;Repite el bucle del parpadeo d elos dos led


;___________________________________________




;------------------------------------------
;Retardo subrutina
RETARDO 
MOVLW 25h ; Guardamos el numero de retardo en el registro W
MOVWF CONTADOR1; Lo guardamos en los dos contador
MOVWF CONTADOR2;
;Empieza el 1º retardo
Bucle1
DECFSZ CONTADOR1,1 ; Restamos 1 a 255.
goto Bucle1
MOVWF CONTADOR1;
;Comienza el 2º retardo
DECFSZ CONTADOR2,1
goto Bucle1 ; Volvemos al inicio de nuestro bucle
            ; Este retardo cuenta hacia atrás ...
            ; ...desde 255 a 0, 255 veces.
RETURN

;------------------------------------------
org 0x3FF
retlw 0x20

	end		     ; se acabó
 
No he trabajado con el 12F pero las instrucciones son las mismas que en otro pic
RLF ó RRF sólo salta en un bit , no en dos

pasete por https://www.forosdeelectronica.com/f24/asm-desde-0-asm-desde-cero-16898/ esplica lo siguiente,



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 si el bit C del registro STATUS es 0.

Ejemplo:


Código:
RLF PORTC,FSi 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 si el bit C del registro STATUS es 0.

Ejemplo


Código:
RRF PORTB,FSi 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

Extendiendo la explicación de las instrucciones RRF y RLF

A la hora de utilizar estas dos instrucciones, hay que prestarle atención al bit C del registro STATUS. La razón de esto, es porque la rotación se hace atravéz del bit C.

Supongamos que tenemos lo siguiente:

BIT C = 0
TEMP = B'00010000'

Ejecutamos la instrucción RRF y TEMP vale B'00001000'. O si ejecutamos la instrucción RLF TEMP vale B'00100000'

Pero si ahora tenemos:

BIT C = 1
TEMP = B'00010000'

Ejecutamos la instrucción RRF y TEMP vale B'10001000'. O si ejecutamos la instrucción RLF TEMP vale B'00100001'

Vemos como rota los bit dependiendo del valor del bit C. Pero anteriormente, avíamos dicho que estas dos instrucciones afectan al bit C. La actualización del bit C, lo hace después de la rotación. Lo vemos con un ejemplo:


Código:
MOVLW B'10001001'
MOVWF temp
BCF STATUS,C ;PONEMOS A 0 AL BIT C
RLF temp,F ;ROTAMOS A LA IZQUIERDAAl ejecutar este programa, nos dará lo siguientes resultados:

TEMP = B'00010010'
BIT C = 1

Y para ver la diferencia vemos lo siguiente:


Código:
MOVLW B'00000001'
MOVWF temp
BCF STATUS,C ;PONEMOS A 0 AL BIT C
RLF temp,F ;ROTAMOS A LA IZQUIERDAAl ejecutar este programa, nos dará lo siguientes resultados:

TEMP = B'00000010'
BIT C = 0

Algo que me había olvidado de mencionar pero que MIGSANTIAGO del foro de TODOPIC estuvo atento es que estás dos instrucciones, nos sirve para enviar datos en forma serial utilizando el bit C que lo veremos más adelante.

Recordemos que, para utilizar estas instrucciones para multiplicar o dividir, debemos asegurarnos de que el bit C, esté en 0.

Espero te sirva
 
Si ya sabia que desplazaba un bit, me equivoque al escribirlo en los comentarios.
La cosa es que si escribo el codigo con un pic 16f84 por ejemplo en la simulacion si se desplaza.
En este 12F683 se pone a 0 el registro en vez de desplazar el bit. No se si viene por defecto configurado de alguna forma para que no se desplaze :S . Estuve leyendo el datasheet y no decia nada de estas dos instrucciones salvo la explicacion que vienen en todos los demas pics
Un saludo! :)
 
Lo que pasa es que por defecto GP0-GP4 son entradas analógicas y además el módulo comparador está activado. Para más detalles mira la hoja de datos y si tienes alguna duda pregunta.
 
Atrás
Arriba