Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

05/08/2011 #1

Avatar de DanNeil

Cómo rotar un byte en asm MPLAB y sacar a un puerto
Buenas noches,


He estado tratando de rotar a la derecha un byte: b'11001100' en el PIC16F84A , con la instrucción asm de RRL y no puedo hacer que se vea en el PORTB como yo quiero, ya me sale siempre 87H o a veces cuando añado que al principio del programa cargue b'00000000' el byte en el PORTB, pues se queda así y no más.

Bueno, en fin, quiero que inicie con b'00000000' y al pulsar cargue el dato b'11001100' y luego con el resto de pulsos lo rote a la derecha y veré si se borra o qué.


Este es el assembler:

listp=16f84a
#include<p16f84a.inc>

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;********VARIABLE DEFINITION*************************************
CBLOCK
BYTE
CONT
CONT2
ENDC
;************************************************* **************

ORG 0X00
GOTO INICIO
INICIO
BSF STATUS,5 ;ACCESO BANCO 1
CLRF TRISB ;PORTB ES SALIDA
BSF TRISA,0 ;RA0 ES ENTRADA


BCF STATUS,5 ;VOLVEMOS AL BANCO 0
MOVLW B'11001100' ;
MOVWF BYTE ;BYTE= B'11001100'
MOVLW 0X00 ;PORTB COMIENZA SACANDO 00000000
MOVWF PORTB

PRUEBA_PULSO
BTFSS PORTA,0 ;RA0=1?
GOTO PRUEBA_PULSO ;NO, ESPERA EN "PRUEBA_PULSO"
ESPERA BTFSC PORTA,0 ;SI, ESPERA QUE SE SUELTE EL PULSADOR
GOTO ESPERA ;NO HA SIDO SOLTADO Y ESPERA EN "ESPERA"


RETARDO MOVLW 0XFF ;ELIMINA REBOTE
MOVWF CONT2
CICLO2 MOVLW 0XFF
MOVWF CONT
CICLO DECFSZ CONT,1
GOTO CICLO
DECFSZ CONT2,1
GOTO CICLO2

MOVF BYTE,0 ;
MOVWF PORTB ;MUEVO EL BYTE (B'11001100') A PORTB
RRF BYTE,0 ;LO ROTO A LA DERECHA, CARGO EN W
BCF STATUS,C ;BORRO FLAG DE ACARREO


MOVWF PORTB ;Y QUE EL RESULTADO VUELVA A PORTB A MOSTRAR DESPLAZAMIENTO

GOTO PRUEBA_PULSO ;VUELVO A REVISAR EL PULSO

END





Gracias por su respuesta,
06/08/2011 #2

Avatar de DanNeil

Ya está el problema era, yo creo mucho, un fallo en mover el dato rotado a el puertoB:

RRF BYTE,1 ;LO ROTO A LA DERECHA y lo dejo en el mismo registro

MOVF BYTE,0 ;luego lo paso al registro de trabajo
BCF STATUS,C ;BORRO FLAG DE ACARREO
MOVWF PORTB ;Y QUE EL RESULTADO salga a PORTB a mostrar deplazamiento

GOTO PRUEBA_PULSO ;VUELVO A REVISAR EL PULSO

END ;

Las intrucciones que hubiera querido, fuesen menos, hubieran sido:

RRF BYTE,0 ;LO ROTO A LA DERECHA y lo dejo en W


BCF STATUS,C ;BORRO FLAG DE ACARREO
MOVWF PORTB ;Y QUE EL RESULTADO salga a PORTB a mostrar deplazamiento

GOTO PRUEBA_PULSO ;VUELVO A REVISAR EL PULSO

END ;

Pero, no me salió con eso..

Ahora lo que quiero es hacer un registro de desplazamiento que me mueva la derecha el byte b'11001100'
sin borrarlo.

He visto que si no borro el bit de acarreo, la secuencia es de 1100...1100...1100 y como en el séptimo desplazamiento a derecha, se corrompe el patrón de 11..00 y hay un espacio de tres ceros 1100011.

Bueno creo, que eso es un registro de desplazamiento cíclico llamado "de retroalimentación invertida"
así bien lo del último bit (LSB) se desplaza y aparece en el primero (MSB).

¿Cómo logro eso?, que me cargue el LSB en el MSB? "mover bits", tal vez la instrucción estrella ya no es el RRF.

MSB1........................LSB1
LSB1........................MSB1
y que repita la operación una y otra vez, una instrucción nueva o rutina que ejecute la acción.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.