5 votos

PIC XC8 argumentos redeclard

Estoy tratando de conocer a mi PIC con un simple 'start-up' de los proyectos. Hice un flash de LED con un botón. Hice un BCD contar de 0 a 9 con un retraso.

Ahora quiero combinar los dos y también refractor el código un poco. Así que quiero que el BCD para incrementar en cada botón de empuje. Idealmente que iba a usar un interrumpe, pero no es necesario para esta aplicación. El siguiente paso será utilizar la interrumpe y tiene dos entradas (para arriba o abajo) y, a continuación, intercambiar los botones para un rortary codificador.

Las preguntas que tengo son:

  • donde debo 'almacén' el valor de la corriente por el BCD? global var en la principal?
  • ¿por qué recibo este tipo de redeclared de error y la función declarada implícito int advertencia?

El BCD es de PORTA, la entrada (activa baja) está en el puerto PORTB.RB0 Estos son los dos progams 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 que estar conectado a una normal LED. 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" estas 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 principal.c:46: advertencia: (361) función declarada implícito int make[2]: * [crear/XC8_16F628/producción/main.p1] Error 1 make[1]: * [.construir-conf] Error 2 principal.c:52: error: (984) tipo de redeclared hacer: * [.construir-impl] Error 2 principal.c:52: error: (1098) contradictorias declaraciones para la variable "updateBCD" (main.c:52)

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

La esperanza puede ayudar.

7voto

SomeEE Puntos 923

En C es la mejor práctica para el uso de prototipos. Generalmente, usted quiere declarar los prototipos de función en un archivo de encabezado. Para el código, tal vez llamar a la cabecera de archivo BCD.h y crear en el Encabezado de los Archivos de la sección de MPLAB. El archivo de encabezado de código debería ser algo como lo siguiente:

#ifndef BCD_H
#define BCD_H

uint8_t updateBCD(uint8_t);

#endif 

a continuación, agregue la siguiente línea principal.c

#include "BCD.h"

Explicación: En el código cuando el compilador encuentra la línea de "dígito = updateBCD(dígito)" el compilador no sabe aún acerca de la función updateBCD. Esta es la declaración implícita. Moviendo la declaración de updateBCD antes de la principal ayuda en la que el compilador sabe acerca de updateBCD antes de los encuentros "dígito = updateBCD".

A partir de una programación de punto de vista esto es algo indeseable, porque entonces usted tiene que preocuparse acerca de en qué orden para declarar sus funciones. Aparte de ser molesto para el programador, sino que también puede hacer que el código sea más difícil de leer y de interpretar. El uso de las funciones de los prototipos en los archivos de encabezado alivia estos problemas.

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