TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: micronet3 en 24 de Julio de 2009, 12:10:04
-
hola, bueno les cuento que estoy tratando de crear un protocolo de comunicaciones, para el bus rs485, voy a controlar varios nodos, el problema se presenta, cuando envio datos desde el master en este caso desde la pc, a un nodo especifico, los demas nodos tambien reciben los datos, lo reciben en las variables respectivas pero obviamente solo evaluan esos datos si esta dirigido a el, todos los nodos sufren un parpadeo muy molesto, esto lo noto porque tienen un led. y el led esta conectado a la salida del microcontrolador(16f628).
como evitar ese parpadeo, porque cuando el master envia datos, todos los nodos lo reciben, y por lo tanto estan en la rutina de interrupcion, pero aun asi el parpadeo del led que esta conectado al pin RB0 se nota.
sabe alguien a que se debe ese parpadeo?
o como puedo implementar un protocolo de comunicaciones para el bus rs485?
muchas gracias por su ayuda
-
hola, bueno les cuento que estoy tratando de crear un protocolo de comunicaciones, para el bus rs485, voy a controlar varios nodos, el problema se presenta, cuando envio datos desde el master en este caso desde la pc, a un nodo especifico, los demas nodos tambien reciben los datos, lo reciben en las variables respectivas pero obviamente solo evaluan esos datos si esta dirigido a el, todos los nodos sufren un parpadeo muy molesto, esto lo noto porque tienen un led. y el led esta conectado a la salida del microcontrolador(16f628).
como evitar ese parpadeo, porque cuando el master envia datos, todos los nodos lo reciben, y por lo tanto estan en la rutina de interrupcion, pero aun asi el parpadeo del led que esta conectado al pin RB0 se nota.
sabe alguien a que se debe ese parpadeo?
o como puedo implementar un protocolo de comunicaciones para el bus rs485?
muchas gracias por su ayuda
hay que usar el buscador
Aqui hay un link donde ya se hablo de ello
http://www.todopic.com.ar/foros/index.php?topic=21300.msg217915#msg217915
si creo que ahi esta algo de lo que necesitas si no es asi comenta las dudas que tengas
-
Hola.
A que te refieres con parpadeo? a que te refieres con "salida del 16F"?
Las veces que he usado RS485 no he notado reinicios ni nada por el estilo.
Saludos
-
No te explicas bien.
Deberías también subir tu diagrama electrónico.
-
si, creo que mi explicacion no ha sido claro, disculpen amigos, bueno mas tarde estare subiendo un diagrama.
el parpadeo me refiero a lo siguiente
en una red rs485 un master que es la pc y tengo dos nodos, cada nodo tiene como controlador al pic 16f628, este nodo tiene la funcion de controlar un sensor, en cada nodo tengo un led conectado al pin RB0 del PIC, cuando, por ejemplo envio informacion al nodo1, todo trabaja normal, pero se nota un pequeñisimo parpadeo en el led que nada tiene que ver con la recepcion de datos, esto ocurre cuando el programa se encuentra en la rutina de interrupcion RDA.
todo trabaja normal, el unico problema es cuando el master envia informacion, forzozamente todos los pics de los nodos entran en la rutina de recepcion de datos(rda), viendo si la informacion que llega les corresponde o no, y ahi se nota el parpadeo, pero no afecta en nada al proceso
esa era mi duda amigos, como mejorar eso,
-
En la rutina de interrupcion, tienes algun delay_ms()? O de pronto la funcion de decodificacion de los mensajes esta en la rutina de interrupcion? Normalmente, y para que no halla problemas, las rutinas de interrupcion deben tomar el minimo tiempo posible y todas las acciones de manejo del proceso deben estar en el programa principal.
De todas maneras, seria mejor que subas el codigo de los receptores y un diagramilla para ver y estar seguro de lo que te decimos ok?
Saludos
-
hola esta es la rutina de recepcion de datos desde la pc.
como veran todos los esclavos recepcionan los datos en la rutina de recepcion de datos en sendas variables, despues en el bucle principal evaluo si acepto o no los datos recepcionados.
yo envio varios datos, desde una aplicacion, como todos los esclavos recepcionan los datos es en ese momento, cuando estan recepcionando los datos donde se nota el parpadeo de un led.
todo esto en una red rs485, como veran mi protocolo de comunicaciones es medio anticuado, si ustedes conocen alguna forma mejor por favor, con gusto y un agradecimiento
//rutina de recepcion de datos
#int_rda
void serial_isr()
{
char string_modo[20];
if(kbhit())
{
fgets(string_modo,pc);
//el primer datos nos dice que accion va a ejecutar el esclavo
//en este caso si string_modo nos dice que se va a recepcionar datos para actualizar la hora del esclavo, entonces ejecuta
//la siguiente condicion
if(strcmp(string_modo,fecha_rgb)==0)
{
fgets(string_dia,pc);
fgets(string_mes,pc);
fgets(string_anio,pc);
fgets(string_hora,pc);
fgets(string_minuto,pc);
fgets(string_segundo,pc);
flag_fecha=true;
}
//esta es la siguiente opcion, que recepcion el la fecha de encendido y apagado
else if(strcmp(string_modo,programacion_rgb)==0)
{
//primera hora
fgets(hora_on_1,pc);
fgets(minuto_on_1,pc);
fgets(segundo_on_1,pc);
fgets(hora_off_1,pc);
fgets(minuto_off_1,pc);
fgets(segundo_off_1,pc);
//segunda hora
fgets(hora_on_2,pc);
fgets(minuto_on_2,pc);
fgets(segundo_on_2,pc);
fgets(hora_off_2,pc);
fgets(minuto_off_2,pc);
fgets(segundo_off_2,pc);
flag_arranque=true;
}
//esta es otra opcion que ejecuta un procedimiento determinado en el esclavo
else if(strcmp(string_modo,juego)==0)
{
flag_game=true;
}
}
}
-
Hola.
Primero: La variable char string_modo[] debe estar definida como variable global, ya que si luego realizas algun proceso en el main, al ser variable local, se van a perder los datos que has almacenado en ella.
Segundo: Como te lo mencione en el post anterior, las rutinas de interrupcion deben tomar el minimo tiempo posible.
Tercero: Si vas a llenar un bufer, debes hacerlo de manera secuencial, de esta forma pones un orden a todo y no te confundis y garantizas que el bufer de verdad tiene los datos que necesitas.
string_modo[i++]=getc();
Debes definir un string que indique el final de envio de la trama, por ejemplo: '-', luego de detectar el final de envio, ya puedes hacer todo lo demas.
Saludos
-
muchas gracias por responder amigo.
la variable char string_modo[], lo declaro local a la funcion de interrupcion porque solo se utiliza dentro de esta rutina,
y me sirve para indicarle al pic que ruta va a tomar en la recepcion de datos
no estoy haciendo una recepcion de datos con getc sino que estoy utilizando fgets().
no estoy utilizando buffers.
por ejemplo necesito enviar tres datos desde el master a la pc, en este caso seria asi
char modo_dato[]="recepcion_datos";
# int_rda
void isr()
{
char string_modo[];
fgets(string_modo,pc) //
if(strcmp(string_modo,modo_dato)==0) // si string_modo es igual a modo_dato entonces recepciona tres datos
{
fgets(dato1,pc); //recepcion del primer dato
fgets(dato2,pc); //recepcion del segundo dato
fgets(dato3,pc); //recepcion del tercer dato
}
}
para ver el fin de la recepcion de datos, o mejor dicho para que no se quede colgado el sistema dentro de la rutina de recepcion de datos , siempre envio una cantidad definida de datos en estes caso cuatro
el primero me indica que tipo de datos va a recepcionar
el segundo, el tercero y el cuarto son los datos
o sea desde la pc envio cuatro cadenas con un retorno de carro.
-
hola sip creo que me he complicado, una consulta, se puede crear un array de cadenas en ccs por ejemplo:
int array[8][6[];
array[0]="hi";
array[1]="hola1";
array[2]="hola2";
array[3]="hola3";
array[4]="hola4";
array[5]="hola5";
-
Hola.
Si, si se puede:
const int8 Labels[][*]={"Label1", "Label2", "Label3"};
Saludos
-
ayap MLO, como una constante, si quiera tomarlo como una variable, seria valido,
es decir primer declaro el array de cadenas
esto seria como constante
const char cadena[4][8]={"hola","como","estas","cuando"};
estos valores no se pueden modificar, por ser constantes,
ahora para crear un array de cadenas que pueda modificarlo en cualquier parte del programa
char cadena[][]; //declaro la cadena como variable global
como haria para asignarle valores dentro de una funcion, por almacenar datos que vienen desde la pc