Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: carmeloxxx en 09 de Octubre de 2017, 19:12:58
Título: Como hacer Un Desplamiento lógico a la derecha
Publicado por: carmeloxxx en 09 de Octubre de 2017, 19:12:58
Ando buscando ayuda para hacer un desplazamiento lógico a la derecha el cual debería hacer... Que cada vez que entre un 1 o 0 al un pin el me lo valla guardando en un registro
Título: Re:Como hacer Un Desplamiento lógico a la derecha
Publicado por: KILLERJC en 09 de Octubre de 2017, 20:13:35
Para eso aprovechas el bit de Carry, el cual cuando rotas ese bit se lleva al registro. Un codigo simple de entender (paso a paso) seria este:
Código: ASM
TOMAR_DATOS_PIN:
MOVLW 0x08
MOVWF CONTADOR
CLRF RESULTADO
LOOP:
BTFSC PORTx, J
GOTO ESTA_EN_UNO
ESTA_EN_CERO:
BCF STATUS, C
GOTO FIN_LOOP
ESTA_EN_UNO:
BSF STATUS, C
FIN_LOOP:
RRF RESULTADO, F
DECFSZ CONTADOR, F
GOTO LOOP:
RETURN
Primero tomo un contador, es decir que se repita por cada 1 de los bits, despues segun si esta en 1 o en 0, activo o desactivo el bit Carry, Luego roto.
Suponete que en el pin llegan estos valores 0, 1, 1, 0, 1, 1, 1 y 0.
El registro y el carry quedarian asi: C RESULTADO x 0000 0000 , incial 0 0000 0000 , luego de rotar una ves 0 1000 0000 , luego de cargar el bit de carry y rotar queda asi. 0 1100 0000 , 3er rotacion
Etc
Por supuesto esta es la version didactica :P
Consideraciones del codigo anterior:
- Se toma una muestra cada muy pocos microsegundos, que son las instrucciones, si queres tomar muestras cada 10ms por ejemplo, mejor usar un timer y que al ocurrir la interrupcion girar el registro. - El resultado va a parar a 1 solo registro, Podrias usar los registros FSR para poder llenar varios registros de forma mas simple.
Otra forma de "testear" el bit, es aprovechando que usamos el bit de Carry, Entonces le aplico una mascara y dejo solo el bit que necesito. Luego uso ADDLW que es una instruccion que me actualiza el flag de Carry, si le sumo 0xFF, eso quiere decir que si cualquier bit es 1 el Carry va a ser 1. Y si es 0 el resultado va a ser 0xFF es decir el Carry es 0. Luego Rotamos
Código: ASM
TOMAR_DATOS_PIN:
CLRF RESULTADO
MOVLW 0x08
MOVWF CONTADOR
LOOP:
MOVF PORTx, W
ANDLW 0x10; Aca aplico una mascara, si me interesa el bit 4, por ejemplo es 0x10, si es el bit 7, es 0x80