Autor Tema: Código que funciona en proteus y no en el mundo real  (Leído 2375 veces)

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

Desconectado j4v1

  • PIC10
  • *
  • Mensajes: 8
Código que funciona en proteus y no en el mundo real
« en: 25 de Mayo de 2008, 14:44:29 »
Ante todo presentarme. Mi nick es j4v1 y llevo un tiempo leyendoos. Hace muuuucho tiempo programé algo en C y cuando descubrí este foro me entró el gusanillo de los pics. Así que me vereis por aquí de vez en cuando.

Ahora el problema. He realizado algunos montajes, tanto simulados como reales. El problema me ha ocurrido con el código que os pongo a continuación.

FUNCIONAMIENTO:
El programa envia y recibe datos del PC a través de un MAX233.
Cuando el pic recibe un 1, 2, 3 ó 4; enciende o apaga el led correspondiente.
Cuando un interruptor cambia de posición, manda el mensaje correspondiente al PC.

Al simularlo en proteus me funciona perfectamente, pero cuando lo construyo, sólo me funcionan los interruptores. El montaje está bien, ya que al rehacer el código funcionó. Debe haber algo en mi forma de programar que no le gusta al pic, pero si a proteus.

Código: CSS
  1. // Comunicación PC - RS232 v1.0
  2. // Compilador: PCM Compiler V4.038
  3.  
  4. // Directivas del preprocesador
  5. #include <16F84A.h>
  6. #use delay(clock=4000000)
  7. #fuses XT,NOWDT,NOPROTECT,PUT
  8. #use RS232 (BAUD = 2400, BITS = 8, PARITY = N, XMIT = PIN_A1, RCV = PIN_A2)  
  9.  
  10. #use fast_io (A)
  11. #use fast_io (B)
  12.  
  13. // Definición de variables
  14.  
  15.  
  16. int1 eled1;   // estados de los leds
  17. int1 eled2;
  18. int1 eled3;
  19. int1 eled4;
  20. int1 einterr1;
  21. int1 einterr2;
  22. int1 einterr3;
  23. int1 einterr4;
  24.  
  25. // Llamamos a los pines por nombres más intuitivos
  26. #define led1  48 // B0
  27. #define led2  49 // B1
  28. #define led3  50 // B2
  29. #define led4  51 // B3
  30. #define interr1  52 // B4
  31. #define interr2  53 // B5
  32. #define interr3  54 // B6
  33. #define interr4  55 // B7
  34.  
  35. // Función principal
  36. void main(VOID)
  37. {
  38.    set_tris_b (0b11110000); //puerto B: RB7 a RB4 Entradas, RB3 a RB0 Salidas.
  39.    set_tris_a (0b00000010); // Puerto A: pin A1 como Entrada, el resto como salida
  40.    output_B (0); //apaga los leds
  41.    eled1 = 0; //nos aseguramos de que los estados son cero
  42.    eled2 = 0;
  43.    eled3 = 0;
  44.    eled4 = 0;
  45.    
  46.    puts ("Comunicacion PC - RS232 v1.0"); // Mensaje de bienvenida.
  47.    puts ("-----------------------------");
  48.    puts ("Pulse 1, 2, 3 o 4");
  49.    
  50.  // inicializamos variables interruptores
  51.  
  52.    einterr1=input(interr1);
  53.    einterr2=input(interr2);
  54.    einterr3=input(interr3);
  55.    einterr4=input(interr4);
  56.    
  57.    DO
  58.    {
  59.    if (einterr1!=input(interr1))
  60.    {
  61.    printf("interruptor 1 ha cambiado a %d\n\r",input(interr1));
  62.    einterr1=input(interr1);
  63.    }
  64.    if (einterr2!=input(interr2))
  65.    {
  66.    printf("interruptor 2 ha cambiado a %d\n\r",input(interr2));
  67.    einterr2=input(interr2);
  68.    }
  69.    if (einterr3!=input(interr3))
  70.    {
  71.    printf("interruptor 3 ha cambiado a %d\n\r",input(interr3));
  72.    einterr3=input(interr3);
  73.    }
  74.    if (einterr4!=input(interr4))
  75.    {
  76.    printf("interruptor 4 ha cambiado a %d\n\r",input(interr4));
  77.    einterr4=input(interr4);
  78.    }
  79.  
  80.        
  81.      if(kbhit())
  82.       {
  83.         SWITCH (GETC ()) // actuamos en función de lo recibido (1, 2, 3 ó 4)
  84.       {
  85.          CASE '1':
  86.          {
  87.          
  88.             IF (eled1 == 0)
  89.             {
  90.                output_high (led1); // si está apagado lo enciende
  91.                puts ("Endendido led 1");
  92.                eled1 = 1; // cambiamos la variable de estado
  93.             }
  94.  
  95.             ELSE
  96.             {
  97.                output_low (led1); // y viceversa
  98.                puts("Apagado led 1");
  99.                eled1 = 0;
  100.             }
  101.  
  102.             BREAK;
  103.          }
  104.  
  105.          CASE '2':
  106.          {
  107.                      IF (eled2 == 0)
  108.             {
  109.                output_high (led2); // si está apagado lo enciende
  110.                puts ("Encendido led 2");
  111.                eled2 = 1; // cambiamos la variable de estado
  112.             }
  113.  
  114.             ELSE
  115.             {
  116.                output_low (led2); // y viceversa
  117.                puts ("Apagado led 2");
  118.                eled2 = 0;
  119.             }
  120.  
  121.             BREAK;
  122.          }
  123.  
  124.          
  125.          CASE '3':
  126.          {
  127.          
  128.             IF (eled3 == 0)
  129.             {
  130.                output_high (led3); // si está apagado lo enciende
  131.                puts ("Encendido led 3");
  132.                eled3 = 1; // cambiamos la variable de estado
  133.             }
  134.  
  135.             ELSE
  136.             {
  137.                output_low (led3); // y viceversa
  138.                puts ("Apagado led 3");
  139.                eled3 = 0;
  140.             }
  141.  
  142.             BREAK;
  143.          }
  144.  
  145.          CASE '4':
  146.          {
  147.          
  148.             IF (eled4 == 0)
  149.             {
  150.                output_high (led4); // si está apagado lo enciende
  151.                puts ("Encendido led 4");        
  152.                eled4 = 1; // cambiamos la variable de estado
  153.             }
  154.  
  155.             ELSE
  156.             {
  157.                output_low (led4); // y viceversa
  158.                puts ("Apagado led 4");
  159.                eled4 = 0;
  160.             }
  161.  
  162.             BREAK;
  163.          }
  164.       }
  165.       }
  166.    }WHILE (TRUE); // Bucle infinito.
  167. }

Espero vuestra ayuda y gracias de antemano.

Salud,    javi.

Desconectado j4v1

  • PIC10
  • *
  • Mensajes: 8
Re: Código que funciona en proteus y no en el mundo real
« Respuesta #1 en: 25 de Mayo de 2008, 14:58:33 »
Se me olvidaba, aquí teneis el esquema y código listo para simular.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Código que funciona en proteus y no en el mundo real
« Respuesta #2 en: 26 de Mayo de 2008, 12:51:21 »
Cuando dices que sólo te funciona la parte de los interruptores, ¿te refieres a que consigues ver en el PC los mensajes que envía el PIC?
Si es así, ya tienes bastante conseguido, y probablemente tendrías que buscar el problema en la línea TX del PC al PIC de la comunicación serie. Revisa bien, sobre todo las conexiones en el MAX233 y comprueba que los 0 y los 1 llegan de parte a parte con el polímetro.

Si no es así, comprueba que el micro esté oscilando y trabajando correctamente. Un sencillo truco para saberlo es hacer que los leds parpadeen en el inicio del programa. Si lo ves, es que está corriendo

Desconectado j4v1

  • PIC10
  • *
  • Mensajes: 8
Re: Código que funciona en proteus y no en el mundo real
« Respuesta #3 en: 26 de Mayo de 2008, 15:25:08 »
Gracias por la respuesta. En efecto, el problema era ese, se recibian los mensajes de los interruptores, pero no encendían los leds.
En cualquier caso, creo que me he pasado describiendo el problema y he desviado la atención de mi verdadera pregunta.
Lo que me interesa es saber que hice mal en este código. Ya hice otro código y funcionó con el mismo montaje, así que deducco que el montaje está bien.
Es más, si borro la parte del código de los interruptores, entonces los leds funcionan. Y si borro la parte del código de los leds, los interruptores siguen funcionando. El problema es al ponerlos juntos.

Esta pregunta sólo tiene como fin mejorar mi forma de programar los pics, ya que otro código me funcionó. Si lo encuentro (soy realmente desordenado) lo publicaré por aquí por si a alguien le puede valer. Si no lo encuentro, básicamente lo que corregí fué que quité el switch - case y lo hice todo con condicionales if.

Basicamente, para la parte de los leds quedaría algo así:
Código: CSS
  1. if (kbhit())
  2. {
  3.     if (getch()=='1')
  4.     {
  5.     acciones que implique el carácter 1
  6.     }
  7.   ...
  8. }

Lo que no entiendo es que este código funcione y el otro no.

Salud,        Javi.