Autor Tema: Problema al leer una trama por RS232  (Leído 16426 veces)

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

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #30 en: 07 de Febrero de 2016, 16:41:02 »
esto me esta complicando, incorpore las modificaciones y o hacen nada el programa

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #31 en: 07 de Febrero de 2016, 17:10:12 »
esto me esta complicando, incorpore las modificaciones y o hacen nada el programa

Nuevametne te pido perdon es que ando con otras cosas y por ahi me pierdo. gets() detecta un \r , asi que reemplaza el \n por el \r. Quedando de esta forma:

printf("%02d&%02d\r",Num1,Num1);

Y ahora si el receptor deberia tomar el valor correcto. ( Espero )

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #32 en: 07 de Febrero de 2016, 17:50:55 »
KILLERJC

te serviria si te mando el programa.. se arreglo .. pero lo cargue pero segue con pestañasos los display

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Problema al leer una trama por RS232
« Respuesta #33 en: 07 de Febrero de 2016, 17:59:31 »
yo diría que lo pongas en un post. Pero primero elegi aariba a la derecha donde está el combo de código el ue dice "C" y en medio de esas etiquetas ue se te crean en el post, pegas el código... ahi lo podemos ver bien.
Lo cargaste en el micro real y los dispay parpaden? o lo seguis vendo en proteus?

sds
-
Leonardo Garberoglio

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #34 en: 07 de Febrero de 2016, 18:18:46 »
 si lo cargue en una tarjeta electronica 100% real....
esas instrucciones de post donde las encuentras en el menu de responder mensajes

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Problema al leer una trama por RS232
« Respuesta #35 en: 07 de Febrero de 2016, 18:21:42 »
Tenes
Asunto:
Icono del mensaje:
B   I    U  ............................ Tipo de fuente       Tamaño de Fuente                      Cambiar colo      Codigo

ese combo que dice código lo desplegas y elegis C

sds.
-
Leonardo Garberoglio

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #36 en: 07 de Febrero de 2016, 18:34:07 »
perfecto... ahi va el programa 
saludos amigos

Código: C
  1. #include <16f628A.H>
  2. #fuses NOMCLR
  3. #fuses INTRC_IO
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6. #FUSES NOPUT                    //No Power Up Timer
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10. #FUSES NOCPD                    //No EE protection
  11. #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12. #use delay (clock=4000000)
  13. #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14. #define display_1     PIN_B4
  15. #define display_2     PIN_B5
  16. #define display_3     PIN_B6
  17. #define display_4     PIN_B7
  18. void alarma(void);  
  19. // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  20. int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  21. char trama_serial[5];                   // Arreglo para recibir los datos.
  22. int1 flag_rx = 0;  
  23.               // Variable bandera de recepción.
  24. int8  Num_1,Num_2,Num_3,Num_4,Num_2x;
  25.  
  26. #INT_RDA
  27. void RECEPCION_RS232(void)
  28.  
  29. {
  30.    gets(trama_serial);                  // Se recibe la cadena de datos.
  31.    flag_rx = 1;                  // Se indica recepción completa.
  32. }
  33.  
  34.  
  35.    
  36.    void main (void)
  37.    {
  38.    
  39.    
  40.    enable_interrupts(INT_RDA);
  41.    enable_interrupts(GLOBAL);
  42.    set_tris_a(0x00);
  43.    //set_tris_b(0x06);
  44.  
  45.    while (true)
  46.    {
  47.      
  48.      
  49.       if(flag_rx==1 )                // Si hay datos en el buffer...
  50.       {
  51.       Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48);
  52.       Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);
  53.       Num_2X =(trama_serial[2]);
  54.       printf("%d%d%c%d%d\r"Num_1,Num_2,Num_2x,Num_3,Num_4);
  55.       alarma();
  56.       flag_rx = 0;    
  57.       }
  58.    }
  59.    }
  60.    
  61. void alarma(void)
  62. {      
  63.          
  64.          
  65.          output_high(Display_1);
  66.          output_a(Numeros[Num_1]);
  67.          delay_ms(100);
  68.          output_low(Display_1);
  69.          output_high(Display_2);                            
  70.          output_a(Numeros[Num_2]);          
  71.          delay_ms(100);
  72.          output_low(Display_2);
  73.          output_high(Display_3);
  74.          output_a(Numeros[Num_3]);
  75.          delay_ms(100);
  76.          output_low(Display_3);
  77.          output_high(Display_4);
  78.          output_a(Numeros[Num_4]);
  79.          delay_ms(100);
  80.          output_low(Display_4);
  81.  
  82. }

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Problema al leer una trama por RS232
« Respuesta #37 en: 07 de Febrero de 2016, 19:03:45 »
el tema de que los display parpadean es por que solo los refrescas cuando recives las trama.
La funcion alarma debería llamarse constantemente y el tiempo entre display y display tenes que bajarlo mucho, digaos 1mseg cada display. De este modo, si alarma esta corriendo constanteente los display van a mostrar contantemente los mismos numeros. Pero cuando se reciva una nueva trama, se van a actualizar los datos y la proxima vez que entre en alarma se verán los nuevos números.
Algo así:

Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14.     #define display_1     PIN_B4
  15.     #define display_2     PIN_B5
  16.     #define display_3     PIN_B6
  17.     #define display_4     PIN_B7
  18.     void alarma(void);  
  19.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  20.     int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  21.     char trama_serial[5];                   // Arreglo para recibir los datos.
  22.     int1 flag_rx = 0;  
  23.                   // Variable bandera de recepción.
  24.     int8  Num_1,Num_2,Num_3,Num_4,Num_2x;
  25.      
  26.     #INT_RDA
  27.     void RECEPCION_RS232(void)
  28.      
  29.     {
  30.        gets(trama_serial);                  // Se recibe la cadena de datos.
  31.        flag_rx = 1;                  // Se indica recepción completa.
  32.     }
  33.      
  34.      
  35.        
  36.        void main (void)
  37.        {
  38.        
  39.        
  40.        enable_interrupts(INT_RDA);
  41.        enable_interrupts(GLOBAL);
  42.        set_tris_a(0x00);
  43.        //set_tris_b(0x06);
  44.      
  45.        while (true)
  46.        {
  47.          
  48.          
  49.           if(flag_rx==1 )                // Si hay datos en el buffer...
  50.           {
  51.           Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48);
  52.           Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);
  53.           Num_2X =(trama_serial[2]);
  54.           printf("%d%d%c%d%d\r"Num_1,Num_2,Num_2x,Num_3,Num_4);
  55.  
  56.           flag_rx = 0;    
  57.           }
  58.           alarma();     //Esto se ejecuta constantemete, no importa si se ha recivido trama nueva o no.
  59.        }
  60.        }
  61.        
  62.     void alarma(void)
  63.     {      
  64.              
  65.              
  66.              output_high(Display_1);
  67.              output_a(Numeros[Num_1]);
  68.              delay_ms(1);
  69.              output_low(Display_1);
  70.              output_high(Display_2);                            
  71.              output_a(Numeros[Num_2]);          
  72.              delay_ms(1);
  73.              output_low(Display_2);
  74.              output_high(Display_3);
  75.              output_a(Numeros[Num_3]);
  76.              delay_ms(1);
  77.              output_low(Display_3);
  78.              output_high(Display_4);
  79.              output_a(Numeros[Num_4]);
  80.              delay_ms(1);
  81.              output_low(Display_4);
  82.      
  83.     }
-
Leonardo Garberoglio

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #38 en: 07 de Febrero de 2016, 19:17:51 »
 :-/ :-/ :-/ :-/ :-/ :-/ :-/
 (((:-))) (((:-))) (((:-)))

Excelente muchas gracias

ahí partió super bien el programa, ahora se logra ver perfectamente los display ....Pero para eso tuve que hacer lo ultimo que me enviaste
bajar a 1 ms la sincronizar y eliminar la confirmación de datos en la rutina del RDA

ahora recibe lo que quiere, quiero evitar que eso pase .. probe  sus ideas  que me enviaron pero no me resulta ... colo cuando pongo

este codigo parte super bien..pero queda desprotegido

Código: C
  1. #INT_RDA
  2.     void RECEPCION_RS232(void)
  3.      
  4.     {
  5.        gets(trama_serial);                  // Se recibe la cadena de datos.
  6.        flag_rx = 1;                  // Se indica recepción completa.
  7.     }


Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Problema al leer una trama por RS232
« Respuesta #39 en: 07 de Febrero de 2016, 19:35:30 »
... y eliminar la confirmación de datos en la rutina del RDA

yo no dije eso...

ahora recibe lo que quiere, quiero evitar que eso pase .. probe  sus ideas  que me enviaron pero no me resulta ... colo cuando pongo

este codigo parte super bien..pero queda desprotegido

Código: C
  1. #INT_RDA
  2.     void RECEPCION_RS232(void)
  3.     {
  4.        gets(trama_serial);                  // Se recibe la cadena de datos.
  5.        flag_rx = 1;                  // Se indica recepción completa.
  6.     }

que sería "queda desprotegido"?

La comunicacion serie no estaba resuelta ya???
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema al leer una trama por RS232
« Respuesta #40 en: 07 de Febrero de 2016, 19:41:45 »
char trama_serial[5];                   // Arreglo para recibir los datos.

Aumenten el tamaño del buffer. Ponelo en 10.

El tema de mostrar en los displays yo lo habia sacado afuera antes, no se por que ahora estan dentro.

Citar
que sería "queda desprotegido"?

Tal ves se refirio cuando dije sobre un buffer overflow.

Citar
La comunicacion serie no estaba resuelta ya???

Solo le funciona con el gets(), y no se por que no le funciona con el getc(), ya que el gets() utiliza el getc() para obtener cada letra segun el manual del CCS.

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #41 en: 07 de Febrero de 2016, 19:46:17 »

en la rutina del rda , queria colocarle que confirme ultimo dato de la trama y cuando pase eso que de por aceptada la recepción

ahora en el programa solo queda recibiendo datos, con el afan de evitar posibles fallas cuando el programa este operando

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Problema al leer una trama por RS232
« Respuesta #42 en: 07 de Febrero de 2016, 20:14:58 »
a ver en el programa del que transmite cambiaste el '\n' por el '\r'?

Código: C
  1. while (1)
  2.             {
  3.                     for (Num1=0 ;Num1<=99;Num1++)
  4.                     {
  5.                             lcd_gotoxy(1,1);
  6.                             printf(LCD_PUTC, " Decimal 1: %02d",Num1);
  7.                             lcd_gotoxy(1,2);
  8.                             printf(LCD_PUTC, " Decimal 2: %02d",Num1);
  9.                             printf("%02d&%02d\r",Num1,Num1);
  10.                             delay_ms(1500);
  11.                             }
  12.                     }
  13.             }

ese es el primer tema importante que killer ya comento que se habia equivocado. La trama tiene que ser 00&00\r o sea que son 6 caracteres los que salen del transmisor.
Cuando el primer caracter sale del Transmisor (Tx) entra a la interrupcion del PIC Receptor (Rx) y como la instruccion en la ISR es un gets se queda ahí clavado hasta que llegue el '\r' (esa parte no la entiendo bien, tendría que ver la implementacion de gets)

Bueno, investigando un poco encontré este post:
https://www.ccsinfo.com/forum/viewtopic.php?t=43695
donde se dice esto:
"You can't use 'gets', with interrupt driven RS232.

gets, expects to sit and wait for an entire string. If you put it inside an interrupt receive routine, you 'throw away' the point of having interrupt driven receive, locking the program till the string arrives. Yetch.
Put it outside the interrupt, and the PIC will hang forever, since characters will never become available to this routine.... "

Lo que yo haría es lo que ya hemos sugerido con KILLER, es usar getc dentro de la interrupcion:

Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14.     #define display_1     PIN_B4
  15.     #define display_2     PIN_B5
  16.     #define display_3     PIN_B6
  17.     #define display_4     PIN_B7
  18.     void alarma(void);  
  19.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  20.     int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  21. char trama_serial[10];                  // Arreglo para recibir los datos.
  22. int1 flag_rx = 0;                       // Variable bandera de recepción.
  23. volatile int indice=0;
  24. int8 basura;
  25.                   // Variable bandera de recepción.
  26.     int8  Num_1,Num_2,Num_3,Num_4,Num_2x;
  27.      
  28. #INT_RDA
  29. void RECEPCION_RS232(void)
  30. {
  31.         if(indice<5)    // Solo 5 valores nomas.
  32.         {
  33.                 trama_serial[indice]=getc();
  34.                 indice++;
  35.         }
  36.         else
  37.         {
  38.                 flag_rx = 1;                  // Se indica recepción completa.
  39.                 basura = getc();                // Descarto el caracter
  40.         }
  41. }
  42.  
  43.      
  44.      
  45.        
  46.        void main (void)
  47.        {
  48.        
  49.        
  50.        enable_interrupts(INT_RDA);
  51.        enable_interrupts(GLOBAL);
  52.        set_tris_a(0x00);
  53.        //set_tris_b(0x06);
  54.      
  55.        while (true)
  56.        {
  57.          
  58.          
  59.           if(flag_rx==1 )                // Si hay datos en el buffer...
  60.           {
  61.           Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48);
  62.           Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);
  63.           Num_2X =(trama_serial[2]);
  64.           printf("%d%d%c%d%d\r"Num_1,Num_2,Num_2x,Num_3,Num_4);
  65.  
  66.           flag_rx = 0;    
  67.           }
  68.           alarma();     //Esto se ejecuta constantemete, no importa si se ha recivido trama nueva o no.
  69.        }
  70.        }
  71.        
  72.     void alarma(void)
  73.     {      
  74.              
  75.              
  76.              output_high(Display_1);
  77.              output_a(Numeros[Num_1]);
  78.              delay_ms(1);
  79.              output_low(Display_1);
  80.              output_high(Display_2);                            
  81.              output_a(Numeros[Num_2]);          
  82.              delay_ms(1);
  83.              output_low(Display_2);
  84.              output_high(Display_3);
  85.              output_a(Numeros[Num_3]);
  86.              delay_ms(1);
  87.              output_low(Display_3);
  88.              output_high(Display_4);
  89.              output_a(Numeros[Num_4]);
  90.              delay_ms(1);
  91.              output_low(Display_4);
  92.      
  93.     }

Si eso no funciona hay que seguir buscando con el getc.

Saludos
-
Leonardo Garberoglio

Desconectado futurama

  • PIC10
  • *
  • Mensajes: 47
Re:Problema al leer una trama por RS232
« Respuesta #43 en: 07 de Febrero de 2016, 20:28:12 »
 :-/ :-/ :-/ (((:-))) (((:-))) (((:-)))

gracias amigo , modifique el programa en ambos lados receptor y emisor y no pasa nada .. solo quiere funcionar con gets....pero quiero agradecerle por la ayuda brinda ..muchisimas gracias

  agradecimientos a  elgarbe y KILLERJC (((:-)))

los quería molestar con la ultima consulta, como puedo hacer que led sea intermitente sin interferir en el proceso normal que tiene el microcontrolador.

yo se hacer que un led se encienda y se apague... pero en este caso el led es como el indicador de que el micro esta operando...es como un indicador del sistema de vida por decir algo...cuando lo intento me hace pegar el programa...es como si funcionara al ritmo del led,la idea es que el led sea independiente su parpadeo


Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Problema al leer una trama por RS232
« Respuesta #44 en: 07 de Febrero de 2016, 20:36:33 »
Para el led tenes que usar un timer con interrupcion:

Código: C
  1. #include <16f628A.H>
  2.     #fuses NOMCLR
  3.     #fuses INTRC_IO
  4.     #FUSES NOWDT                    //No Watch Dog Timer
  5.     //#FUSES XT                     //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
  6.     #FUSES NOPUT                    //No Power Up Timer
  7.     #FUSES NOPROTECT                //Code not protected from reading
  8.     #FUSES NOBROWNOUT               //No brownout reset
  9.     #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  10.     #FUSES NOCPD                    //No EE protection
  11.     #FUSES RESERVED                 //Used to set the reserved FUSE bits
  12.     #use delay (clock=4000000)
  13.     #use rs232(baud=9600, xmit=pin_B2, rcv=pin_B1)
  14.     #define display_1     PIN_B4
  15.     #define display_2     PIN_B5
  16.     #define display_3     PIN_B6
  17.     #define display_4     PIN_B7
  18.     void alarma(void);  
  19.     // NUMEROS [0-9] = [ 0  , 1  , 2  , 3  , 4  , 5  , 6  , 7 ,  8  , 9 ]
  20.     int Numeros[10]  = {0X00,0X01,0X02,0x03,0x04,0x05,0X06,0x07,0X08,0x09};
  21. char trama_serial[10];                  // Arreglo para recibir los datos.
  22. int1 flag_rx = 0;                       // Variable bandera de recepción.
  23. volatile int indice=0;
  24. int8 basura;
  25.                   // Variable bandera de recepción.
  26.     int8  Num_1,Num_2,Num_3,Num_4,Num_2x;
  27.  
  28.  
  29. int interrupt_counter=0;
  30. #define LED   PIN_A0           // Aquí el pin donde esta el led
  31.  
  32. #INT_TIMER0
  33. void TIMER0_isr()
  34. {
  35.    interrupt_counter++;
  36.    if(interrupt_counter==61)        // Ese 61 es para controlar el período de parpadeo.
  37.       output_toggle(LED);
  38. }
  39.  
  40.  
  41. #INT_RDA
  42. void RECEPCION_RS232(void)
  43. {
  44.         if(indice<5)    // Solo 5 valores nomas.
  45.         {
  46.                 trama_serial[indice]=getc();
  47.                 indice++;
  48.         }
  49.         else
  50.         {
  51.                 flag_rx = 1;                  // Se indica recepción completa.
  52.                 basura = getc();                // Descarto el caracter
  53.         }
  54. }
  55.  
  56.      
  57.      
  58.        
  59.        void main (void)
  60.        {
  61.        // Configuramos el Timer0... Esto investigalo vos
  62.        setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_bit);
  63.        set_timer0(0);
  64.        enable_interrupts(INT_TIMER0);
  65.  
  66.        enable_interrupts(INT_RDA);
  67.        enable_interrupts(GLOBAL);
  68.        set_tris_a(0x00);
  69.        //set_tris_b(0x06);
  70.      
  71.        while (true)
  72.        {
  73.          
  74.          
  75.           if(flag_rx==1 )                // Si hay datos en el buffer...
  76.           {
  77.           Num_1 = ((trama_serial[0])-48);   Num_3 = ((trama_serial[3])-48);
  78.           Num_2 = ((trama_serial[1])-48);   Num_4 = ((trama_serial[4])-48);
  79.           Num_2X =(trama_serial[2]);
  80.           printf("%d%d%c%d%d\r"Num_1,Num_2,Num_2x,Num_3,Num_4);
  81.  
  82.           flag_rx = 0;    
  83.           }
  84.           alarma();     //Esto se ejecuta constantemete, no importa si se ha recivido trama nueva o no.
  85.        }
  86.        }
  87.        
  88.     void alarma(void)
  89.     {      
  90.              
  91.              
  92.              output_high(Display_1);
  93.              output_a(Numeros[Num_1]);
  94.              delay_ms(1);
  95.              output_low(Display_1);
  96.              output_high(Display_2);                            
  97.              output_a(Numeros[Num_2]);          
  98.              delay_ms(1);
  99.              output_low(Display_2);
  100.              output_high(Display_3);
  101.              output_a(Numeros[Num_3]);
  102.              delay_ms(1);
  103.              output_low(Display_3);
  104.              output_high(Display_4);
  105.              output_a(Numeros[Num_4]);
  106.              delay_ms(1);
  107.              output_low(Display_4);
  108.      
  109.     }

-
Leonardo Garberoglio