Argumentos PIC XC8 redeclarados

Estoy tratando de conocer mi PIC con proyectos simples de 'puesta en marcha'. Hice un flash LED con un botón. Hice un conteo BCD de 0 a 9 con un retraso.

Ahora quiero combinar esos dos y también refractar un poco el código. Así que quiero que el BCD aumente con cada pulsación de botón. Idealmente, eso usaría una interrupción, pero no es necesario para esta aplicación. El siguiente paso sería usar la interrupción y tener dos entradas (para subir o bajar) y luego cambiar los botones por un codificador giratorio.

Las preguntas que tengo son:

  • ¿Dónde debo 'almacenar' el valor actual en el BCD? una var global en main?
  • ¿Por qué obtengo este tipo de error redeclarado y la función declarada como advertencia int implícita?

El BCD está en PORTA, la entrada (activa baja) está en PORTB.RB0 Estos son los dos programas que realmente funcionan:

void main(void)
{
    /* Configure the oscillator for the device */
    ConfigureOscillator();

    /* Initialize I/O and Peripherals for application */
    InitApp();

    while(1)
    {
        if (PORTBbits.RB0 == 0){
            PORTAbits.RA2 = 1;
        } else {
            PORTAbits.RA2 = 0;
        }
    }
}

Tenga en cuenta que RA2 estaría conectado a un LED normal. Y para el contador:

void main(void)
{
/* Configure the oscillator for the device */
ConfigureOscillator();

/* Initialize I/O and Peripherals for application */
InitApp();

// lookup table for BCD
const uint8_t pat7seg[10] = {
    // RA0:6 = ABCDEFG
    // RA7:0 = FG-EDCBA
    0b01000000, // 0
    0b11111001, // 1
    0b10000100, // 2
    0b10010000, // 3
    0b00011001, // 4
    0b00010010, // 5
    0b00000010, // 6
    0b11111000, // 7
    0b00000000, // 8
    0b00010000, // 9
};

// current digit
uint8_t digit;
digit = 0;

while(1)
{
    for(digit = 0; digit < 10; digit++){
        PORTA = pat7seg[digit];
        __delay_ms(2000);
    }
}

}

Así que traté de 'combinar' estos como:

void main(void)
{
/* Configure the oscillator for the device */
ConfigureOscillator();

/* Initialize I/O and Peripherals for application */
InitApp();

// current digit
uint8_t digit;
digit = 0;

while(1)
{
    /* TODO <INSERT USER APPLICATION CODE HERE> */
    /*for(digit = 0; digit < 10; digit++){
        PORTA = pat7seg[digit];
        __delay_ms(2000);
    }*/
    if (PORTBbits.RB0 == 0){
        digit = updateBCD(digit);
    }
}

}

uint8_t updateBCD(uint8_t myCount) {

    /* define constant for lookup BCD */
    // common anode so, inverted
    const uint8_t pat7seg[10] = {
        // RA0:6 = ABCDEFG
        // RA7:0 = FG-EDCBA
        0b01000000, // 0
        0b11111001, // 1
        0b10000100, // 2
        0b10010000, // 3
        0b00011001, // 4
        0b00010010, // 5
        0b00000010, // 6
        0b11111000, // 7
        0b00000000, // 8
        0b00010000, // 9
    };

    if (myCount < 9){
        myCount++;
    } else {
        myCount = 0;
    }
    PORTA = pat7seg[myCount];

    return myCount;
}

errores: (908) exit status = 1 main.c:46: advertencia: (361) función declarada implícita int make[2]: * [build/XC8_16F628/production/main.p1] Error 1 make[1]: * [ .build-conf] Error 2 main.c:52: error: (984) tipo redeclarado make: * [.build-impl] Error 2 main.c:52: error: (1098) declaraciones en conflicto para la variable "updateBCD" ( principal.c:52)

Uso un PIC16F628 y MPLAB X IDE 2.00 con compilador XC8.

Espero que puedas ayudar.

Mueva toda la updateBCDfunción antes de la función main() o simplemente inserte una declaración de la función antes de main(), así:uint8_t updateBCD(uint8_t myCount);

Respuestas (1)

En C, la mejor práctica es usar prototipos. Generalmente, desea declarar sus prototipos de funciones en un archivo de encabezado. Para su código, tal vez llame al archivo de encabezado BCD.h y créelo en la sección 'Archivos de encabezado' de MPLAB. El código del archivo de encabezado debería ser similar al siguiente:

#ifndef BCD_H
#define BCD_H

uint8_t updateBCD(uint8_t);

#endif 

luego agregue la siguiente línea a main.c

#include "BCD.h"

Explicación: en su código, cuando el compilador encuentra la línea "dígito = actualizar BCD (dígito)", el compilador aún no conoce la función actualizar BCD. Esta es la declaración implícita. Mover la declaración de updateBCD antes de main ayuda a que el compilador sepa acerca de updateBCD antes de que encuentre "digit = updateBCD".

Desde el punto de vista de la programación, esto sigue siendo algo indeseable porque entonces debe preocuparse por el orden en que declara sus funciones. Además de ser molesto para el codificador, también puede hacer que el código sea más difícil de leer e interpretar para otros. El uso de prototipos de funciones en archivos de encabezado alivia estos problemas.