Autor Tema: Uso de funciones en ccs c  (Leído 2498 veces)

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

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Uso de funciones en ccs c
« en: 13 de Diciembre de 2010, 19:25:01 »
Hola a todos. Estoy utilizando el CCS C hace tiempo y me ha surgido una gran duda. Se trata sobre el uso de las funciones en los programas. Si tengo dos funciones separadas y una llama a la otra, (ninguna de las dos es la función principal main() ), como tengo que definirlas para que me guarde las variables correspondientes. Lo estoy simulando y cuando, por ejemplo, se ejecuta la función "read_adc101s021" y llega a return(resutl) el programa sale de la función pero no me guarda el valor en la variable y por lo tanto la próxima función toma cualquier valor.
 Más abajo muestro dos funciones. La función "calibracion_adc101s021" llama a la función "read_adc101s021" y esta debería devolver "result" pero no lo hace.

Muchas Gracias.



int16 read_adc101s021(void)
{
int8 lsb;
int8 msb;
int16 result;

output_low(ADC101S0121_CS);
msb = spi_read(0);
lsb = spi_read(0);
output_high(ADC101S0121_CS);

result = make16(msb,lsb);                          
result >>= 3;                                  
result &= 0x3FF;                                
return(result);
}


calibracion_adc101s021(int16 result){

int z;                                          
int16 centro;                           //Variable de uso local

centro=0;

for(z=0; z<=7; z ++){                            //leemos 8 veces el valor de adc101s021
read_adc101s021();
centro = centro + result;
}
centro = centro >>= 3;                           //Corremos 3 bits hacia la derecha. Equivale a dividir por 3
return(centro);
}

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Uso de funciones en ccs c
« Respuesta #1 en: 13 de Diciembre de 2010, 20:20:54 »
Hola Pchuqui_1

debería ser así:


centro = centro + read_adc101s021();


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

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Uso de funciones en ccs c
« Respuesta #2 en: 13 de Diciembre de 2010, 20:24:17 »
Claro, read_adc101s021() te devuelve un valor de 16-bits, pero tu no se lo asignas a ninguna variable al realizar su llamado, entonces el valor que devuelve se pierde.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado bigluis

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 511
    • Tutoriales de Qt C++
Re: Uso de funciones en ccs c
« Respuesta #3 en: 13 de Diciembre de 2010, 20:34:27 »
En otras palabras, para que una función devuelva un valor debes hacer que este se le asigne a una variable de la función que llamó a la otra.

Por ejemplo:
Código: [Seleccionar]

int funcion1(int var1,...){
   int aux;  //declaras la variable interna aux
   ...
   return aux; //regresas el valor de la variable aux;
}

int funcion2(int var1,...){
   int var_interna;  //Declaras una variable interna
   ...
   var_interna=funcion1(var1,...);//El valor de retorno de la funcion1 se almacena en var_interna.
   ...
}
Tutoriales de Qt C++

No es necesario que hagamos Grandes cosas, sino que lo que hagamos sea importante.

SI la NECESIDAD es la MADRE del CONOCIMIENTO, SEGURAMENTE la PEREZA su TÍA.

Cuando el ARTE requiere de PRECISION le llamamos CIENCIA

Desconectado Pchuqui_1

  • PIC16
  • ***
  • Mensajes: 187
Re: Uso de funciones en ccs c
« Respuesta #4 en: 14 de Diciembre de 2010, 01:12:57 »
Hola muchachos!! Gracias por las respuestas, pude solucionar el problema. Realmente me hizo renegar.  Bueno.... todavía no terminé,  :oops: estoy intentando hacer lo inverso, meter datos a una función. Ahora desde la función "main()" ya tengo todas las variables y las quiero utilizar en otra función, estuve intentando hacerlo de esta forma, según lo que leí en el foro, pero no me da resultado, me tira un error en la compilación. Es posible pasar variables de este modo?
Desde la función "main()" quiero pasar las variables "adc_result" y "valor" a la función "Do_Math".
No sé si esta es una forma normal de armar una librería. Lo que yo pretendo es armar la librería con varias funciones, donde cada función tenga un trabajo especifico y luego ir llamándolas desde el programa principal... pero nunca se me ocurrió encontrarme con todo esto... jaa Si alguien cree que es mejor hacerlo de otra forma, que lo haga saber.  :lol:

Muchas Gracias.


void main(){
int16 adc_result,valor;
valor=0;

adc_adc101s021_init();                     //Inicializa la conversión

setup_spi(SPI_MASTER | SPI_MODE_3 | SPI_CLK_DIV_16);
//delay_ms(10);

valor=calibracion_adc101s021();                           

while(1)
  {
   adc_result=read_adc101s021();
   adc_result=Do_Math(int16 adc_result, int16 valor);                                 
 
   glcd_init(on);                  //con esta se enciende la pantalla

   displayVoltage(adc_result);                //llama la secuencia que convierte el valor adc en texto

               }      

}



int16 Do_Math(int16 adc_result, int16 valor){
int16 result,centro,adc_result,valor;
int16 delta,CWorCCW,CW;                           
                                     

CW=1;
delta = (adc_result - centro);                                                                            
CWorCCW = ((0x8000 && delta) >> 15);                
if (CWorCCW=CW){   
    delta = -delta;                              
               }
return(delta);
               }

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Uso de funciones en ccs c
« Respuesta #5 en: 14 de Diciembre de 2010, 10:14:58 »
Tienes que leer un manual básico de C. Busca por la web, hay uno que dice "Aprendiendo C en 21 días".


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Uso de funciones en ccs c
« Respuesta #6 en: 14 de Diciembre de 2010, 14:02:40 »
tienes declarada adc_result en dos partes. yo no se... pero no es buena idea declarar variables con el mismo nombre en diferentes partes del código, porque en caso de haber algo incorrecto no sabemos que valor tendrá en determinado momento.

para manejar variables en funciones hay dos formas

variable global y local

si es para ámbito global, entonces declaras la variable fuera de cualquier función,

o

utilizas punteros.




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


 

anything