Autor Tema: IF - valida funciones con paso de parametros - Proteus - CCS  (Leído 8535 veces)

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

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
IF - valida funciones con paso de parametros - Proteus - CCS
« en: 06 de Septiembre de 2009, 10:30:37 »
Hola amigos

Con el compilador de CCS y el simulador Proteus, durante la prueba del codigo tengo unos problemillas que en principio no son lógicos.

Se trata de un decrementador de uno en uno, acotado por una condicion doble, que se le pasa a la función, el problema es que al decrementar pasa a valores negativos, en un primer momento pense que no entraba en el buble de acotaba los valores.
evalue los parametros de entrada y siempre estan a cero, cuando deberian de estar un valor a cero y el otro a uno inicializados como variables globales, por que asi los puse en la condicion, cuyo parametro se le pasa a la función, para que al llegar a la evaluación acote el contador.

en el programa principal cuando llamo a la funcion:

Código: CSS
  1. temp_hms=inc_dec(hms,HE,pulsa02,pulsa03,temp_hms);


El problema es que no quiero que de 0 pase a -1-2-3 sino de de 0 al valor que yo le ponga o le pase.

la comparación la puse con un if:
 
Código: CSS
  1. if((hms==1)&(HE==0))
  2. {
  3.  if(dec==0){dec=12}
  4. }

proble a cambiar el tipo de variable unsigned int, pero aun asi, sale negativo.

Teoricamente deberia de poder decrementar de 12 a 1 y si es cero o llega a 0 sea 12 de nuevo.
pero cuando empieza con los negativos hace:
-1 -2 -3 -4 -5 -6 -7 -8 -9 -0 y vuelve a empezar con -1

si pulso el incrementador y pongo a 1 y despues el decremetador todo funciona, será cosa del cero, que lógica tiene este problema?


¿que puede ocurrir?¿por que no lee los valores de hms y He?si entra en el bucle de acotado¿ por que me sale valores negativos?
como considera al cero?

Un saludo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #1 en: 06 de Septiembre de 2009, 10:36:03 »
Probaste colocando if(dec<1) ?
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #2 en: 06 de Septiembre de 2009, 11:32:19 »
Hola Suky

Si eso fue lo primero que probe, pero imprimo las valores pasados a entrada de la función,

Código: CSS
  1. temp_hms=inc_dec(hms,HE,pulsa02,pulsa03,temp_hms);

es decir el valor de hms y He, las coge siempre como 0 y eso que estan definidas e inicalizadas como variables globales, deberian de perdurar
o eso pienso yo.

int hms=1,HE=0;

pero aun forzandolas asi:


Código: CSS
  1. temp_hms=inc_dec(1,0,pulsa02,pulsa03,temp_hms);

siguen saliendo negativas,

que cosa sera...




« Última modificación: 06 de Septiembre de 2009, 11:35:57 por pajaro »

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #3 en: 06 de Septiembre de 2009, 11:58:50 »
...la comparación la puse con un if:
 
Código: CSS
  1. if((hms==1)&(HE==0))
  2. {
  3.  if(dec==0){dec=12}
  4. }
...

cuando es una comparación se usa doble operador, tiene que ser:

Código: CSS
  1. if((hms==1)&&(HE==0))
  2. {
  3.  if(dec==0){dec=12}
  4. }

mas elegante

Código: CSS
  1. if((hms)&&(!HE))
  2. {
  3.  if(dec<1){dec=12}
  4. }



La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #4 en: 06 de Septiembre de 2009, 19:12:22 »
hola amigo

sigo probando el programa, creo que el problema tiene que ver con el if,
probe como dice palitroqueZ

si pongo:
Código: CSS
  1. if((hms==1)&&(HE==0)
  2. {
  3. if(dec==1){dec=12;}
  4. }


no me lo hace bien, por que no quiero imprimir el el 0,pero si hago:

Código: CSS
  1. if((hms==1)&&(HE==1)
  2. {
  3. if(dec==0){dec=12;}
  4. }

 
o asi :

Código: CSS
  1. if((hms==1)&&(HE==1)
  2. {
  3. if(dec<1){dec=12;}
  4. }


si que me saca los negativos, y no quiero que me saque los negativos.




Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #5 en: 06 de Septiembre de 2009, 19:42:07 »
Hola pàjaro.

Realmente no entiendo bien el problema. Podrìas poner:
la definiciòn de cada una de las variables en juego;
la lìnea en la cual llamas a la funciòn;
y el còdigo de la funciòn en cuestiòn?

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #6 en: 06 de Septiembre de 2009, 20:20:39 »
Hola BrunoF

la funcion la llamo desde una funcion principal:


funcion principal:
Código: CSS
  1. ...
  2. ..
  3. #include<libreria.c>
  4. .
  5. #use fast_io(A)
  6. #use fast_io(B)
  7. #use fast_io(C)                     ///   con esta instruccion evitamos que
  8. #use fast_io(D)                     ///   se este configurando cada vez que usamos
  9. #use fast_io(E)                     ///   alguna instruccion de entrada o salida
  10.  
  11. #byte portc = 7                     /// se definen direcciones de memoria
  12. #byte portd = 8
  13.  
  14. #byte p1 = PIN_A0
  15. #byte led1 = PIN_C0
  16.  
  17. ////////////////
  18. #define pulsa01 input(PIN_A0)
  19. #define pulsa02 input(PIN_A1)
  20. #define pulsa03 input(PIN_A2)
  21. ////////////////////////////////// Variables//////////////
  22. //int desplaza=1;
  23. //int n=0;
  24. //int tempH,tempM,tempS;
  25.  
  26.  
  27. //////////////////ini config
  28. int hms=1;  //1 h,2 mm,3 s
  29. int HE=0; //0->12h;1->24h
  30.  
  31. //-------------------------------
  32.  
  33. ///////////////////////////////////////////////////////////////////////////////////
  34. //////////////////////Comienzo de la funcion principal//////////////////////////
  35. ///////////////////////////////////////////////////////////////////////////////////
  36. void main()
  37. {
  38. //:::
  39. int desplaza=1;         //bucle
  40. int temp_hms;           //i/o contadores
  41. //int hms=1;                //seleciona h,m,s,
  42. //int HE=0;
  43. //
  44. //:::
  45.  
  46.    set_tris_a(0x3F);       //entrada  0011 1111
  47.  //set_tris_b(0x00);       //salida   0000 0000
  48.    set_tris_d(0x01);       //salida   0000 0001
  49.  //set_tris_c(0xc3);
  50.    set_tris_e(0x01);
  51.    port_b_pullups(true);
  52.  
  53.   lcd_init();              /// inicializamos lcd
  54.  
  55.  
  56.    
  57. while(desplaza==1)
  58. {
  59.  
  60. temp_hms=inc_dec(hms,HE,pulsa02,pulsa03,temp_hms);
  61. }


función cargada se encuentra en libreria.c

libreria.c
Código: CSS
  1. ////-------------- Incremento/Decremento --------------------------////
  2.  
  3. int inc_dec(int hms, int He, int pulsa02, int pulsa03,int temp_hms)
  4. {
  5. int inc,dec;
  6.  
  7.    //incrementador
  8.    if(pulsa02==1)
  9.    {
  10.     delay_ms(300);
  11.      if(pulsa02==1)
  12.       {
  13.       printf("dentro de incremento\r");
  14.        inc=temp_hms;
  15.        inc=inc+1;
  16.        printf(" hms:%02d  HE:%02d  temp_hms:%02d\r",hms,HE,temp_hms);
  17.       ///////////////////// horas ////////////////////
  18.        If((hms==1)&&(HE==1))
  19.         {
  20.          if(inc>23){inc=0;}
  21.         }
  22.        if((hms==1)&&(HE==0))
  23.         {
  24.          if(inc>12 ){inc=1;}
  25.         }
  26.       //////////////////////////////////////////
  27.       temp_hms=inc;
  28.       }
  29.       lcd_gotoxy(10,1);
  30.       printf(lcd_putc,"%02d",inc);
  31.    }
  32.  
  33.   //decrementador
  34.    if(pulsa03==1)
  35.     {
  36.      delay_ms(300);
  37.      if(pulsa03==1)
  38.       {
  39.        printf("dentro de decremento\r");      
  40.        dec=temp_hms;
  41.        dec=dec-1;
  42.        printf(" hms:%02d  HE:%02d  temp_hms:%02d\r",hms,HE,temp_hms);
  43.        //////////////////horas///////////////////////
  44.        if((hms==1)&(HE==1)) //seleciona h y HE [[Este sera por defecto]]
  45.         {
  46.          if(dec==-1){dec=23;} ////////////cambiar para modo dual =12+HE; HE=0, 11;
  47.         }
  48.        if((hms==1)&(HE==0))
  49.         {printf("entro en bucle de 1-12 \r");
  50.          if(dec==-1){dec=12;}
  51.         }
  52. //////////////////////////////
  53.        temp_hms=dec;
  54.       }
  55.       lcd_gotoxy(14,1);
  56.       printf(lcd_putc,"%02d",dec);
  57.     }
  58.     lcd_gotoxy(18,1);
  59.     printf(lcd_putc,"%02d",temp_hms);
  60.     return(Temp_hms);
  61. }
  62.  
  63. ////---------------------------------------------------------------////

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #7 en: 06 de Septiembre de 2009, 20:56:31 »
Hola!

No es para nada recomendable que uses el mísmo nombre para una variable global y una local.

hms y FE son dos variables que declaraste tanto como globalmente, como localmente en int_dec().

Hay que destacar que cuando hacés:

Código: [Seleccionar]
temp_hms=inc_dec(hms,HE,pulsa02,pulsa03,temp_hms);
como tu declaración de la función es:

Código: [Seleccionar]
int inc_dec(int hms, int He, int pulsa02, int pulsa03,int temp_hms)
en realidad, se hace una copia del hms y HE global. NO SE USAN LAS VARIABLES GLOBALES SINO UNA COPIA DE ELLAS.

Si en la función:

Código: [Seleccionar]
int inc_dec(int hms, int He, int pulsa02, int pulsa03,int temp_hms)
el argumento hms y He siempre van a ser las variables globales hms y HE, no te conviene hacer lo que estás haciendo.

Sencillamente, quitá de la función ambos parámetros, quedando:

Código: [Seleccionar]
int inc_dec(int pulsa02, int pulsa03,int temp_hms)
De esta manera, cada vez que te refieras a hms o a HE, el compilador sabrá que te estás refiriendo a las que declaraste globalmente.

Entonces, como recomendación debo decir que:

Nunca utilices el mísmo nombre para una variable que exíste globalmente y un argumento de una función, porque dependiendo del compilador, a veces asumirá que te estás refiriendo a la variable local y otras a la global.

Saludos.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #8 en: 07 de Septiembre de 2009, 20:23:40 »
Hola BrunoF

Utilizo el mismo nombre ya que es la misma varible, hms y HE, es una variable global, que dependiedo de su valor la función  hace una cosa o hace otra, digamos que es un parámetro de control, esta variable posteriormente se podra, poner en un valor o en otro dependiendo del menu de configuracion.

Por esto mismo no puedo quitar esas variables de la función, son las que controlan a la función.

Pero sigo sin entender por que se imprimen números negativos.

Un saludo.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #9 en: 07 de Septiembre de 2009, 22:13:35 »
Por eso mísmo. Si son globales, no las pidas como argumentos de la función. Existen en todo el ambito del proyecto.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #10 en: 08 de Septiembre de 2009, 13:06:08 »
Hola Amigo bruno

Pero si no se las paso en cabecera como se entera la función, de que valor tiene en ese momento esas variables.
Y si hago referencia a la varible dentro de la funcion, me pedira que se la defina, y solo tendra vida dentro de función llamada cosa que no es lo que quiero.

Un saludo amigo.



Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #11 en: 08 de Septiembre de 2009, 13:11:11 »
Las variables globales están para toooodas las funciones y podes modificarlas en cualquiera.
Pero si no se las paso en cabecera como se entera la función, de que valor tiene en ese momento esas variables.
:? Porque lo tiene cargado!!
No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #12 en: 08 de Septiembre de 2009, 13:45:06 »
Hola amigo Suky

Si pero.. el tema es que si creas una función y quieres usar una varible dentro de esa función por mucho que sea global debes definirla, o te tira errores.

Si la defines, le dedicas memoria durante su ejecucuión, y si le pongo el mismo nombre le dara preferencia a la local, sobre la global, pero si le cambio de nombre defino dos variables para la misma cosa, y seria derrochar la memoria, por eso prefiro no definirla y pasarsela como parametro,
de lo contrario.., el compilador no la encuentra definida y tira errores.

No se si estare equivocado, pero lo he probado con variable global, a usar esto en la  función y me dice "define variable..."o compila tu abuela..""


Un saludo amigo.
« Última modificación: 08 de Septiembre de 2009, 21:13:14 por pajaro »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #13 en: 08 de Septiembre de 2009, 13:49:01 »
Solo defines la global y nada más, y por ejemplo como te mostramos en el otro post la función resta y suma seria de la siguiente manera:
Código: C
  1. // Variables globales:
  2. int Resta, Suma;
  3.  
  4.  
  5. void Suma_Resta(int a, int b){
  6.  
  7.     Suma=a+b;
  8.     Resta=a-b;
  9. }

Se modifica las variables globales y no se crea otras!

No contesto mensajes privados, las consultas en el foro

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: IF - valida funciones con paso de parametros - Proteus - CCS
« Respuesta #14 en: 08 de Septiembre de 2009, 14:03:21 »
hola Suky

Pero suma y resta no te da error?
no te pide que las definas

A mi me lo pide, no es broma.

A lo mejor tiene que ver con el número de fuentes, no lo se, pero me pide definirla

Código: CSS
  1. *** Error 12 "C:\...\fun.c" Line 353(4,8): Undefined identifier   Suma
  2. *** Error 12 "C:\...\fun.c" Line 354(4,9): Undefined identifier   Resta
  3. *** Error 28 "008_p_007.c" Line 215(12,13): Expecting an identifier
  4. *** Error 43 "008_p_007.c" Line 215(14,15): Expecting a declaration
  5. *** Error 43 "008_p_007.c" Line 215(15,16): Expecting a declaration
  6. *** Error 43 "008_p_007.c" Line 215(16,17): Expecting a declaration
  7. *** Error 43 "008_p_007.c" Line 219(1,2): Expecting a declaration
  8.       7 Errors,  0 Warnings.

Un Saludo
« Última modificación: 08 de Septiembre de 2009, 14:05:49 por pajaro »


 

anything