ImagenImagenImagenImagen
Hazte Socio (El Foro siempre Gratis)
Paga con Tarjetas+ Info www.arde.cc/socios

COMUNICACIÓN SERIE PIC-PIC PINGUINO SERIAL/USB

Postea aqui toda la parte de programación del lenguaje C, C++, C#...

Moderador: Junta Directiva

Andres2007
Mensajes: 9
Registrado: Vie Oct 21, 2011 11:29 am

Re: COMUNICACIÓN SERIE PIC-PIC PINGUINO SERIAL/USB

Mensaje por Andres2007 » Mar Oct 25, 2011 1:25 pm

Bueno,
pues tengo compilada la función de holding_registers. Sacado de http://www.pinguino.org.ve/wiki/index.p ... ario:Rasm4" onclick="window.open(this.href);return false;

Voy a ver si puedo hacer una prueba para comunicar el Pinguino con el PC. En cualqueir caso, voy a intentar adquirir 2 MAX485 para conectar ambos PICs por serial.

#include <stdlib.h>
#define TIMEOUT 1000 // 1 second
#define BAUDRATE 9600 // Defina la rata de baudios
#define MAX_READ_REGS 20 // se limita a 20 registros por transaccion
#define MAX_WRITE_REGS 20 // se limita a 20 registros por transaccion
#define MAX_RESPONSE_LENGTH 46
#define PRESET_QUERY_SIZE 46
#define PORT_ERROR -5
int read_holding_registers(int slave, int start_addr, uint8_t count, int *dest)
{
int function = 0x03; /* Function: Read Holding Registers */
int ret;

unsigned char packet[REQUEST_QUERY_SIZE + CHECKSUM_SIZE];

if (count > MAX_READ_REGS) {
count = MAX_READ_REGS;
}

build_request_packet(slave, function, start_addr, count, packet);

if (send_query(packet, REQUEST_QUERY_SIZE + CHECKSUM_SIZE) > -1) {
ret = read_reg_response(dest, packet);
}
else {
ret = -1;
}
return (ret);
}



Avatar de Usuario
beamspot
Usuario Desarrollador
Usuario Desarrollador
Mensajes: 1132
Registrado: Jue Oct 11, 2007 8:56 pm
Nombre: Guillem

Re: COMUNICACIÓN SERIE PIC-PIC PINGUINO SERIAL/USB

Mensaje por beamspot » Mié Oct 26, 2011 5:45 pm

Le he echado una ojeada a esa librería, y bueno, no me parece de la mejor calidad.

Tampoco me queda claro el tipo de acceso que hace al puerto serie subyacente. Ni si usa interrupciones, ni que temporizador usa.

Tampoco me deja clara la estructura del programa, ni de las rutinas, ni de la relación entre archivos.

Ni me gusta que sean librerías.

Vamos, que si no te va, allá tu.

Lo que intuyo es que hay muchas llamadas entre rutinas que acaban accediendo directamente al puerto serie por polling, de tal manera que las funciones son síncronas, bloqueando la CPU mientras comunicas y desperdiciando preciosos ciclos de procesador en waits.

La estructura es caótica y la indentación, como poco pobre. La ayuda es poco válida, en mi opinión, aunque yo no la uso mucho.

Y lo peor, si vas a aprender a partir de aquí, que te pillen confesado.

En mi muy torcida y enrevesada opinión, esta librería (como la mayoría de librerías que he leído), está escrita por alguien que no programa muy bien ni sabe que es un microcontrolador. Huele a proyecto final de carrera o a aficionado novato o pogramador de micros con muy poca experiencia o pocos conocimientos.
Beamspot.

Andres2007
Mensajes: 9
Registrado: Vie Oct 21, 2011 11:29 am

Re: COMUNICACIÓN SERIE PIC-PIC PINGUINO SERIAL/USB

Mensaje por Andres2007 » Mié Oct 26, 2011 6:32 pm

Bueno pues...si que me das ánimos pa seguir adelante. En cualquier caso, aparte del "performance" que le pueda faltar . ¿ Qué opciones me propones para arrancar ?

Saludos y gracias.

Avatar de Usuario
beamspot
Usuario Desarrollador
Usuario Desarrollador
Mensajes: 1132
Registrado: Jue Oct 11, 2007 8:56 pm
Nombre: Guillem

Re: COMUNICACIÓN SERIE PIC-PIC PINGUINO SERIAL/USB

Mensaje por beamspot » Jue Oct 27, 2011 9:09 am

Los pasos, en mi opinión son los siguientes:

Dado que para desarrollar no necesitas, en un principio el RS-485, mientras este te llega y aprendes a conectarlo, puedes usar un puerto serie cualquiera que tengas.

Sobre eso, empieza por hacer las rutinas de transmisión y recepción por el puerto serie, por interrupciones.

Después, que dichas rutinas te envíen un buffer y te reciban otro buffer, por el puerto serie, utilizando interrupciones. Necesitarás flags para saber si estás todavía transmitiendo o no.

Aprende a utilizar le temporizador: necesitas uno para detectar el time-out de fin de trama.

Envía y transmite tramas del pinguino al PC y viceversa, sin importar mucho el contenido, pero utilizando la transmisión por búffer y la recepción con el timeout del timer para detectar que has recibido una trama completa.

Con eso, tienes la capa de HW más o menos lista. De ahí al RS-485 es sólo añadir el manejo del semi-dúplex: añadir un par de líneas donde pasar de Rx a Tx y viceversa, en las rutinas que ya tendrás.

Sobre eso, hay que hacer la capa de ModBus propiamente dicha. Es relativamente sencilla. Empieza por hacer el CRC por tablas, más rápido y eficiente que el que tienes en la librería, aunque este también te valdría (quizás es la rutina mejor implementada...).

Las tramas suelen tener una estructura más o menos fija: utiliza structs, por ejemplo, como tipo Union. Aprende a meter y sacar datos de ellas. Una función para manejar cada tipo de transacción (la 3 y la 16, por ejemplo) suele ser lo típico, junto a una rutina 'principal' que controle si has recibido una trama, si la trama es para tí (comprobación de dirección), si es válida (check de CRC), y en caso afirmativo, ejecutar la transacción requerida. En total cinco funciones: la de procesado de ModBus (o principal), una para el CRC, otra para contestar que no ha ido bien (transacción errónea o datos erróneos o error de dirección), y una para cada tipo de transacción. Recuerda que desde el micro como esclavo, sólo transmites como consecuencia o respuesta a una petición por parte del maestro.

En el lado del PC creo recordar que hay herramientas más o menos desarrolladas o que simplifican el desarrollo. C# Express, gratuito, es un buen punto de partida.
Beamspot.

Andres2007
Mensajes: 9
Registrado: Vie Oct 21, 2011 11:29 am

Re: COMUNICACIÓN SERIE PIC-PIC PINGUINO SERIAL/USB

Mensaje por Andres2007 » Jue Oct 27, 2011 4:31 pm

ok, muchas gracias por la información. Voy a intentar empezar como me has indicado. Sólo una pregunta. ¿ Es factible que utilice en mi caso la comunicación por broadcast, es decir que todos los slaves contesten a la vez con la lectura a petición del master, o es mejor que el master pregunte a todos y cada uno unidireccionalmente ? ¿ Pierdo alguna funcionalidad al utilizar broadcast ?

Gracias de nuevo.

Avatar de Usuario
beamspot
Usuario Desarrollador
Usuario Desarrollador
Mensajes: 1132
Registrado: Jue Oct 11, 2007 8:56 pm
Nombre: Guillem

Re: COMUNICACIÓN SERIE PIC-PIC PINGUINO SERIAL/USB

Mensaje por beamspot » Jue Oct 27, 2011 5:06 pm

No es factible: en modo broadcast no hay respuesta de ninguno de los slaves (literalmente, esto es de manual).

No te queda otra que ir de uno en uno.

Y eso significa antes asignar de alguna forma direcciones.
Beamspot.

Avatar de Usuario
furri
Usuario Desarrollador
Usuario Desarrollador
Mensajes: 2707
Registrado: Lun Ago 22, 2005 8:16 pm
Nombre: Francisco Reinoso
Ubicación: Marbella
Contactar:

Re: COMUNICACIÓN SERIE PIC-PIC PINGUINO SERIAL/USB

Mensaje por furri » Vie Oct 28, 2011 11:33 am

Yo he usado broadcast en modo puerto serie... suena raro pero funcionaba a la perfección, fué para manipular la información en tiempo real de un sistema de alarmas en una empresa de seguridad donde trabajé hace años.

Monté un cable Tx Rx GND normal pero del Tx del aparato que emitia los codigos de alarma (master) saqué dos cables adicionales que iban a sendos PCs que podian procesar la información igual que el ordenador principal, asi que uno emitia, tres recibian la señal pero solo respondia el ordenador principal.

Si puedes unir todos los dispositivos por puerto serie (sin problemas de caida de señal por cableado, etc...) no veo inconveniente en usar broadcast en modo serie y por software tu mismo filtras si la orden es particular, para todos los dispositivos o incluso para un grupo de ellos.... es lo bueno del software, tu te lo guisas y tu te lo comes... :)

Inconvenientes.... si el "master" envia una orden que requiere respuesta y lo envia para que lo ejecuten todos o varios dispositivos esclavos tendrás que temporizar la respuesta de cada uno para evitar que todos respondan a la vez...

furri.
xBotPinguBotTarriBot

"Gracias a la LPI estoy mejorando mi nivel de ingles..."

Andres2007
Mensajes: 9
Registrado: Vie Oct 21, 2011 11:29 am

Re: COMUNICACIÓN SERIE PIC-PIC PINGUINO SERIAL/USB

Mensaje por Andres2007 » Vie Oct 28, 2011 2:45 pm

Gracias por la información.
Bien, en mi caso, todas las PICS(que serán básculas de pesaje) tendrán que enviar el contenido de un registro de la EEPROM (donde almaceno el peso de la báscula) al Master. Ya que es comunicación todos a uno, creo que necesitaría temporizadores en los envíos para sincronizar que al Master le llegan todas las lecturas. Al fin y al cabo me temo que es una llamada mediante "holding_registers" ejecutada por el Master a los esclavos.

La idea es que cada vez que inserto una báscula en el sistema, no tuviera que modificar el Master añadiendo un número más de Slave en las peticiones de lectura, para hacerlo más dinámico, por eso la idea del broadcast, pero ya que todos deben contestar:
1. O bien uso temporizadores como bien me dices
1. O uso comunicación unidireccional Master -> Slave1, 2, 3...

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado