Hi-Tech-C-ADC-Code funktioniert nicht wie erwartet

Ich bin neu in der Verwendung von PIC-Mikrocontrollern und arbeite an einem Projekt, bei dem ein analoger Wert gelesen wird. Ich verwende den PIC16F877A. Ich habe Code für die Verwendung des unten geposteten ADC gefunden, aber wenn ich versuche, ihn zu kompilieren, erhalte ich den Fehler Error [192] C:\Users\Owner\Documents\Pic Projects\Analog\Main.c; 20.1 undefinierter Bezeichner "GO_nDONE". Hier ist mein Code

#include<htc.h>
#include<pic.h>
#define _XTAL_FREQ 20000000

__CONFIG(UNPROTECT & PWRTDIS & WDTDIS & HS & LVPDIS);

void InitADC(void)
{
    ADCON1  = 0x80;
    TRISA   = 0x2f;
    TRISE   = 0x07;
    ADCON0  = 0x81;
}

unsigned int GetADCValue(unsigned char Channel)
{
    ADCON0 &= 0xc7;
    ADCON0 |= (Channel<<3);
    __delay_ms(10);
    GO_nDONE = 1;
    while(GO_nDONE);
    return ((ADRESH<<8)+ADRESL);
}

void main()
{

}
Für welchen PIC kompilierst du es? Die Registerbits werden auf verschiedenen Geräten unterschiedlich benannt. In HTC müssen Sie sie im Gegensatz zu C18 normalerweise als Struktur wie REGISTERXbits.BITY referenzieren.
Ich verwende PIC16F877A
Ein kurzer Blick auf 16f877a.h aus dem 'include'-Verzeichnis von XC8 legt nahe, dass ADCON0bits.GO_nDONE korrekt ist.
das gibt Fehler [192] C:\Users\Owner\Documents\Pic Projects\Analog\Main.c; 20.1 undefinierter Bezeichner „ADCON0bits“ Fehler [196] C:\Users\Owner\Documents\Pic Projects\Analog\Main.c; 20.21 Struct/Union erforderlich Fehler [196] C:\Users\Owner\Documents\Pic Projects\Analog\Main.c; 21.26 struct/union erforderlich

Antworten (1)

Verschiedene Versionen des HiTech-C-Compilers haben PIC-Pins/Ports auf unterschiedliche Weise definiert. Dann, als Microchip HiTech C übernahm, wurden einige wieder geändert.

Wenn Sie in Ihre pic.h-Datei schauen, sehen Sie, auf welche Definitionsdatei für den PIC16F877A verwiesen wird. Schauen Sie dann in diese Datei, um die Zuordnung #defines ... zu finden.

Beispielsweise ist es in PICC 9.50 als ADGO definiert. In 9.83 ist es sowohl als ADGO als auch als GODONE definiert. Ich habe auch Verweise auf GO_DONE und GO_nDONE gesehen.

Sie könnten diese einfach ausprobieren und herausfinden, welche funktioniert. Ich schlage jedoch vor, dass Sie die Datei finden, damit Sie auch die anderen Pin/Port/Register-Zuordnungen sehen können.

Viel Glück!

Die "unterschiedlichen Wege" waren, weil die Port- und Pin-Namen in den Header-Dateien per Skript aus Datendateien generiert wurden, die wir direkt von Microchip erhielten, und gelegentlich änderten sich diese Dateien. Jetzt haben wir weniger Barrieren zwischen der Kommunikation mit den Erstellern dieser Dateien, und die Dinge haben sich auch stabilisiert.
@mlp Danke! Ich habe nicht gesagt, dass HiTech oder Microchip etwas falsch gemacht haben; diese Art von Problemen scheint überall ziemlich verbreitet zu sein! (Ich habe erst kürzlich zwei widersprüchliche Codeschnipsel in den CMSIS ARM-Bibliotheken gefunden) :)
Ebenso war ich nicht beleidigt, sondern versuchte lediglich, etwas Licht in die sich ändernden Definitionen zu bringen. Solche Dinge werden wahrscheinlicher, wenn die Trennung zwischen Compiler-Entwicklern, Chip-Dokumentatoren und Silizium-Designern wächst, auf einem Kontinuum von innerhalb eines hochtalentierten Kopfes bis hin zu verschiedenen Unternehmenseinheiten .
@mlp Ich mag diesen Satz: "Von einem hochtalentierten Kopf zu verschiedenen Unternehmenseinheiten" :)