c18 consejo de codificación / llaves ayuda / declaración de función help

2

No tengo casi NINGUNA experiencia en codificación, así que disculpe el estilo burdo y los comentarios detallados. Estoy tratando de muestrear desde 4 sensores (1 cada 15 minutos). Pensé que sería más eficiente tener las funciones delay y data_write como funciones separadas para llamar, pero eso no está funcionando muy bien. Recibo constantemente el siguiente error:

  

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

al final de la función data_write no importa dónde ni cómo coloquen las llaves (anidada, misma línea, eliminar, etc.) La función delay no da el error, ya sea antes o después de data_write de función.

Por favor, siéntase libre de recomendarme un mejor diseño para mí. Además, realmente no entiendo la memoria de datos, por lo que esta rutina es probablemente una mierda, lo sé. Aunque, extrañamente, no me está dando ningún error, así que no miraré ese caballo de regalo en la boca 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; }
    
pregunta Mark

3 respuestas

2

Todas las demás respuestas tienen buenos puntos, y señalan otros problemas, pero la razón específica por la que está recibiendo el error old style function declarations not supported es porque a su declaración de función data_write les faltan los tipos . Necesita ser cambiado desde

void data_write (data_adr, result)

a

void data_write (int data_adr, int result)
    
respondido por el Jim Paris
1

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

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

A continuación, sí, sí necesita while (1) para mantener el bucle correctamente alrededor de la función. Puede obtener algún tipo de bucle incluso sin tiempo. Si recuerdo correctamente, el flash PIC18 se llena de manera predeterminada con NOP. Seguirá ejecutando instrucciones hasta que se llegue al final del espacio de direcciones, después de lo cual debería (nuevamente, si recuerdo bien) envolver y volver a la primera instrucción. No debe confiar en esta función y, en su lugar, debe envolver el contenido de main con while (1) o equivalente.

A continuación, los errores en sí mismos: Bueno, el manual del compilador indica que no está relacionado con llaves en absoluto. Está relacionado con el estilo de declaración de función. Realmente necesitas escribir el tipo de la variable y el nombre al declarar una función. Lo que has creado son variables con el mismo nombre que las variables globales. Cuando su código está en función, no utilizará variables globales. En su lugar, utilizará variables locales con ese nombre que enmascarará las variables globales.

También estás llamando mal a las funciones. ¡Necesitas enumerar los argumentos cuando llamas funciones!

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

También parece llamar incorrectamente los nombres de registro. Intente realmente leer en el manual del usuario cómo C18 llama a cada registro en el PIC y cómo abordar cada bit individual de un registro. Por ejemplo, usaría 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 de bucles. No hagas eso si puedes evitarlo. Trate de usar los caracteres lo más posible, ya que son el tipo de datos nativos de la MCU. Ints tardará más en procesarse y dará como resultado bucles más lentos de lo esperado.

También mencionaste funciones y eficiencia. Tenga en cuenta que el C18 no puede realizar la función de alineación, por lo que si alguna vez tiene la necesidad de llamar a una función de manera eficiente, tendrá que reemplazarla con una macro.

    
respondido por el AndrejaKo
1

Como señala Andreja, no está utilizando la declaración de devolución correctamente.
Además, ahora que se ha editado el mensaje de error real, se aclara que el error relacionado con su data_write se debe a no declarar los tipos de argumentos como indica Jim en su respuesta. Puede ver ejemplos de cómo deben declararse en el código a continuación.

La instrucción return se usa para pasar un resultado al llamante, de un cierto tipo 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 usar lo anterior, haces algo como:

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

Pero esta función no acepta ningún argumento ni devuelve nada (tenga en cuenta el void return / tipo de argumento):

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

Hay muchas aplicaciones para una función sin retorno / argumentos, por ejemplo, configurar un periférico, inicializar la memoria, etc.

Otra forma de recuperar información de una función es usar un puntero pasado como argumento:

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

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

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

Esperamos que pueda ver que no sirve usar una declaración return para una función declarada como void , (a menos que desee regresar antes como parte de alguna lógica de decisión, similar a continue y break sentencias, que no tiene en sus funciones anteriores) Si desea devolver algo, declare el tipo al comienzo de la definición de la función. Como lo sugiere Andreja, leería algo sobre las funciones básicas de C y los punteros.

    
respondido por el Oli Glaser

Lea otras preguntas en las etiquetas