2 votos

c18 coding advice / braces error / function declaration help

No tengo casi ninguna experiencia de codificación, así que por favor disculpe el estilo crudo y verborrea de comentarios. Estoy tratando de tomar muestras de 4 sensores (1 cada 15 minutos). Pensé que sería más eficiente tener el delay y data_write funciones como funciones separadas para llamar, pero eso no está funcionando muy bien. Constantemente obtengo el siguiente error:

Error [1302] no se admiten las declaraciones de funciones de estilo antiguo

al final del data_write independientemente de dónde y cómo coloque los corchetes (anidados, en la misma línea, eliminados, etc.). delay no da error si es antes o después de la función data_write función.

No dude en recomendarme un diseño mejor. Además, realmente no tengo ninguna comprensión de la memoria de datos por lo que esta rutina es probablemente basura, lo sé. Aunque extrañamente no me está dando ningún error así que no le miraré el diente a ese caballo regalado todavía.

\=====================================

    #include <stdio.h>
    #include <stdlib.h>
    #include <p18f452.h>
    #include <delays.h>
    #include <adc.h>

    int result;                         // used in ADC result handling
    int i;                              // used in delay loop/function
    int data_adr=0x64;                  // used in data_write function. initial=d100

    // assuming 4MHz oscillator => 8fosc.   Tinst= (4)*Tosc = (4)*(250ns) = 1us
    // all 4 sensors should read every minute so each will begin sequentially,
    // after 15sec delay from previous ADC conversion completes.

    void delay (void);                 // delay function prototype declaration
    void data_write (int, int);             // data-write function prototype declaration

    main()
    {
    // I think I need a while (1) loop here to repeat the loop forever???

    // sensor 1 configured to port AN0
        OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_5ANA_0REF, ADC_CH0 & ADC_INT_OFF);
                            //configures ADC for port AN0 = sensor 1 input
            delay();                    // call the delay function
            ConvertADC();               // initiate conversion of sensor1 @ AN0
            while(BusyADC());           // waiting to complete conversion
            result=ReadADC();           // read the result of sensor1 @ AN0
            data_write();               // call data_write function
        CloseADC();

    // sensor 2 configured to port AN1
        OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_5ANA_0REF, ADC_CH1 & ADC_INT_OFF);
                            //configures ADC for port AN1 = sensor 2 input
           delay();
           ConvertADC();
           while(BusyADC());
           result=ReadADC();
           data_write ();
        CloseADC();

    // sensor 3 configured to port AN2
        OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_5ANA_0REF, ADC_CH2 & ADC_INT_OFF);
                            //configures ADC for port AN2 = sensor 3 input
           delay();
           ConvertADC();
           while(BusyADC());
           result=ReadADC();
           data_write ();
        CloseADC();

    // sensor 4 configured to port AN3
        OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_5ANA_0REF, ADC_CH3 & ADC_INT_OFF);
                            //configures ADC for port AN3 = sensor 4 input
           delay();
           ConvertADC();
           while(BusyADC());
           result=ReadADC();
           data_write ();
        CloseADC();

        return (result);
    }

    // Delay function sequence
    void delay (void)
    {                                       // 15second delay routine
                                    // 15sec/Tinst= 15sec/1us
                                    // = 15*10^6 Tinst = 10K * 1500
                                    // Delay10KTCYx(1)= 0.01sec
                                    // = (10K)*(250)*(6)
        i=6;
        while(i>0) {
           Delay10KTCYx(250);      // 2.5sec delay
            i=i--;                  // run 6 times for total 15sec delay loop
        }
        return;
    }

    // data write sequence
    void data_write (data_adr, result) {
         _asm
         movlw  data_adr        // starting data memory address = data_adr
         movwf  EEADR,A
         movlw  result              // gets data stored in "result" variable
         movwf  EEDATA,A            // places data into data memory holder
         bcf    EECON1,EEPGD,A      // points to data memory
         bcf    EECON1,CFGS,A       // access data eeprom
         bsf    EECON1,WREN,A       // enable write to data EEPROM
         bcf    INTCON,IE,A         // disable interrupt
         movlw  0x55                // start flash erase sequence
         movwf  EECON2,A
         movlw  0xAA
         movwf  EECON2,A            // end flash erase sequence
         bsf    EECONN1,WR,A        // enable bit to start the write operation
         bsf    INTCON,GIE,A        // re-enable interrupt
         bcf    EECON1,WREN         // restores the write command to =disabled
         _endasm

         data_adr = data_adr+2;
         if (data_adr >= 0xC6)      // if address >= d'198
             data_adr = 0x64;       // resets starting point to d'100

        return; }

2voto

Jim Paris Puntos 2310

Todas las demás respuestas tienen puntos buenos, y señalan otros problemas, pero la específico razón por la que recibe el error old style function declarations not supported es porque tu data_write a la declaración de la función le faltan los tipos. Debe cambiarse de

void data_write (data_adr, result)

a

void data_write (int data_adr, int result)

1voto

travis Puntos 260

En primer lugar, deshacerse de la devolución en la función principal. ¿A dónde vas a devolver los datos? No hay sistema operativo y return no tiene sentido, por lo que podría ser fuente de algunos problemas.

¿Cómo va a generar los datos exactamente? Parece que estás tratando de escribir en la memoria de datos, pero ¿qué vas a hacer después de eso, quitar el chip y leer físicamente la EEPROM utilizando un programador?

A continuación, sí que necesita while (1) para mantener el bucle correctamente alrededor de la función. Usted puede obtener algún tipo de bucle, incluso sin while. Si no recuerdo mal, el flash del PIC18 está lleno de NOPs por defecto. Seguirá ejecutando instrucciones hasta que se alcance el final del espacio de direcciones después de lo cual debería (de nuevo si no recuerdo mal) envolverse y volver a la primera instrucción. Usted no debe confiar en esta característica y en su lugar debe envolver el contenido de main con while (1) o equivalente.

A continuación, los propios errores: Bueno, el manual del compilador dice que no tiene nada que ver con las llaves. Está relacionado con el estilo de declaración de la función. En realidad necesitas escribir el tipo de la variable y el nombre cuando declaras una función. Lo que has creado son variables con el mismo nombre que las variables globales. Cuando tu código está en función, no usará variables globales. En su lugar utilizará variables locales con ese nombre que enmascararán las variables globales.

Además estás llamando mal a las funciones. Tienes que listar los argumentos cuando llames a funciones.

A continuación, en C18 el prototipo para main tiene que ser void main (void), lo que va bien con la regla de no retorno que mencioné antes.

También parece que llamas incorrectamente al registro. Intenta leer en el manual de usuario como el C18 llama a cada registro en el PIC y como direccionar cada bit individual de un registro. Por ejemplo, usarías INTCON1bits.GIE para acceder al bit de habilitación de interrupción general en el registro de control de interrupción uno.

Otra cosa que he notado es que usas int para el contador del bucle. No lo hagas si puedes evitarlo. Intenta usar chars tanto como sea posible ya que son el tipo de datos nativo del MCU. Los int tardarán más en procesarse y darán como resultado bucles más lentos de lo esperado.

También ha mencionado las funciones y la eficacia. Ten en cuenta que C18 no puede hacer in-lining de funciones, así que si alguna vez tienes la necesidad de llamar eficientemente a una función, vas a tener que reemplazarla con una macro.

1voto

SandeepJ Puntos 1339

Como señala Andreja, no estás utilizando correctamente la sentencia return.
Además, ahora que se ha editado el mensaje de error real, queda claro que el error está relacionado con su data_write se debe a que no se declaran los tipos de argumento, tal y como indica Jim en su respuesta. Puedes ver ejemplos de cómo deberían declararse en el código siguiente.

En return se utiliza para devolver un resultado a la persona que llama, de un tipo determinado dictado por la definición de la función.

Por ejemplo, esta función devuelve un int:

int add(int a, int b)
{
    int c;
    c = a + b;
    return c;
}

Para utilizar lo anterior, se hace algo como:

int result;
result = add(5, 6); // result = 11

Pero esta función no acepta ningún argumento ni devuelve nada (nótese el signo void tipo de retorno/argumento):

void do_something(void)
{
    // do something here...
    //
}

Hay muchos usos para una función sin retorno/argumentos - por ejemplo, configurar un periférico, initalizar la memoria, etc.

Otra forma de obtener información de una función es utilizar un puntero pasado como argumento:

void add(int a, int b, int* p_result)
{
    int temp;
    temp = a + b;
    *p_result = temp;
}

Para utilizar lo anterior, pasamos la dirección de la variable de resultado como 3er argumento (el argumento & operador):

int result = 0;
int a = 6;
int b = 5;
add(a, b, &result); // result will equal 11 on function return

Así que espero que veas que no sirve de nada tener un return para una función declarada como void (a menos que desee volver antes como parte de alguna lógica de decisión - similar a continue y break Si desea devolver algo, declare el tipo al principio de la definición de la función. Como Andreja sugiere, yo haría un poco de lectura sobre los fundamentos C funciones y punteros.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X