TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: MGLSOFT 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..

-
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.
-
Qual o objetivo deste codigo???
-
No conozco muy bien el c , pero esto no seria lo mismo ?
Rele1 = Enter;
Rele2 = Esc;
LedPB = Prog;
LedTA = Up;
LedPA = Down;
-
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.
-
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.
-
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....
-
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
-
Donde lo conseguis??
Alguno de Argentina lo trae??