Autor Tema: Comunicacion Serial con mas de microcontrolador  (Leído 481 veces)

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

Desconectado Colaborador_Pic94

  • PIC10
  • *
  • Mensajes: 1
Comunicacion Serial con mas de microcontrolador
« en: 20 de Julio de 2022, 23:45:47 »
Buenas noches a todos los que se toman la molestia de leer mi problematica. Para el fin de curso estoy desarrollando un proyecto donde diferentes microcontroladores van a mandar su informacion hacia un Pic central mediante comunicacion Serial en CCS (por que es la unica que tenemos en comun yo y mis compañeros) a 9600 Baudios quien va a "recoger" esa informacion y la convertira en una cadena de la siguiente forma:

Sensor 1 manda : 1E
Sensor 2 manda: 2C
Cadena Final: 1E-2C

Para simularlo y verificar fallas me estoy apoyando de un Arduino Uno y mi Pic Central, el Arduino Uno manda numeros aleatorios en hexadecimal y el Pic Central lee esos valores y lo convierte a la cadena.

El problema surge al probarlo con mas de 1 entrada la cadena se convierte en algo erroneo (conecto el mismo Arduino para verificar la cadena), adjunto el ejemplo:

Lo que me muestra la simulacion                                   
Sensor 1 manda : 1E                                                         
Sensor 2 manda : 1E
Cadena Final: No aparece nada

Sensor 1 manda : 2C
Sensor 2 manda : 2C
Cadena Final: 1E-2C

Y asi se va, recorriendo la cadena y omitiendo lecturas impares, lo mismo pasa cuando los valores de Sensor 1 y Sensor 2 son diferentes.

Mi código de Arduino para generar los numeros aleatorios en hexadecimal es el siguiente:

Código: XML
  1. int randomNumber; //Variable del tipo entero donde se va a guardar el numero aleatorio
  2.  
  3.  
  4. //Función de inicialización
  5. void setup() {
  6.  
  7.   //Inicializamos la comunicación serial
  8.   Serial.begin(9600);
  9.  
  10.  
  11.  
  12. }
  13.  
  14. //Bucle principal
  15. void loop() {
  16.   randomNumber = random(4,5000); //Crea un numero aleatorio entre 5 y 1000
  17.   Serial.println(randomNumber,HEX); //Convierte el numero aleatorio en base hexadecimal y lo manda por puerto serial
  18. }


Y el del Pic16F887A que debe recoger esa información es el siguiente, programado en CCS.



Código: CSS
  1. #INCLUDE <16f877a.h>   // El tipo de PIC a usar
  2. //FUSES
  3. #FUSES HS
  4. #FUSES NOWDT      
  5. #FUSES NOPROTECT  
  6. #FUSES NOPUT      
  7. #FUSES NOLVP    
  8. #FUSES BROWNOUT
  9.  
  10. //Reloj
  11. #USE DELAY(CLOCK=20M) //
  12.  
  13. //****************************Configuración de los puertos UART*************************//
  14. // PIC
  15. #use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, STREAM=PIC) //  XMIT=TRANSMITE POR PIN C6
  16.  
  17. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Sensores~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
  18.  
  19. #use RS232(BAUD=9600, BITS=8, PARITY=N, RCV=PIN_D0, STREAM=SENSOR1)     // RECIBE DEL SENSOR 1, CONECTADO A D0 DEL PIC
  20. #use RS232(BAUD=9600, BITS=8, PARITY=N, RCV=PIN_D1, STREAM=SENSOR2      // RECIBE DEL SENSOR 2, CONECTADO A D1 DEL PIC
  21.  
  22. //------------------ SETEO DE PUERTOS DEL PIC --------------------------------
  23.  
  24. # USE fast_io(B)           // SET RAPIDO DE PUERTO B TRABAJA CON SET_TRIS_B(0B)
  25.  
  26. //**************** PROGRAMA PRINCIPAL *****************************************//
  27. char caracter1[10]; //CADENAS DONDE SE GUARDARA LA INFORMACION DE SENSOR1
  28. char caracter2[10]; //CADENA DONDE SE GUARDARA LA INFORMACION DE SENSOR2
  29.  
  30. void main()
  31. {
  32.  
  33. SET_TRIS_B(0B00000000);   // CONFIGURA TODO EL PUERTO B COMO SALIDA
  34. SET_TRIS_D(0B11111111);   // CONFIGURA TODO EL PUERTO D COMO ENTRADA
  35.  
  36. WHILE (TRUE)                 // BUCLE PRINCIPAL
  37. {
  38.  
  39. if(kbhit(SENSOR1)>0,(SENSOR2)>0) //REVISA SI HAY INFORMACION EN D1 Y D0, si la hay entonces...
  40.  
  41.       {
  42.      
  43.       fgets(caracter1, SENSOR1);//recibe por serial lo que hay en D0 y lo guarda en una variable llamada caracter1
  44.       fgets(caracter2, SENSOR2);//recibe por serial lo que hay en D1 y lo guarda en una variable llamada caracter2
  45.  
  46.  
  47.      fprintf(PIC,"%s-%s\r", caracter1,caracter2);     //Imprime por serial por C6 caracter1-caracter2
  48.    
  49. }
  50. }
  51. }
  52. //************************ fin del programa ***********************************


Adjunto una foto de mi simulación en Proteus, que es donde he estado haciendo pruebas antes de pasar al circuito.




Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re:Comunicacion Serial con mas de microcontrolador
« Respuesta #1 en: 21 de Julio de 2022, 08:29:54 »
Hola, con un vistazo al código, donde declaras dos puertos serie RS232, y otro vistazo al esquema en proteus, saco esta conclusión.
En el diagrama deberias separar las lineas de comunicación, al estar unidas ambos puertos reciben el mismo dato, y provocan dos interrupciones a la vez, la segunda es la que carga el dato, por eso parece que se perdieran los mensajes de uno de los arduinos.

Cambia eso y prueba nuevamente.
Es probable que haya mas problemas, pero ese problema de lineas es el mayor ahora.
Si no mejora seguimos analizando.

Como consejo, nunca ataques dos problemas a la vez, o no sabras cual fue la solución.

Saludos y comenta si dio ayuda, por favor.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:Comunicacion Serial con mas de microcontrolador
« Respuesta #2 en: 21 de Julio de 2022, 10:56:34 »
Hola, con un vistazo al código, donde declaras dos puertos serie RS232, y otro vistazo al esquema en proteus, saco esta conclusión.
En el diagrama deberias separar las lineas de comunicación, al estar unidas ambos puertos reciben el mismo dato, y provocan dos interrupciones a la vez, la segunda es la que carga el dato, por eso parece que se perdieran los mensajes de uno de los arduinos.

Cambia eso y prueba nuevamente.
Es probable que haya mas problemas, pero ese problema de lineas es el mayor ahora.
Si no mejora seguimos analizando.

Como consejo, nunca ataques dos problemas a la vez, o no sabras cual fue la solución.

Saludos y comenta si dio ayuda, por favor.

Según la imagen, el único Arduino que envía datos (Transmisor) es el ARDUINO 2, mientras que el PIC y el ARDUINO (Consola) son receptores.

En el lado del PIC, son dos puertos emulados (RD0 y RD1), por lo que interrupción por recepción RS232, me parece que no puede existir, por no existir el periférico y es por eso que recurre a kbhit para detectar si el pin cambia de estado, es decir si está empezando a recibir una trama de datos.

Luego, la primera función fgets, me parece que crea un lazo en esa parte del código hasta obtener todos los bits de la trama que está arribando.

Cuando se ejecuta la segunda función fgets, ya no hay datos que leer, y me parece que ese es el problema. Tal vez a lo mucho lee los últimos bits. (Bit 8 y bit de parada)

Tal vez la manera que está haciendo el código, las funciones que ocupa y la emulación de un periférico no son útiles para crear un proceso multitarea.

Otra cosa que tal vez debería considerar en un circuito verdadero es las impedancias de los terminales de recepción (PIC y ARDUINO 1) al unirse a un sólo terminal, la impedancia sería menor por conectarse ambas en paralelo, lo cual implica un mayor consumo de corriente del terminal TX del ARDUINO 2.  Pero puede que sea despreciable esta impedancia en paralelo.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32