Autor Tema: Operación con bits  (Leído 1813 veces)

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

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Operación con bits
« en: 14 de Abril de 2017, 10:54:40 »
Saludos tengo  un problema, necesito intercambiar los bits de la lectura de un puerto
var=A7 A6 A5 A4 A3 A2 A1 A0 y quiero obtener
       A0 A1 A2 A3 A4 A5 A6 A7  para luego
       0   0   0   0    A0 A1 A2 A3

Seria invertir y desplazar.

Sé que con un:
Código: C
  1. temp = input_a();
  2. if (bit_test(temp,0)) bit_set(var,7)
  3. ...

funciona, pero es un poco lento  y necesito optimizar ese paso ya que eso lo hago en la interrupción ext.
¿alguna idea?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Operación con bits
« Respuesta #1 en: 14 de Abril de 2017, 16:56:39 »
Conozco dos formas de lograr lo que te propones, la primera es como vos lo hiciste. Y no veo que sea lenta.

La primera... es esta, Para que hacerlo completo (Hasta al A7), si luego lo haces 0, entonces podemos hacerlo hasta el A3 nomas?
Código: C
  1. temp = input_a();
  2. var = 0;
  3. if (bit_test(temp,0)) bit_set(var,3);
  4. if (bit_test(temp,1)) bit_set(var,2);
  5. if (bit_test(temp,2)) bit_set(var,1);
  6. if (bit_test(temp,3)) bit_set(var,0);

La otra forma que conozco es aprovechar el bit Carry del micro, pero que en C esto no se puede aprovechar. Asi que de hacerlo tiene que ser en ASM, el "costo" computacional es el mismo que el caso anterior. El costo computacional de lo anterior si el compilador optimiza correctamente deberia ser de 10 ciclos de reloj ( constantes ).

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:Operación con bits
« Respuesta #2 en: 14 de Abril de 2017, 18:07:18 »
...

Bueno es que lo hago en la interrupción ext ( y se debe hacer muchas veces, 10 a 15 veces) y cada interrupcion es alrededor de  cada 100 ms, y lo estaba haciendo con RTOS,  pero ya lo hice en un programa sencillo...  y ahora si es mas rápido.

Me puedes decir por favor como sabes cuantos ciclos consume.


Gracias por responder.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Operación con bits
« Respuesta #3 en: 14 de Abril de 2017, 21:20:49 »
Me puedes decir por favor como sabes cuantos ciclos consume.

En mi mente, realizado con ASM seria:

Código: ASM
  1. MOVF PORTA, W ; 1 ciclo
  2. MOVWF TEMP ; 1 ciclo
  3. CLRF VAR ; 1 ciclo
  4. BTFSS PORTA,0  ; 1 ciclo si es 1, sino 2 ciclos si salta
  5. BSF VAR,3 ; 1 ciclo
  6. BTFSS PORTA,1  ; 1 ciclo si es 1, sino 2 ciclos si salta
  7. BSF VAR,2 ; 1 ciclo
  8. BTFSS PORTA,2  ; 1 ciclo si es 1, sino 2 ciclos si salta
  9. BSF VAR,1 ; 1 ciclo
  10. BTFSS PORTA,3  ; 1 ciclo si es 1, sino 2 ciclos si salta
  11. BSF VAR,0 ; 1 ciclo

o la segunda forma (que decia solo en ASM):

Código: ASM
  1. CLRF VAR ; 1 ciclo
  2. RRF PORTA,W ; 1 ciclo
  3. MOVWF TEMP ; 1 ciclo
  4. RLF VAR,F ; 1 ciclo
  5. RRF PORTA,F  ; 1 ciclo
  6. RLF VAR,F ; 1 ciclo
  7. RRF PORTA,F  ; 1 ciclo
  8. RLF VAR,F ; 1 ciclo
  9. RRF PORTA,F  ; 1 ciclo
  10. RLF VAR,F ; 1 ciclo
  11. RRF PORTA,F  ; 1 ciclo
  12. RLF VAR,F ; 1 ciclo

Por cada bit son 2 ciclos minimos si es que el compilador hace bien su trabajo optimizando. son 4 bits asi que son 8 ciclos, + 3 ciclos de antes son 11 ciclos (Antes habia dicho 10, un error mio).

Si podes simularlo ( al menos en XC8 puedo hacerlo ) podes poner 2 breakpoints y saber cuantos ciclos ocupa ese codigo. No se si en CCS podrias. Sino podrias ver el ASM o .hex generado y detectar el codigo que lo realiza para saber exactamente cuantas instrucciones usa el compilador para realizar lo que le pedis.
« Última modificación: 14 de Abril de 2017, 21:25:44 por KILLERJC »

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:Operación con bits
« Respuesta #4 en: 15 de Abril de 2017, 00:49:22 »
.....

Muchas gracias, ahora la cosa es mas clara.

Desconectado colotron

  • PIC12
  • **
  • Mensajes: 73
    • Canal de YouTube
Re:Operación con bits
« Respuesta #5 en: 15 de Abril de 2017, 08:45:24 »
Y con swap?, (swapf en assembler).
Ah no... intercambia nibbles pero no altera sentido creciente/decreciente de los bits.
Si... a rotar se ha dicho.

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Re:Operación con bits
« Respuesta #6 en: 16 de Abril de 2017, 14:52:35 »
Y con swap?, (swapf en assembler)....

Esa función intercambia bit, pero no el orden. por ejemplo:
Código: C
  1. var=11110000;
  2. swap(var);
  3. var= 00001111;

Bueno, eso es lo conozco de CCS