Autor Tema: Problemas con C  (Leído 4460 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado amospi

  • PIC10
  • *
  • Mensajes: 15
Problemas con C
« en: 16 de Mayo de 2008, 19:14:26 »
Soy pricipiente en cuanto a programaciòn en C y tengo un problema con mi segundo programa. en el siguiente programa la sentencia IF no me la ejecuta, siempre me ejecuta lo que hay despues del IF, sin importar si el IF se cumple o no, siempre me envìa al Pc lo que hay en printf,  les coloco el programaa

Código: C
  1. #include "C:\Archivos de programa\PICC\estimulador.h"
  2. char n=' ';
  3. int cont= 0;
  4. unsigned char x=0;
  5. int i;
  6. void main()
  7. {
  8.  
  9.    
  10.  
  11. setup_adc_ports(NO_ANALOGS);
  12. setup_adc(ADC_OFF);
  13. setup_spi(FALSE);
  14.    
  15.  
  16. setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
  17.    
  18.  
  19. setup_timer_1(T1_DISABLED);
  20.    
  21.  
  22. setup_timer_2(T2_DISABLED,0,1);
  23.  
  24.    set_tris_c(0);
  25.  
  26.    for(;
  27.  {
  28.    
  29.       if (input (pin_b0))
  30.          
  31.       printf("\r\n proyecto sac \r\n");    
  32.      getc()
  33.        else
  34.          {
  35.           output_high (pin_c0);
  36.           delay_ms (2000);
  37.           output_low (pin_c0);
  38.           delay_ms (2000);
  39.          }
  40.          
  41.        
  42.    }
  43.  
  44. }

Editado por Nocturno: para que el código se vea bien
« Última modificación: 17 de Mayo de 2008, 01:31:11 por un Moderador »

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas con C
« Respuesta #1 en: 16 de Mayo de 2008, 19:42:25 »
Saludos!
Bueno creo que en este parte:

   for(;;)
 {
   
      if (input (pin_b0))
         
      printf("\r\n proyecto sac \r\n");     
     getc()

       else
         {
          output_high (pin_c0);
          delay_ms (2000);
          output_low (pin_c0);
          delay_ms (2000);
         }
         
       
   }

}
Como estás ejecutando dos sentencias antes del else, deberías colocarlas entre llaves no?
Así:

      if (input (pin_b0))
      {   
           printf("\r\n proyecto sac \r\n");     
           getc()
       }
       else
      {
          output_high (pin_c0);
          delay_ms (2000);
          output_low (pin_c0);
          delay_ms (2000);
       }

Y por otro lado, deberías colocar: #use standard_io (B) en la cabecera... para que configure apropiadamente RB0 como una entrada...
Solo son sugerencias...
Pruebalo así a ver...
Bueno, seguramente algún experto ya te dará una mejor opinión...
Nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Problemas con C
« Respuesta #2 en: 16 de Mayo de 2008, 21:49:10 »
Hola chicos, traten de colocar el código utilizando la herramienta code, sino el código se tergiversa y se agregan esos dibujitos reemplazando el código (Pues creo que toda via los pics no soportan variables del tipo smileys  :D :D).

amospi, si no colocas ninguna declaración #use xxx_io el compilador asume en forma predeterminada que estas utilizando standard_io, por lo tanto no necesitas la instruccion set_tris(c). La función input() por si sola configura el registro tris para que el puerto a leer sea entrada, salvo que este utilizando #use fast_io, asi que no te preocupes por configurar los puertos.

Con respecto a lo de la sentencia If, el consejo de firepic es el correcto.

Nos vemos.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas con C
« Respuesta #3 en: 16 de Mayo de 2008, 21:54:41 »
Ya me imaginaba que el experto serías tú Gonzalo...  :D
Gracias por la aclaratoria... tenía duda sobre lo del standard_io ya me estaba volviendo una galleta con eso... pero ya entiendo entonces que si uno no especifica nada, el compilador asume standard_io, y no hay que definir los tris...
Bueno qué te diré? "Aprendiendo con Gonzalo"   :P
Ya sabes amospi, olvida lo que te dije sobre colocar standard_io...  :D

Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado amospi

  • PIC10
  • *
  • Mensajes: 15
Re: Problemas con C
« Respuesta #4 en: 16 de Mayo de 2008, 22:47:43 »
Gracias por sus oportunas respuestas, disculpen lo del dibujito, se me metió accidentalmente

Hice lo que me indicaron y  cuando compilo me saca un error (a numeric expression must appear here) donde está la instrucción else . no se realmente que es lo que pasa ¡¡¡¡

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas con C
« Respuesta #5 en: 16 de Mayo de 2008, 23:04:43 »
Podrías cargar el archivo "estimulador.h" a ver si lo compilo por aquí y veo en qué te puedo ayudar?
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas con C
« Respuesta #6 en: 16 de Mayo de 2008, 23:06:36 »
Te adelanto que cuando aparece ese error: "a numeric expression must appear here"... generalmente se trata de alguna variable u otra configuración que no has definido correctamente...
No te preocupes, no es nada del otro mundo...
Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado poseidon20

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 762
Re: Problemas con C
« Respuesta #7 en: 17 de Mayo de 2008, 01:02:12 »
para usar delays, deberias poner #delay=xxMhz(de acuerdo al cristal ausar) algo asi, depues de declarar el tipo de procesador que usas, revisa la ayuda del CCS te sera de gran ayuda como lo es para mi :D

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas con C
« Respuesta #8 en: 17 de Mayo de 2008, 01:08:50 »
Si es verdad amigo poseidon!   :)

Amospi, debes colocar en la cabecera la sentencia:
#use delay (clock=4000000)
Eso en caso de que tu cristal sea de 4MHz... si no, como te dice poseidon, colocas la velocidad de tu cristal...
Revisa bien eso amospi, tal vez ese sea el error...

Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Problemas con C
« Respuesta #9 en: 17 de Mayo de 2008, 01:31:32 »
Yo he probado a compilar el código y no me ha dado ese error, lo único es que te falta un ";" detrás del getc() pero si se lo pones no debería fallar.
Si sigue fallando sube tu programa y lo revisamos:
Código: C
  1. for(;;) {
  2.       if (input (pin_b0)) {
  3.          printf("\r\n proyecto sac \r\n");    
  4.          getc();
  5.          }
  6.        else
  7.          {
  8.           output_high (pin_c0);
  9.           delay_ms (2000);
  10.           output_low (pin_c0);
  11.           delay_ms (2000);
  12.          }
  13.    }
  14. }

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas con C
« Respuesta #10 en: 17 de Mayo de 2008, 09:57:53 »
Buen ojo nocturno!
Algo tan elemental y parece que ninguno nos dimos cuenta, pues nadie lo mencionó...  :D
Pues eso era todo amospi, problema resuelto!
Nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado amospi

  • PIC10
  • *
  • Mensajes: 15
Re: Problemas con C
« Respuesta #11 en: 19 de Mayo de 2008, 18:12:24 »
Perdonen la burrada, pero cuando uno es nuevo en esto, le pasan estas cosas;  De todas maneras, agregandole
el ; tampoco me compila, me sigue mostrando el error en la instrucción else (A numeric expression must appear here)
Les pego el programa que estoy compilando para que lo miren.  Gracias por su oportuna atención¡¡¡

#include "C:\Archivos de programa\PICC\C_virtual2.h"
#use delay (clock=4000000)
#use rs232(baud=1200, xmit=PIN_C6, rcv=PIN_C7,bits=8)
char n='a';
int cont= 0;
unsigned char ocupado=0;
unsigned char casos=0;
char digit=0;
unsigned char contador=20;
unsigned flag= 0;
//set_tris_c(0);


void main()
{
   int recv;
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   for (;;)
   {


        if(input (pin_b0));
            {
            printf("Presione N o S.\n\r");
            getc();

             }

         else
             {
              output_high(pin_c0);
              delay_ms(500);
              output_low(pin_c0);
              delay_ms(500);
              }

      }
       
}

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas con C
« Respuesta #12 en: 19 de Mayo de 2008, 19:59:33 »
Saludos!

Copio nuevamente tu código:

Código: C
  1. #include "C:\Archivos de programa\PICC\C_virtual2.h"
  2. #use delay (clock=4000000)
  3. #use rs232(baud=1200, xmit=PIN_C6, rcv=PIN_C7,bits=8)
  4. char n='a';
  5. int cont= 0;
  6. unsigned char ocupado=0;
  7. unsigned char casos=0;
  8. char digit=0;
  9. unsigned char contador=20;
  10. unsigned flag= 0;
  11. //set_tris_c(0);
  12.  
  13.  
  14. void main()
  15. {
  16.    int recv;
  17.    setup_adc_ports(NO_ANALOGS);
  18.    setup_adc(ADC_OFF);
  19.    setup_spi(FALSE);
  20.    setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
  21.    setup_timer_1(T1_DISABLED);
  22.    setup_timer_2(T2_DISABLED,0,1);
  23.  
  24.    for (;Wink
  25.    {
  26.  
  27.  
  28.         if(input (pin_b0));
  29.             {
  30.             printf("Presione N o S.\n\r");
  31.             getc();
  32.  
  33.              }
  34.  
  35.          else
  36.              {
  37.               output_high(pin_c0);
  38.               delay_ms(500);
  39.               output_low(pin_c0);
  40.               delay_ms(500);
  41.               }
  42.  
  43.       }
  44.        
  45. }

En la línea 28 tienes un punto y coma después del if... ese es el problema...
Lo compilé de esta forma y no tuve problemas:

Código: C
  1. #include <16f876.h>
  2. #use delay (clock=4000000)
  3. #use rs232(baud=1200, xmit=PIN_C6, rcv=PIN_C7,bits=8)
  4. char n='a';
  5. int cont= 0;
  6. unsigned char ocupado=0;
  7. unsigned char casos=0;
  8. char digit=0;
  9. unsigned char contador=20;
  10. unsigned flag= 0;
  11.  
  12. void main()
  13. {
  14.    int recv;
  15.    setup_adc_ports(NO_ANALOGS);
  16.    setup_adc(ADC_OFF);
  17.    setup_spi(FALSE);
  18.    setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
  19.    setup_timer_1(T1_DISABLED);
  20.    setup_timer_2(T2_DISABLED,0,1);
  21.    for (;;)
  22.    {
  23.                 if(input(pin_b0))
  24.         {
  25.                         printf("Presione N o S.\n\r");
  26.             getc();
  27.         }
  28.          else
  29.                 {
  30.                         output_high(pin_c0);
  31.                         delay_ms(500);
  32.             output_low(pin_c0);
  33.             delay_ms(500);
  34.                 }
  35.         }
  36. }
  37.  
  38. Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado amospi

  • PIC10
  • *
  • Mensajes: 15
Re: Problemas con C
« Respuesta #13 en: 20 de Mayo de 2008, 00:27:29 »
Correcto firepic esa era la falla, gracias por su colaboración. Les cuento que hace mucho tiempo que
  programo en assembler, desafortunadamente me demoré demasiado para cambiarme al C; Ahora estoy decidido a hacerlo;
  empecé por pasar mis programas más sencillos de assembler a lenguaje C, pero este me está dando en la cabeza,
  les cuento en que consiste:
 
  Inicialmente debe poner en UNO los pines RC0 y RC1.
  despues
  Mientras el pin RB0 permanezca en 1 no pasa nada,
  si pasa a cero durante aproxi...SIETE segundos,
  debe poner en CERO el pin RC1 durante cinco segundos, volverlo a UNO y retornar a inicio.
 
  Hasta aquí el programa me funciona muy bien, pero la dificultad aparece cuando debo agregarle lo
  siguiente:

  Durante el retardo de aproxi...SIETE segundos si RB0 retorna a UNO,
  inmediatamente debe poner el pin RC0 en cero por medio segundo, ponerlo nuevamente a UNO y retonar a inicio o
  si durante este mismo retardo, RB1 pasa al estado CERO, inmediatamente debe irse para inicio
  teniendo siempre presente de colocar nuevamente RC0 y RC1 en UNO.
 
  Si durate el retardo de cinco segundos RB0 cambia nuevamente al estado UNO, inmediatamente debe colocar
  RC0 en CERO por medio segundo, retornarlo nuevamente a UNO e irse para inicio.
 
  No se si me hice entender. De todas maneras, el programa que realicé en C me hace algunas cosas, pero no todo,
  estos retardos condicionados, no se como hacerlos en C, ahí les pego el programa si me indican que es lo que le
  falta o cómo debo hacerlo.  Si es necesario también les pego el programa en assembler, que si me funciona bien.

#include "C:\Archivos de programa\PICC\hopper.h"
char n=' ';
int cont= 0;
unsigned char x=0;
int i;
int j;
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);

   output_high (pin_c0);
   output_high (pin_c1);

   for(;;)
   {
    if (!input (pin_b0))
    {
       for(i=0;i<100;i++)
       {
          delay_ms(500);
          if (input (pin_b0))
            {
             output_low (pin_c0);
             delay_ms (2000);
             output_high (pin_c0);
             break;
            }
          if (!input (pin_b1))
          break;
        }

        output_low (pin_c0);
        for(i=0;i<9;i++)
        {
        if(input (pin_b0))
          {
           output_low (pin_c1);
           delay_ms (2000);
           output_high (pin_c1);
           break;
          }
          delay_ms(1000);
          output_high(pin_c0);
          break;
        }
     }
  }
}

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Problemas con C
« Respuesta #14 en: 20 de Mayo de 2008, 01:17:19 »
Saludos amospi!  :-)
Bueno dos cosas:

1- Recuerda lo que te mencionó el dr. Gonzalo:
Hola chicos, traten de colocar el código utilizando la herramienta code, sino el código se tergiversa y se agregan esos dibujitos reemplazando el código (Pues creo que toda via los pics no soportan variables del tipo smileys  :D :D).
Esa herramienta "code" está, cuando escribes los mensajes,  en la parte superior izquierda, en la franja arriba de los smyles... representada por un "#"... le das allí y te aparecerán las palabras code y /code entre corchetes, entre esas dos palabras escribe el código para que no salgan los smyles.
Bueno es un detalle pero trata de tenerlo presente para la próxima vez que insertes código en tu mensaje.

2- De la forma como estás contando el tiempo, usando "delay_ms", no sé si sea la más apropiada. Porque así el programa se detendrá por el tiempo que le insertes al delay, y no estará evaluando el estado del pin sino hasta que termine de ejecutarse el delay. Por ejemplo, si evalúas el estado de RB0 y está en alto, pero ejecutas el delay_ms(500)... si el estado pasa a 0 y vuelve a 1 en ese tiempo, el pic ni se enterará... ahora bien, todo depende de qué es lo que tienes conectado a RB0 y si eso que tienes conectado no variará tan rápido de manera que lo puedas detectar de 500ms en 500ms (como lo haces usando el for). Si es así, me parece excelente la manera como lo estás haciendo.

En lo que tenga un chance trataré de compilar tu código y simularlo en el proteus, pero sería bueno que nos dijeras de antemano qué parte es la que no funciona. Además, creo que aún no nos has especificado qué pic es el que estás usando. También sería bueno que lo hicieras.
Por otro lado, hay muchas definiciones que no veo en el código, como los fuses, #uses, etc... no sé si las tienes en ese archivo hopper.h; en caso de ser así podrías también incluir ese archivo para compilarlo todo completo.

Ok es todo por ahora, nos leemos!
Felicidades por tus progresos y sigue adelante!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web