Hola Foreros de TodoPic!,
Tiempo Atrás, estaba queriendo dormir, pero no podía, entonces me puse a pensar:
"en los pics con USART puedo transmitir un mensaje a varios Pics desde un pic, pero no puedo transmitir desde varios pics a un pic", al día siguiente, me dispuse a probar mi pensamiento, y efectivamente no se puede, primero porque el pic que recibe, no entendería el mensaje, ya que, o se envían todos juntos creando un caos total, o se crea un corto-circuito, debido a que TX debe mantenerse en estado HIGH(alto, 5v) y al transmitir oscila entre 0v y 5v, si tenemos varios TX juntos, se creara un corto al momento de enviar un cero a la linea, entonces, me dispuse a crear un librería que evitara esto, hubo varios intentos en los que desistí, unos tres mas o menos, y dejaba "tirado" el proyecto varios dias o semanas, pero ya la termine, y me dispongo a mostrárselas, puede que tenga algún error, pero como todo lo nuevo, nada es perfecto, ademas, soy principiante aun en esto de programación de micro controladores
si alguno cree que algo puede mejorar o se puede reducir código innecesario, lo invito a que la modifique.
bueno aquí están ambas librerías, maestro y esclavo
Maestro:
// Enhanced RS232
// A simple Multi-slave
// sistem with rs232 to
// use between PIC to
// PIC or PIC to PC.
// MASTER VERSIÓN
/*****************************************************************************
* *
* THIS LIBRARY WAS CREATED BY ISMAEL CONCHA V. (FANTAXMAX) *
* AND YOU ARE ALLOWED TO SHARE &/OR MODIFY *
* AS YOU LIKE, BUT YOU HAVE TO SHARE THE NEW LIBRARY *
* IN THE POST OF TODOPIC.COM.AR THAT WAS POSTED. *
* *
*****************************************************************************/
#define in input
#define ol output_low
#define oh output_float
#ifndef TX
#define TX PIN_B7
#define RX PIN_B6
#endif
int dirs;
void init_master_bus(int TX, int RX, int BAUD)
{
rst_bus();
#use RS232(stream=ers232, baud=BAUD, XMIT=TX, RCV=RX)
}
void send(int dir, char text)
{
wait_freebus();
rst_bus();
}
char rcv()
{
char buff[];
return buff[];
}
int new_hw() //MUST USE AN EXTERNAL INTERRUPT CONNECTED TO RI OUT OF SLAVE
{
dirs++;
return dirs;
}
//END USER FUNCTIONS
void wait_freebus()
{
while(1)
{if(in(TX)&&in(RX)){
delay_ms(100);
if(in(TX)&&in(RX)){break;}}}
}
void rst_bus()
{
oh(TX);
oh(RX);
}
Esclavo:
// Enhanced RS232
// A simple Multi-slave
// sistem with rs232 to
// use between PIC to
// PIC or PIC to PC.
// SLAVE VERSIÓN
/*****************************************************************************
* *
* THIS LIBRARY WAS CREATED BY ISMAEL CONCHA V. *
* AND YOU ARE ALLOWED TO SHARE &/OR MODIFY *
* AS YOU LIKE, BUT YOU HAVE TO SHARE THE NEW LIBRARY *
* IN THE POST OF TODOPIC.COM.AR THAT WAS POSTED. *
* *
*****************************************************************************/
#define in input
#define ol output_low
#define oh output_float
#define og output_high
#ifndef TX
#define TX PIN_B6
#define RX PIN_B7
#define RI PIN_B5
#endif
int dir;
void init_bus(int TX, int RX, int BAUD)
{
rst_bus();
#use RS232(stream=ers232, baud=BAUD, XMIT=TX, RCV=RX)
presentate();
dir=rcvc();
ol(RI);
}
void send(char text)
{
wait_freebus();
rst_bus();
}
char rcvc()
{
char buff;
if(buff==dir)
else {buff=0x00;}
return buff;
}
char rcvs()
{
char buff[];
if(buff[0]==dir)
else{buff[0]=0x00;
return buff[];
}
//END USER FUNCTIONS
void wait_freebus()
{
while(1)
{if(in(TX)&&in(RX)){
delay_ms(100);
if(in(TX)&&in(RX)){break;}}}
}
void presentate()
{
wait_freebus();
og(RI);
}
creo que no necesita mucha explicación el código, salvo el comentario que puse dentro.
los pines que elegi como TX y RX, fuero meramente, porque creo que todos los pics los tienen, pero aun puedes seleccionar los pines a usar.
las lineas RX y TX deben ser PULL-UP, esto es para evitar el corto-circuito que mencione arriba.
la linea RI es común para todos los esclavos, y debe ir de momento a un pin con interrupción externa.
el sistema debería poder conectarse al pc mediante un famoso max232 sin ningún problema, pero puede que el max tenga problemas con el pull-up.
creo que un sistema por rs232 es mas facil que un sistema por i2c, ya que el protocolo en si es bastante simple, y creo que esta libreria puede reemplazar el i2c como bus multi-slave para aquellos que recien inician en programacion, como yo
PD: la libreria la escribi y comente en ingles, ya que se que varios usuarios no hablan el español como idioma nativo
las librerias aun no las pruebo, prefiero que programadores mas expertos, me indiquen si existe algún error, pero a mi parecer debería funcionar.
Bueno eso, espero que sea útil, si es que no lo habían hecho ya,
Saludos!