Autor Tema: ayuda hi-tect parte alta y baja de un byte  (Leído 3954 veces)

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

Desconectado puenteroto

  • PIC10
  • *
  • Mensajes: 4
ayuda hi-tect parte alta y baja de un byte
« en: 31 de Octubre de 2011, 17:12:45 »
Buenas.
Tengo pobremas para poder entender el uso de "<<" en picc de hi-tech, en realidad con C
necesito que me puedan explicar para poder continuar con lo que estoy tratando de hacer que es obtener la parte baja y alta de un byte(8bit), no de una word(2byte)
por ejemplo

numb=0xAF

como obtener n = numb.high   resultando n = A
                     m= numb.low   resultando n = F

para pasar por un select

....
case 0xA
    .....
case 0xF
    .....

gracias por la ayuda

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: ayuda hi-tect parte alta y baja de un byte
« Respuesta #1 en: 31 de Octubre de 2011, 18:32:26 »
  El operador << es desplazamiento a la izquierda y el >> es desplazamiento a la derecha.

  Siguiendo con tu valor de ejemplo

numb = 0xAF (hexadecimal) que es lo mismo que 10101111 (binario)

  la forma de uso de "<<" o  ">>" es

Código: C
  1. x = variable >> 3;

  donde el último número indica la cantidad de bits que serán desplazados.

  En tu caso al hacer 10101111 >> 4 obtenemos el número 00001010 esto es debido a que se desplazan 4 bits hacia la derecha entonces los 4 menos significativos se pierden y los 4 más significativo ocupan el lugar de menor peso.
  De esa manera se puede obtener fácilmente el nibble alto de un byte.

  Para obtener el nibble bajo se puede hacer una and con 0x0F. De esa manera, lo 4 bits de mayor peso se harán 0 y los 4 bits de menor peso mantendrán el valor que tienen.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado puenteroto

  • PIC10
  • *
  • Mensajes: 4
Re: ayuda hi-tect parte alta y baja de un byte
« Respuesta #2 en: 31 de Octubre de 2011, 19:35:25 »
Gracias AngelGris.

Lo del desplazamiento ya lo entiendo, muchas gracias.

El AND que me dices también, es una multiplicación osea:

a = 0x9A = 0b10011010
&                                          *
b = 0x0F = 0b00001111
                         =======
                          00001010

copiado.

ahora si el origen no es desde una variable sino que es el valor que obtiene el puerto por la entrada digamos PORTA supongo que el comportamiento es el mismo.

como puedo usar el valor que se obtiene para usarlo en una sentencia switch case  ?

gracias

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: ayuda hi-tect parte alta y baja de un byte
« Respuesta #3 en: 31 de Octubre de 2011, 19:58:45 »
  Supongamos que tenés configurado el nibble alto del puerto B como entrada y es eso lo que querés evaluar en una sentencia swtich. Lo primero que yo haría sería leer el valor del puerto en una variable, luego obtener el nibble de dicha variable y por último hacer la evaluación con switch.... Básicamente así...

Código: C
  1. unsigned char entrada;
  2. TRISB = 0xF0; //nibble alto como entrada
  3. while (1)
  4. {
  5.   entrada = PORTB >> 4; // con esto ya leo el puerto y a su vez hago el desplazamiento
  6.   switch (entrada)
  7.   {
  8.      case 0 : break;
  9.      case 1 : break;
  10.      case 2 : PORTB = 0x0F; // activos todas las salidas del puerto B (aquellos bits que han sido configurados como salidas)
  11.                  break;
  12.   }
  13. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado puenteroto

  • PIC10
  • *
  • Mensajes: 4
Re: ayuda hi-tect parte alta y baja de un byte
« Respuesta #4 en: 01 de Noviembre de 2011, 00:47:07 »
Ok AngelGris.

Esta parte esta superada, muchas gracias por las aclaraciones, en los case usas los numeros directamente como si fueran de base decimal, aun no lo pruebo pero ya lo he visto en un manual de picc, pero me llama la curiosidad por que no hacerlo asi:

case 0x00: Break;
case 0x01: Break;
 .
 .
 .
case 0xnn: Break;

OJO no se si funciona he, solo pregunto ?

Ahora en el caso que necesite saignar valor en el puerto:
ejemplo:

TRISA = 0b00101111;
PORTA = 0b00011111; // puerto a=47d = 0X2F

la forma individual seria RA7 = 1

si leo el puerdo despues de esto seria 0d10011111 = 0x9F

si despues de leer una variable con el valor 0101 como lo colocaria en la parte alta del puerto, como hago la sustitucion ?



Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: ayuda hi-tect parte alta y baja de un byte
« Respuesta #5 en: 01 de Noviembre de 2011, 10:48:17 »
Ok AngelGris.

Esta parte esta superada, muchas gracias por las aclaraciones, en los case usas los numeros directamente como si fueran de base decimal, aun no lo pruebo pero ya lo he visto en un manual de picc, pero me llama la curiosidad por que no hacerlo asi:

case 0x00: Break;
case 0x01: Break;
 .
 .
 .
case 0xnn: Break;

OJO no se si funciona he, solo pregunto ?


  Es lo mismo, yo sólo lo puse en decimal por una cuestión de simplicidad al escribir  :D :D


Ahora en el caso que necesite saignar valor en el puerto:
ejemplo:

TRISA = 0b00101111;
PORTA = 0b00011111; // puerto a=47d = 0X2F

la forma individual seria RA7 = 1

si leo el puerdo despues de esto seria 0d10011111 = 0x9F


  Para asignar todos los valores directamente no es necesario que la parte baja esté todo en 1, ya que al estar configurado como entrada, debería ser lo mismo que la parte baja esté todo en 1 o en 0.
  Sí, la forma individual es como lo mencionás.


si despues de leer una variable con el valor 0101 como lo colocaria en la parte alta del puerto, como hago la sustitucion ?


  Lo rotas 4 veces a la izquierda y ya te queda en el nibble alto de una variable. Por ejemplo...

Código: C
  1. TRISA = 00001111; // parte baja del puerto A como entrada
  2. TRISB = 0x0F; // parte alta del puerto B como salida
  3. variable = PORTA << 4; // leo el valor del puerto y lo desplazo a la izquierda
  4. PORTB = variable; // envío al puerto de salida el valor de la variable
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: ayuda hi-tect parte alta y baja de un byte
« Respuesta #6 en: 01 de Noviembre de 2011, 11:19:11 »
el hexadecimal, octal, decimal... significan lo mismo en binario, solo que utilizan distinta base numerica xD

pero ojo, 0x10 no es igual que 10 xD en este caso significaria 16 decimal

Desconectado puenteroto

  • PIC10
  • *
  • Mensajes: 4
Re: ayuda hi-tect parte alta y baja de un byte
« Respuesta #7 en: 02 de Noviembre de 2011, 00:49:19 »
Gracias MerLiNz por la observacion.

Gracias AngelGris de nuevo por tus aclaratorias, tu propuesta me deja ciertas dudas por ejemplo:

tu codigo AngelGris

Código: [Seleccionar]
TRISA = 00001111; // parte baja del puerto A como entrada
TRISB = 0x0F; // parte alta del puerto B como salida
variable = PORTA << 4; // leo el valor del puerto y lo desplazo a la izquierda
PORTB = variable; // envío al puerto de salida el valor de la variable

en esta operacion cuando asigno el valor de 'variable' al puerto b, no estoy borrando el valor que tenian las entradas del puerto ?
algo asi:

siendo PORTB = 0b00001010

PORTA = 0b00001101
variable = 0b11010000
PORTB = 0b11010000

si este es el caso comp se podria alterar la parte alta sin modificar la baja, para que quede asi:
PORTB = 0b11011010

que seria el caso ideal

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: ayuda hi-tect parte alta y baja de un byte
« Respuesta #8 en: 02 de Noviembre de 2011, 09:54:10 »
  Según el datasheet de, por ejemplo el 16f877, al hacer operación de lectura se lee el estado del pin y al escribir se lo hace sobre unos latchs internos.

  Si yo intento escribir sobre un puerto que está configurado como entrada no debería tener efecto mi escritura ya que no se propagaría hacia los pines, pero sinceramente nunca me puse a verificarlo.

  Sino se puede leer sobre el puerto que se quiere escribir y hacer funciones AND o OR o lo que corresponda para conformar un byte que sea lo que se quiere escribir más lo que había originalmente en el puerto y así no se vería afectado su contenido.

  Seguimos con el ejemplo que se lee variable desde el puerto A y se la quiere escribir en el puerto B

Código: C
  1. variable = PORTA << 4;
  2. variable_auxiliar = PORTB;
  3.  
  4. variable |= 0x0F; hago una OR para poner el todo nibble bajo en 1
  5. varialbe_auxiliar |= 0xF0; // hago una OR para poner el nibble alto todo en 1;
  6. variable = variable & variable_auxiliar;

  El resultado final sería que todo lo que estaba en 0 de variable permanecerá en 0 y todo lo que estaba en 0 de variable:auxiliar permanecerá en 0. Por lo tanto nuestra escritura será lo que queríamos escribir, y el resto no se verá modificado.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas