Aunque ya vimos algo sobre el desplazamiento de bits cuando jugamos con el display de 7 segmentos, en la entrada de esta semana vamos a ver todas las operaciones disponibles de desplazamiento y giro de bits en Step7 además de un par de vídeos para ilustrar lo expuesto.
- SHR_I Desplazar entero a la derecha
- SHR_DI Desplazar entero doble a la derecha
- SHL_W Desplazar 16 bits a la izquierda
- SHR_W Desplazar 16 bits a la derecha
- SHL_DW Desplazar 32 bits a la izquierda
- SHR_DW Desplazar 32 bits a la derecha
Además, hay operaciones de rotación:
- ROL_DW Rotar 32 bits a la izquierda
- ROR_DW Rotar 32 bits a la derecha
Desplazan el contenido de ACU1 bit a bit. Son incondicionales, no dependen del RLO. Podemos desplazar, tanto a la derecha como a la izquierda, palabras, doble palabras, enteros y dobles enteros.
En general, lo que se harán en todas las instrucciones es dar la palabra o doble palabra a desplazar y un número de bits a ser desplazado.
Vale. Hasta ahí lo entiendo, pero ¿qué diferencia hay desplazar entero o un word a la derecha?
Básicamente funcionan igual. La diferencia fundamental es que al desplazar los enteros, arrastramos también el signo.
¿Lo qué?
Bien. Además de simplemente arrastrar bits de izquierda a derecha o de derecha a izquierda, esto implicitamente lleva consigo operaciones de multiplicación y división en base 2. Es decir, desplazar a la derecha 1 bit significa dividir entre dos el número que tengamos. La diferencia entre hacerlo con enteros o con words, es que en enteros (SHR_I ) podemos hacer divisiones con signo.
Así si tenemos:
Valor a dividir: MW 102 = 1000 (tanto en entero o decimal)
Desplazar a derecha: MW200 = 1
Si hacemos SHR_I: MW104 = 500 (en entero o en decimal)
Si hacemos SHR_W: MW106 = 500 (en entero o en decimal)
En principio no hay diferencia ¿no?
La cosa es que si ahora hacemos
Valor a dividir: MW 102 = (-1000) ó 64536 en decimal
Desplazar a derecha: MW200 = 1
Si hacemos SHR_I: MW104 = -500 en entero o en 65036 visto en decimal
Si hacemos SHR_W: MW106 = 32268 en entero o 32268 visto en decimal)
Como puedes observar, la diferencia es notable dependiendo de si tenemos un valor entero positivo o no. Análogamente si desplazamos a la izquierda en vez de a la derecha sucederá lo mismo, pero multiplicando en vez de dividiendo... salvo por un pequeño detalle, que sólo existe el SHL_W.
Entiendo que la razón por la que no existe desplazamiento a la izquierda de enteros es porque no tiene sentido ya que no se va a guardar el signo, por lo que no existe tal cosa. Si tuvieramos el último bit con signo menos, lo perderíamos, por lo que de ahí entiendo la inexistencia de dicha operación.
En cualquier caso, la forma de hacerlo en AWL será de la siguiente forma:
L MW 200 -> Cargamos el número de bits a desplazar L MW 102 -> Cargamos la palabra a desplazar SLW --> Operación de desplazamiento (en este caso word a la izquierda) T MW 104 -> Transferimos el resultado a cualquier otra palabra
Análogamente sería con las dobles palabras(SHR_DI, SHL_DW, SHL_DW ). Pero ojo, cuando tenemos los bits bien estirados uno detrás de otro, recordad que en una doble palabra, el bit más a la derecha es el bit .0 del byte bajo de la palabra baja. Es decir, del MD0, el bit más a la derecha será el M3.0, y el más a la izquierda, el bit .7 del byte alto de la palabra alta ... el M0.7.
Y el giro de dobles palabras
El caso de giro de las dobles palabras es más sencillo aún de entender: daremos el número de bits a girar y desplazaremos los bits a la izquierda (por ejemplo). Los bits que quedan fuera por la izquierda, son reintroducidos por la derecha. Si se gira al revés, pues funciona al revés.
Y como es más fácil de entender viéndolo, pues qué mejor que un video que lo muestre.
¿Podrías poner un ejemplo real de desplazamiento y giro de bits en Step7?
Pues sí. De hecho esta entrada es debida a una petición de ayuda. Se trata de un ejemplo de embotelladora. La cosa es arrastrar una señal a lo largo de un camino paso a paso, a modo de tracking.
El problema es el siguiente: detectamos a lo largo de una cinta la presencia o no de las botellas, pero el embotellado no es in situ, sino que se produce como 10 posiciones más adelante. Se trata de arrastrar la información de la fotocélula hasta la posición donde debe ser rellenada la botella.
Pero como siempre, es más fácil de entender viendo el vídeo que con palabras. Así que te dejo con el segundo video de esta semana (hoy ración doble).
Referencias




