TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: Abner_emanuel en 03 de Septiembre de 2016, 12:32:04

Título: Selección de envío de alarmas por puerto serie
Publicado por: Abner_emanuel en 03 de Septiembre de 2016, 12:32:04
Un saludo amigos.

Necesito de su ayuda para solucionar un problema, para ello les anexo esta parte del código hasta ahora llevo.

Lo que hace es sensar el estado de tres reveladores (aunque en realidad son 7 pero solo anexo tres  :mrgreen:). Si el relevador se activa, se envía un dato "falla_x"independiente de cada relevador por el puerto serie del pic.

Lo que quiero es que envíe los estados en un solo dato serie, pero únicamente los activados, es decir, si se activo el primero y el tercero; entonces envía por un solo dato serie como falla_1, falla_3 que fueron los activados y desprecie la Falla_2 que no se activo. En si, que solo se envíen por un solo dato serie las fallas activadas y sea despreciado el que no se active.


Código: C++
  1. #include <18F4550.h>
  2.          #device adc=10        
  3.          #FUSES NOWDT,WDT128,PLL1,CPUDIV1,NOUSBDIV,XT,NOBROWNOUT,MCLR,NOLVP,NOXINST            
  4.          #use delay(clock=4000000)  
  5.          #use rs232(baud=9600, xmit=PIN_c6, rcv=PIN_c7, parity=N, bits=8, stream=MODEM)
  6.          #byte porta=0xF80 #byte portb=0xF81 #byte portc=0xf82 #byte portd=0xf83 #byte porte=0xf84              
  7.          #use fast_io(b)
  8.          
  9.          short flag_12vcd=0,flag_24vcd=0,flag_48vcd=0;  
  10.  
  11.          void comandos_at(void);
  12.  
  13.          void main()
  14.          {              
  15.          port_b_pullups(true);
  16.  
  17. ////////////////////////////////////////////////////////////////////////////////
  18.          
  19.          while(TRUE)
  20.          {
  21.          if ((input(PIN_B0)==0) && (flag_12vcd==0))                    
  22.          {
  23.          fprintf(modem,"FALLA_1 %c\r\n",26); delay_ms(100);              
  24.          flag_12vcd=1;                                                
  25.          }
  26.          else if (input(PIN_B0)==1) {flag_12vcd=0;}                    
  27.          else;                                                              
  28.                                            
  29. ////////////////////////////// RECTIFICADOR 24 VCD ////////////////////////////
  30.          
  31.          if ((input(PIN_B1)==0) && (flag_24vcd==0))                
  32.          {        
  33.          fprintf(modem,"FALLA_2%c\r\n",26); delay_ms(100);                
  34.          flag_24vcd=1;                                                
  35.          }         else if (input(PIN_B1)==1) {flag_24vcd=0; }                  
  36.          else;                                                                        
  37.          
  38. ////////////////////////////// RECTIFICADOR 48 VCD ////////////////////////////
  39.  
  40.          if ((input(PIN_B2)==0) && (flag_48vcd==0))                  
  41.          {        
  42.          fprintf(modem,"FALLA_3 %c\r\n",26); delay_ms(100);                
  43.          flag_48vcd=1;                                                
  44.          }
  45.          else if (input(PIN_B2)==1) {flag_48vcd=0; }                  
  46.          else;                  
  47.          }          
  48.          }
  49.          
  50. ////////////////////////////////////////////////////////////////////////////////

Anexo la simulación en proteus  :-/
Título: Re:Selección de envío de alarmas por puerto serie
Publicado por: Abner_emanuel en 12 de Septiembre de 2016, 20:26:56
 :? ¿Nadie me puede apoyar no me di a a entender?.
Título: Re:Selección de envío de alarmas por puerto serie
Publicado por: KILLERJC en 13 de Septiembre de 2016, 01:36:36
Es que es muy simple solucion abner, vos estas testeando y escribiendo en cada valor del puerto.

Ahora pensa como harias para enviar todo?

Por ahi seria mas simple hacer un string asi (es decir comenzar con esta string):

texto[] ="falla_x,falla_y,falla_z"

Luego al momento de testear cambiar la x, la y y la z en ese orden, y en caso de querer terminar el string antes, deberias cambiar la coma por 0x00 y listo, vas a tener que usar una variable para saber cual ( x,y o z) estas modificando.

Suponete solo falla2. testeas el primer valor e indice es 0, no pasa nada, pasas al segundo valor e indice 0 cargas el numero, pasas a indice 7, testeas el tercer valor no pasa nada.
en 7 pones un 0x00, quedando asi:

texto[] ="falla_2",0x00,"falla_y,falla_z"

entonces el texto queda como solo falla_2

Ahora si tenemos falla 1 y falla 3

volvemos a nuestro string original. probamos el 1 y dio resultado, pasa el indice a 7. El 2 no ocurre nada por lo tanto no aumenta el indice, el 3 si, cambia el valor y aumenta el indice a 14. qeudando:

texto[] ="falla_1,falla_3",0x00,"falla_z"

entonces tenes salida de 2 nomas. En caso de 3 es obvio. Por si no te diste cuenta cual es el lugar de x,y y z son:
numero: indice + 6

Al avanzar hago indice += 7

y luego de avanzar si necesito cerrar uso el indice que quedo ( el multiplo de 7)
Título: Re:Selección de envío de alarmas por puerto serie
Publicado por: Abner_emanuel en 13 de Septiembre de 2016, 11:30:07
Un saludo KILLER JC.

Tu haces ver las cosas fáciles, gracias por tu ayuda un no lo hubiese pensado de tal manera. Intentare el code así como sugieres.

Aunque tengo dudas de como implementarlo pero confió en que al final resultará.