PIC XC8 redeclard argumentos

5

Estoy tratando de conocer mi PIC con proyectos simples de "inicio". Hice un flash LED con un botón. Hice un conteo de BCD de 0 a 9 con un retraso.

Ahora quiero combinar esos dos y también refractorar el código un poco. Así que quiero que el BCD se incremente en cada pulsación de botón. Lo ideal sería utilizar una interrupción, pero no es necesario para esta aplicación. El siguiente paso sería utilizar la interrupción y tener dos entradas (arriba o abajo) y luego cambiar los botones por un codificador rortario.

Las preguntas que tengo son:

  • ¿dónde debería "almacenar" el valor actual en el BCD? una var global en principal?
  • ¿por qué obtengo este tipo de error y la función declarada como implícita como advertencia?

El BCD está en PORTA, la entrada (activo bajo) 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 se conectaría 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) estado de salida = 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 redeclared make: * [.build-impl] Error 2 main.c: 52: error: (1098) declaraciones en conflicto para la variable "updateBCD" (main.c: 52)

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

Espero que puedas ayudar.

    
pregunta Jeroen

1 respuesta

6

En C es una buena práctica usar prototipos. Generalmente, usted desea declarar sus prototipos de funciones en un archivo de encabezado. Para su código, quizás 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 debe ser similar al siguiente:

#ifndef BCD_H
#define BCD_H

uint8_t updateBCD(uint8_t);

#endif 

luego agrega la siguiente línea a main.c

#include "BCD.h"

Explicación: En su código cuando el compilador encuentra la línea "digit = updateBCD (digit)" el compilador aún no conoce la función updateBCD. Esta es la declaración implícita. Mover la declaración de updateBCD a la ayuda principal antes de que el complaciente sepa sobre updateBCD antes de encontrar "digit = updateBCD".

Desde el punto de vista de la programación, esto todavía es un poco indeseable porque entonces debe preocuparse por el orden en el que declarar sus funciones. Además de ser molesto para el programador, 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 los archivos de cabecera alivia estos problemas.

    
respondido por el SomeEE

Lea otras preguntas en las etiquetas