Autor Tema: como asigno posicion del bite en el byte a pines?  (Leído 4595 veces)

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

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
como asigno posicion del bite en el byte a pines?
« en: 06 de Abril de 2006, 20:43:09 »
Amigos: es un gusto volver a encontrarlos,demas esta decir que estaba desesperado....

La pregunta es: estoy tratando de crear un protocolo de comunicacion entre pics,y lo que deseo leer es como se le asigna una posicion de un bit en un byte a un pin
determinado

por ejemplo: mando un byte del primer pic al segundo, y este ultimo debe reconocer cada bit del byte y realizar la instruccion asignada a cada  pin

ejemplo: pin a0  al bit 0,pin a1 al bit 1.......pin a7 al bit 7

espero haber sido claro...

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #1 en: 06 de Abril de 2006, 23:12:42 »
Suena un poco confuso pero te respondo con unos comandos...

bit_set(var,bit);
var es tu variable de 8, 16 ó 32 bits
bit es un int que indica el bit a trabajar
Pone a uno el bit indicado de var

bit_set(variable,5); //pondría a 1 el bit5 de la variable "variable"

bit_clear(var, bit)
Misma situación pero pone al cero el bit indicado

value = bit_test (var, bit);
Entrega 1 ó 0 según lo que esté en el bit indicado

Ahora lo que tú mencionas...

if(input(pin_a0)==1)
bit_set(var,0);
else
bit_clear(var,0);

Hay formas más rápidas de hacer eso, pero no las conozco todas.  :)

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #2 en: 06 de Abril de 2006, 23:23:52 »
gracias mig por tus consejos.Lamento haber sido confuso en la explicacion.

lo que necesito hacer es comunicar 2 pic ya que tengo que comandar 16 luces en una ruleta en movimiento,de manera que lo que habia planeado es asignarle a los puertos del pic 1(que esta afuera de la ruleta) los interruptores que comanden las luces(16 en total) usando ra0..ra1.. etc, y que un pin de ese pic1 lea el estado de los interruptores formando una cadena de 16 bits, y ese mismo pin del pic1 conectarlo al pin receptor del pic2 que hace el camino inverso leyendo ese pin que recibio con los 16 bits y asignando entonces las salidas correspondientes a los pines de salida del pic2, que obviamente está dentro del mecanismo que esta girando.

esto lo hago para no colocar 17 anillos rozantes  ya que seria un embrollo.

por eso queria saber como asignar pines a bits tanto en el pic 1 de entrada o emisor como esos bits a pines de salida en el pic 2 o receptor.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #3 en: 07 de Abril de 2006, 00:21:11 »
Por lo que entiendo quieres que el estado de cada uno de los 16 interruptores en el PIC1 pasen de forma "serial" al pin x del PIC1 que a su vez está conectado al PIC2 en otro pin x. No se me ocurre otra forma de enviar el estado de 16 pines por solo un pin.

Primero depositarías el estado de los 16 pines en una variable int16. Luego necesitarías invertarte un protocolo de envío serial para que el PIC2 sepa cuando se le están enviando que pines de parte del PIC1.

Podrías usar el modo #use rs232 y configurar el pin x del PIC1 como transmisor (xmit), el receptor del PIC1 no se va a usar.

#use rs232(baud=9600, xmit=PIN_x,rcv=PIN_y) //[PIC1] 'x' transmite hacia PIC2, 'y' no se usa

Luego le avisas al PIC2 que ya vas a enviarle los dos bytes de los interruptores (16bits = 2bytes)...

putc(0xff); //propongo 0xff como "Aviso de inicio de transmisión" (podría confundirse con que los 16 interruptores estén a 1 !!)

El PIC2 se configuraría...

#use rs232(baud=9600, xmit=PIN_x,rcv=PIN_y) //[PIC2] 'x' no se usa, 'y' es el pin que recibe desde PIC1

y le pones...

if(getc()==0xff) //ya inició transmisión

Lo demás te lo dejo a ti para que lo analices, porque que tal si estoy confundiendo el tema y ya explique otra cosa.  :)
« Última modificación: 07 de Abril de 2006, 00:23:21 por migsantiago »

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #4 en: 07 de Abril de 2006, 16:59:50 »
Pregunto:

              si yo coloco printf y en el argumento coloco los bytes que quiero mandar,y hago un while true, va a sacar por el pin tx  continuamente esos bytes?

desde ya gracias mig!!!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #5 en: 07 de Abril de 2006, 17:37:04 »
Sip!

Para dos variables int8
printf("%x%x",byte1,byte2);

Para una int16
printf("%Lx",var_int16);

Aunque me gusta más la idea de putc ya que con printf tendrías que usar algo que te sincronice la información, pero bueno a ver a que solución llegas  :wink:

Si llegaras a necesitar que ambos PICs conversen entre sí...

PIC1: que tal ya recibiste eso?
PIC2: sí ya llegó, mándame otro no?
PIC1: ok allá va!  :lol:

...podrías usar las líneas RX y TX de ambos pics para que logren eso.

« Última modificación: 07 de Abril de 2006, 17:40:41 por migsantiago »

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #6 en: 07 de Abril de 2006, 20:57:14 »
Mig: mi idea era la siguiente:

al ser mi primer proyecto en comunicacion entre pics,se me habia ocurrido lo siguiente:
las luces que se prenden en el pic 2 deben responder al pic1,entonces si yo hago un while true sobre el printf de los 2 bytes,pregunto :al dar vuelta constantemente por el while true,y si hubiera una modificacion en los interruptores de entrada,no refrescaria de alguna manera la informacion de los bytes? es decir el byte modificado
por algun bit que cambió,se "pega sobre la informacion del byte antiguo ,o hay que sincronizar el dialogo?

espero haberme explicado.... :(

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #7 en: 07 de Abril de 2006, 21:00:05 »
imaginate que tengo este byte: 1 0 0 0 0 0 0 0 , si por ejemplo se pone el bit 0 en1 se pega sobre el otro asi 1 0 0 0 0 0 0 0 1   ?

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #8 en: 08 de Abril de 2006, 00:21:16 »
Lo que pasa es que si usas getc(); en el PIC2, no sabrás si el byte recibido es el primero o el segundo.

Para saber que es el primer byte o el segundo debe haber una conversación entre los PICs, el PIC1 avisa de alguna forma que ahí va el byte 1 y el PIC2 avisa que ya lo recibió, posteriormente el PIC1 envía el byte 2 y el PIC2 avisa que ya lo recibió.

Una vez teniendo ambos bytes puedes depositarlos en el puerto A y B del PIC2.

Si no haces que ambos PICs se sincronicen es probable que el byte1 (primeros 8 interruptores) se ponga en el byte2 (últimos 8 LEDs).

Se me ocurre que hagas una sincrocnización por tiempos.. primero activa el PIC2, luego activas el PIC1 y que envíe los primeros 8 interruptores (1 byte), ya luego los otros 8 y así el PIC2 siempre sabrá el orden de recepción.


- PIC2 (el que enciendes primero, el girador  :) )
#use rs232(baud=2400, xmit=PIN_x,rcv=PIN_y) //[PIC2] 'x' no se usa, 'y' es el pin que recibe desde PIC1
...
while(1)
{
output_a(getc()); //recibes 8 primeros interruptores y los sacas por porta
output_b(getc()); //recibes 8 últimos interruptores y los sacas por portb
}

- PIC1 (el de los interruptores)
#use rs232(baud=2400, xmit=PIN_x,rcv=PIN_y) //[PIC1] 'x' transmite hacia PIC2, 'y' no se usa
...
delay_ms(2000); //que espere a que PIC2 sea encendido primero o esté listo para recibir
while(1)
{
putc(input_a()); //envías 8  interruptores de porta por rs232
putc(input_b()); //envías 8  interruptores de portb por rs232
}


Ya te lo puse más claro, espero que así le entiendas.  :)

Le bajé la velocidad a 2400bps por si hay problemas con las escobillas que mencionas ya que pueden rebotar y generar errores en la transmisión.


Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #9 en: 08 de Abril de 2006, 10:21:58 »
gracias mig . lo voy a implementar en proteus a ver que onda...

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #10 en: 08 de Abril de 2006, 12:06:25 »
Sï, no hay de que.

Cuando lo termines porfavor sube tu programa y el proteus para ver qué avances le diste.  :wink:

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #11 en: 09 de Abril de 2006, 01:58:23 »
Caramba! me encontre con una cosa del proteus que me huele mal

estoy tratando de simular envio y recepcion de un pic a otro(2 pic) y me di cuenta que el simulador te permite cargar un solo programa

alguna sugerencia?

desde ya gracias!!!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #12 en: 09 de Abril de 2006, 02:31:15 »
No sé de qué forma los cargues, pero dando click derecho sobre PIC1 y luego click izquierdo se abre la ventana para que cargues el hex correspondiente, luego haces lo mismo con el pic2.

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #13 en: 09 de Abril de 2006, 10:20:47 »
mig: lo he hecho,pero si no cargo en el menu -- source files alguno de los 2 programas no hace nada, pero si cargo uno solo hace lo del pic cargado nada mas.

otra pregunta de novato: analogamente a putc() el comando es get(),para el printf cual es?

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: como asigno posicion del bite en el byte a pines?
« Respuesta #14 en: 09 de Abril de 2006, 12:52:47 »
erm... ahí si me quedo corto, no sé cual es... me parece que no lo hay.

Pregunta tu duda de Proteus en el foro de simulación, a ver que te dicen, seguramente es una versión rara que no soprta 2 pics al mismo tiempo.


 

anything