Autor Tema: Como hacer Un Desplamiento lógico a la derecha  (Leído 46 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado carmeloxxx

  • PIC10
  • *
  • Mensajes: 1
Como hacer Un Desplamiento lógico a la derecha
« 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6050
Re:Como hacer Un Desplamiento lógico a la derecha
« Respuesta #1 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
  1. TOMAR_DATOS_PIN:
  2.       MOVLW 0x08
  3.       MOVWF CONTADOR
  4.       CLRF   RESULTADO
  5. LOOP:    
  6.       BTFSC PORTx, J
  7.       GOTO  ESTA_EN_UNO
  8.  
  9. ESTA_EN_CERO:
  10.       BCF     STATUS, C
  11.       GOTO  FIN_LOOP
  12.  
  13. ESTA_EN_UNO:
  14.       BSF     STATUS, C
  15.  
  16. FIN_LOOP:
  17.       RRF     RESULTADO, F
  18.       DECFSZ CONTADOR, F
  19.       GOTO  LOOP:
  20.       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
  1. TOMAR_DATOS_PIN:
  2.            CLRF  RESULTADO
  3.            MOVLW 0x08
  4.            MOVWF CONTADOR
  5. LOOP:
  6.            MOVF  PORTx, W
  7.            ANDLW 0x10                  ; Aca aplico una mascara, si me interesa el bit 4, por ejemplo es 0x10, si es el bit 7, es 0x80
  8.            ADDLW 0xFF
  9.            RRF   RESULTADO, F
  10.            DECFSZ CONTADOR, F
  11.            GOTO LOOP
  12.            RETURN
« Última modificación: 09 de Octubre de 2017, 20:20:20 por KILLERJC »


 

anything