TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: black_flowers en 09 de Diciembre de 2010, 11:33:45

Título: variable global en c30.
Publicado por: black_flowers en 09 de Diciembre de 2010, 11:33:45
hola, ando intentando pasar una variable de un modulo a otro y no lo consigo, me explico.
Tengo un programa para un dspic que consta de tres ficheros: adc.c,lcd.c y main.c.
en el adc.c realizo todas las tareas del cad y es tambien donde está la rutina de interrupcion del cad. Ahí necesito definir una variable llamada AdcResult a la que asigno el valor del ADCBUF0, para luego acceder a ella desde el main. Entonces no puedo declarar AdcResult como variable local del adc.c sino que tiene que ser una variable global compartida por los dos modulos.

¿cómo puedo hacer esto?

un saludo.
Título: Re: variable global en c30.
Publicado por: Modulay en 09 de Diciembre de 2010, 11:37:54
Si la declaras como global dentro del modulo "adc.c" debería ser visible desde el main, siempre y cuando en este último esté la invocación a "adc.c"
Título: Re: variable global en c30.
Publicado por: migsantiago en 09 de Diciembre de 2010, 11:42:02
La puedes declarar en main.c como

int AdcRseult;

y luego en adc.c como

external int AdcResult;
Título: Re: variable global en c30.
Publicado por: Suky en 09 de Diciembre de 2010, 11:53:59
O al revés, declararla en ADC.c y colocarla como extern en main.

Modulay, en los compiladores de Microchip, como se trabaja con el proyecto, por lo general no se llama a un *.c


Saludos!
Título: Re: variable global en c30.
Publicado por: RICHI777 en 09 de Diciembre de 2010, 12:38:36
Hola, es buen criterio de programación la encapsulación de los datos. La idea es que las variables del módulo solo sean accedidas dentro del mismo módulo y que probeas una función para obtener ese valor, la cosa seria asi:

Modulo adc.h
Código: C
  1. ...
  2. unit8 GetADCResult( void );
  3. ...

Modulo ad.c
Código: C
  1. ...
  2. static uint8 LastADCValue;
  3.  
  4. unit8 GetADCResult( void )
  5. {
  6.   return( LastADCValue );
  7. }
  8.  
  9. interrupt ADC( void )
  10. {
  11.   LastADCValue = ADCBUF0;
  12. }

La variable global al módulo ADC es LastADCValue que solo este módulo accede, la función GetADCResult solo retorna el valor de la misma. Como esta función esta declarada en un H tiene visibildad global, pero ningún módulo externo puede alterar su valor.
Para los puristas seguramente esta solución demande más código en ROM, que es cierto, pero no deja de ser un buen criterio de programación que por ser criterio su valor de verdad es totalmente subjetivo.

Saludos !

Título: Re: variable global en c30.
Publicado por: RICHI777 en 09 de Diciembre de 2010, 12:54:20
...
Título: Re: variable global en c30.
Publicado por: black_flowers en 10 de Diciembre de 2010, 07:31:34
Hola, es buen criterio de programación la encapsulación de los datos. La idea es que las variables del módulo solo sean accedidas dentro del mismo módulo y que probeas una función para obtener ese valor, la cosa seria asi:

Modulo adc.h
Código: C
  1. ...
  2. unit8 GetADCResult( void );
  3. ...

Modulo ad.c
Código: C
  1. ...
  2. static uint8 LastADCValue;
  3.  
  4. unit8 GetADCResult( void )
  5. {
  6.   return( LastADCValue );
  7. }
  8.  
  9. interrupt ADC( void )
  10. {
  11.   LastADCValue = ADCBUF0;
  12. }

La variable global al módulo ADC es LastADCValue que solo este módulo accede, la función GetADCResult solo retorna el valor de la misma. Como esta función esta declarada en un H tiene visibildad global, pero ningún módulo externo puede alterar su valor.
Para los puristas seguramente esta solución demande más código en ROM, que es cierto, pero no deja de ser un buen criterio de programación que por ser criterio su valor de verdad es totalmente subjetivo.

Saludos !



es cierto que es un buen criterio de programación estructurada, pero... no iría un poco más lento que haciendolo directamente con la variable declarada como externa?

Título: Re: variable global en c30.
Publicado por: RICHI777 en 10 de Diciembre de 2010, 09:52:05
Hola,

Citar
es cierto que es un buen criterio de programación estructurada, pero... no iría un poco más lento que haciendolo directamente con la variable declarada como externa?

Correcto es mas lento, con el extern el compilador sabe exactamente donde se encuentra la variable. De esta manera se agrega el costo de la llamada a la función. Pero como casi todas las cosas en estos temas se trata de una decisión de trade-off ( compensación, balance ), se gana en encapsulación pero se pierde en perfomance, lo importante es saber donde existe el limite.

Saludos !
Título: Re: variable global en c30.
Publicado por: black_flowers en 10 de Diciembre de 2010, 18:18:58
pues muchas gracias, al final opté por la variable externa porque necesito que se transfiera lo más rápido posible,

un saludo. :)