PIC XC8-Argumente neu deklariert

Ich versuche meinen PIC mit einfachen 'Start-up'-Projekten kennenzulernen. Ich machte einen LED-Blitz mit einer Taste. Ich habe einen BCD-Zähler von 0 bis 9 mit einer Verzögerung hochgezählt.

Jetzt möchte ich diese beiden kombinieren und den Code auch ein wenig brechen. Ich möchte also, dass der BCD bei jedem Tastendruck inkrementiert wird. Idealerweise würde das einen Interrupt verwenden, aber für diese Anwendung nicht notwendig. Der nächste Schritt wäre, den Interrupt zu verwenden und zwei Eingänge (für Aufwärts oder Abwärts) zu haben und dann die Tasten gegen einen Drehgeber auszutauschen.

Die Fragen, die ich habe, sind:

  • Wo soll ich den aktuellen Wert vom BCD "speichern"? eine globale var in main?
  • Warum erhalte ich diesen neu deklarierten Fehlertyp und die Funktion deklarierte implizite Int-Warnung?

Das BCD liegt auf PORTA, der Eingang (aktiv niedrig) liegt auf PORTB.RB0. Dies sind die beiden Programme, die tatsächlich funktionieren:

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;
        }
    }
}

Beachten Sie, dass RA2 mit einer normalen LED verbunden wäre. Und für den Zähler:

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);
    }
}

}

Also habe ich versucht, diese zu "kombinieren":

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;
}

Fehler: (908) Exit-Status = 1 main.c:46: Warnung: (361) Funktion implizit deklariert int make[2]: * [build/XC8_16F628/production/main.p1] Fehler 1 make[1]: * [ .build-conf] Fehler 2 main.c:52: Fehler: (984) type redeclared make: * [.build-impl] Fehler 2 main.c:52: Fehler: (1098) widersprüchliche Deklarationen für Variable „updateBCD“ ( main.c:52)

Ich verwende einen PIC16F628 und MPLAB X IDE 2.00 mit XC8-Compiler.

Ich hoffe, Sie können helfen.

Verschieben Sie entweder die gesamte updateBCDFunktion vor die Funktion main() oder fügen Sie einfach eine Deklaration der Funktion vor main() ein, etwa so:uint8_t updateBCD(uint8_t myCount);

Antworten (1)

In C ist es am besten, Prototypen zu verwenden. Im Allgemeinen möchten Sie Ihre Funktionsprototypen in einer Header-Datei deklarieren. Rufen Sie für Ihren Code vielleicht die Header-Datei BCD.h auf und erstellen Sie sie im Abschnitt 'Header Files' von MPLAB. Der Code der Header-Datei sollte in etwa so aussehen:

#ifndef BCD_H
#define BCD_H

uint8_t updateBCD(uint8_t);

#endif 

fügen Sie dann die folgende Zeile zu main.c hinzu

#include "BCD.h"

Erläuterung: Wenn der Compiler in Ihrem Code auf die Zeile „digit = updateBCD(digit)“ trifft, kennt der Compiler die Funktion updateBCD noch nicht. Dies ist die implizite Deklaration. Das Verschieben der Deklaration von updateBCD vor main hilft dabei, dass der Compiler über updateBCD Bescheid weiß, bevor er auf „digit = updateBCD“ trifft.

Aus programmiertechnischer Sicht ist dies immer noch etwas unerwünscht, da Sie sich dann Gedanken darüber machen müssen, in welcher Reihenfolge Sie Ihre Funktionen deklarieren. Abgesehen davon, dass es für den Programmierer lästig ist, kann es auch das Lesen und Interpretieren des Codes für andere erschweren. Die Verwendung von Funktionsprototypen in Header-Dateien verringert diese Probleme.