ImageImageImageImage
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#...

Moderator: Junta Directiva

Andres2007
Posts: 9
Joined: Fri Oct 21, 2011 11:29 am

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

Post by Andres2007 » Tue 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);
}

User avatar
beamspot
Usuario Desarrollador
Usuario Desarrollador
Posts: 1132
Joined: Thu Oct 11, 2007 8:56 pm
Nombre: Guillem

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

Post by beamspot » Wed 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
Posts: 9
Joined: Fri Oct 21, 2011 11:29 am

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

Post by Andres2007 » Wed 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.

User avatar
beamspot
Usuario Desarrollador
Usuario Desarrollador
Posts: 1132
Joined: Thu Oct 11, 2007 8:56 pm
Nombre: Guillem

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

Post by beamspot » Thu 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
Posts: 9
Joined: Fri Oct 21, 2011 11:29 am

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

Post by Andres2007 » Thu 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.

User avatar
beamspot
Usuario Desarrollador
Usuario Desarrollador
Posts: 1132
Joined: Thu Oct 11, 2007 8:56 pm
Nombre: Guillem

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

Post by beamspot » Thu 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.

User avatar
furri
Usuario Desarrollador
Usuario Desarrollador
Posts: 2707
Joined: Mon Aug 22, 2005 8:16 pm
Nombre: Francisco Reinoso
Location: Marbella
Contact:

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

Post by furri » Fri 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
Posts: 9
Joined: Fri Oct 21, 2011 11:29 am

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

Post by Andres2007 » Fri 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...

Post Reply

Who is online

Users browsing this forum: No registered users and 1 guest