Autor Tema: Como se puede hacer bien una comparacion de Bits??  (Leído 2418 veces)

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

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Como se puede hacer bien una comparacion de Bits??
« en: 07 de Mayo de 2004, 16:57:00 »
Necesito comparar los estados de bits de un registro para tomar accion sobre los bits de otro registro.
Hoy lo estoy haciendo de este modo:


   #define Rele1  datoOut,0
   #define Rele2  datoOut,1
   #define Rele3  datoOut,2
   #define Rele4  datoOut,3
   #define Rele5  datoOut,4
   #define LedPB  datoOut,5
   #define LedTA  datoOut,6
   #define LedPA  datoOut,7
   #define Enter  datoIn,0
   #define Esc    datoIn,1
   #define Prog   datoIn,2
   #define Up     datoIn,3
   #define Down   datoIn,4
   #define Input3 datoIn,5
   #define Input2 datoIn,6
   #define Input1 datoIn,7
//hasta aqui declaro las posiciones de cada uno...



Dentro de main() tengo lo siguiente:


read_expanded_inputs (&datoIn);    //lee las entradas
      //DatoOut=DatoIn;  //esta forma no anduvo....
      if (Bit_Test(Enter)) Bit_SET(Rele1);
      if (Bit_Test(Esc)) Bit_SET(Rele2);
      if (Bit_Test(Prog)) Bit_SET(LedPB);
      if (Bit_Test(Up)) Bit_SET(LedTA);
      if (Bit_Test(Down)) Bit_SET(LedPA);
//esta forma si anduvo, pero quiero mejorar su lectura y manejo...
      write_expanded_outputs (&datoOut);  // escribe las salidas



Alguien puede guiarme o ayudarme a mejorarlo??
Quisiera poder hacerlo mas legible y facil de utilizar, en PBP yo ponia:
If Enter then Rele1
y andaba OK.

Aqui no

Gracias por su lectura, mas agradecido si me ayudan..
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado oshow

  • PIC18
  • ****
  • Mensajes: 321
RE: Como se puede hacer bien una comparacion de Bits??
« Respuesta #1 en: 07 de Mayo de 2004, 17:44:00 »
Hola MGL.

Una de las posibles soluciones, sería usar un switch, por ejemplo:

switch(datoIn)
{
case 0: bit_set(rele1); break;
case 1: bit_set(rele2); break;
case 2: bit_set(LedPB); break;
case 3: bit_set(LedTA); break;
case 4: bit_set(LedPA); break;
}

Creo que queda mas elegante.

Saludos.

Uups , no digo nada, perdona, metedura de pata, no me fije bien en los defines, pense que dataIn era una variable que adquiria cierto valor y segun eso activabas ciertas salidas, por eso lo del switch era una buena opción.

Si lo que quieres es activar las salidas de un puerto, segun las entradas de otro, por que no pruebas algo parecido a esto:


#byte port_a = 5
#byte port_b = 6

main()
{
  port_b = 0;
  set_tris_a(0b00011111);  // Puerta A se configura como entrada
  set_tris_b(0b00000000);  // Puerta B se configura como salida

  while(1)
    port_b = port_a;
}

Lo que "metes" al puerto A lo sacas por el B.

Si no es esto lo que quieres, dame mas detalles, para poder ayudarte, porque no termino de entender tu código muy bien.


Saludos.

Desconectado Ginho_rj

  • PIC12
  • **
  • Mensajes: 87
RE: Como se puede hacer bien una comparacion de Bits??
« Respuesta #2 en: 07 de Mayo de 2004, 23:00:00 »
Qual o objetivo deste codigo???

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
RE: Como se puede hacer bien una comparacion de Bits??
« Respuesta #3 en: 08 de Mayo de 2004, 00:29:00 »
No conozco muy bien el c , pero esto no seria lo mismo ?

Rele1 = Enter;
Rele2 = Esc;
LedPB = Prog;
LedTA = Up;
LedPA = Down;

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: Como se puede hacer bien una comparacion de Bits??
« Respuesta #4 en: 08 de Mayo de 2004, 06:45:00 »
Primero:

Estoy utilizando un registro 74165 para leer entradas y un registro 74595 para escribir salidas.
Esto hace que mis entradas y salidas solo pueden ser mapeadas en un Byte de memoria, sin asignarlo como es posible hacerlo con un puerto fisico.
Esto me permite expandir cuando sea necesario a mas entradas-salidas agregando mas registros seriales, sin utilizar mas entradas fisicas del PIC.
Es basicamente lo que estuve viendo en el proyecto del PLC.

Segundo:
Luego de escribir el POST me di cuenta de un error cometido por mi en esta linea, comentada como que no anda.


//DatoOut=DatoIn; //esta forma no anduvo


La escribi y ahi nomas me di cuenta del error, donde ambas variables estan empezadas en mayusculas pero declaradas en minusculas, lo cambie y anda bien (pero no me explico como el compilador no me dio error antes).

Volviendo al tema, el interes es comparar Bit a Bit de forma sencilla y clara.

Sisco:
Esa forma la habia probado (esta comentada en parte del programa que no puse) pero no me anduvo, ahi si me salto error del compilador, diciendo que no era posible....

Probare de hacer una funcion de comprobacion que devuelva un valor binario en el bit pasado como parametro.

Gracias a todos por su colaboracion.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado oshow

  • PIC18
  • ****
  • Mensajes: 321
RE: Como se puede hacer bien una comparacion de Bits??
« Respuesta #5 en: 08 de Mayo de 2004, 07:55:00 »
Hola MGLsoft.

Hombre la verdad es que no conozco estos integrados para hacer expansiones de los puertos del pic, pero me parece muy interesante.

En cuanto a la comparación bit a bit y desconociendo lo que tiene que hacer exactamente tu programa, porque desconozco el funcionamiento de los 74 que indicas, te puedo decir que una posible forma de comparar bit a bit,es usando mascaras:

Con el operador &: Realiza una AND bit a bit entre dos registros.
Con el operador |:Realiza una OR bit a bit entre dos registros.
Con el operador ^:Realiza una XOR bit a bit entre dos registros.

Espero haberte ayudado. Por cierto no se si te has fijado, supongo que si, pero bueno lo comento igual por si acaso, en el directorio examples del compilador ccs existe un ejemplo que creo te puede ayudar, el nombre del fichero es EX_EXPIO.c


Suerte y saludos.



Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: Como se puede hacer bien una comparacion de Bits??
« Respuesta #6 en: 08 de Mayo de 2004, 10:00:00 »
Exactamente estoy trabajando con los registros utilizados en ese ejemplo, es mas, con ciertas modificaciones de patillaje estoy usando esas librerias.
lo que no me gusta por poco claro al momento de hacer Debug es la forma del trato de estas señales, por eso quiero mejorar su legibilidad....
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
RE: Como se puede hacer bien una comparacion de Bits??
« Respuesta #7 en: 08 de Mayo de 2004, 11:29:00 »
Hola MARCOS, creo que la sugerencia de oshow es buena, por lo menos yo la uso, un ejemplo seria este

read_expanded_inputs (&datoIn);

      datoIn & datoOut;
      datoIn |  datoOut;

write_expanded_outputs (&datoOut);

Esto copia un registro en el otro a nivel de bits.


Pero no veo porque no te deja copiar directamente un registro en el otro por como vos planteas es raro.

DatoOut=DatoIn;

si son dos registros de 8 bits, deberia funcionar, bueno de igual modo a lo mejor no interpreto tu pregunta, yo he usado mucho estos dos integrados pero en la epoca del asm, ahora uso el MPC23016 de microchip que es un expansor de I/O por I2C de 16 bits mira el datashheet esta bueno pues cuando tenes que leer genera una interrupcion y ademas solo necesita 2 pines del micro si haces poolling y 3 si usas interrupcion, claro que en mi caso como
en mi aplicacion tengo I2C el impacto fue nulo y no es muy costoso este IC.

un saludo

Ariel



saludos
PikMan

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: Como se puede hacer bien una comparacion de Bits??
« Respuesta #8 en: 10 de Mayo de 2004, 08:26:00 »
Donde lo conseguis??
Alguno de Argentina lo trae??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.