#visual-studio-code #mplab #xc8
#visual-studio-код #mplab #xc8
Вопрос:
Я новичок в программировании на C и не могу найти правильный способ связать мои файлы вместе, чтобы я мог использовать код из одного класса в другом. Я работаю над проектом, который, вероятно, станет очень длинной программой, поэтому я стараюсь не загромождать свой основной класс множеством функций. Вместо этого я хотел бы сохранить их отдельно и упростить перенос кода в любой будущий проект.
Из поиска похожих проблем я предполагаю, что это несколько просто и что я, вероятно, так сильно борюсь с этим, потому что мне не хватает основ кодирования на C.
Это то, что показано в терминале:
> Executing task in folder Led-Pot_Circuit_Test: .Build.cmd 16f887 <
C:Usersraymu_000DocumentsProgrammingVisualStudioCodePIC_C _on_VSCodeLed-Pot_Circuit_Test>mkdir output-files
A subdirectory or file output-files already exists.
C:Usersraymu_000DocumentsProgrammingVisualStudioCodePIC_C _on_VSCodeLed-Pot_Circuit_Test>C:Progra~1Microchipxc8v2.32binxc8.exe --chip=16f887 --outdir=".output-files" ".main.c"
C:Progra~1Microchipxc8v2.32picbinpicc --chip=16f887 --outdir=.output-files .main.c
Microchip MPLAB XC8 C Compiler V2.32
Build date: Feb 1 2021
Part Support Version: 2.32
Copyright (C) 2021 Microchip Technology Inc.
License type: Node Configuration
0: (499) undefined symbol:
_adc_convert(output-filesmain.obj)
(908) exit status = 1
(908) exit status = 1
C:Usersraymu_000DocumentsProgrammingVisualStudioCodePIC_C _on_VSCodeLed-Pot_Circuit_Test>C:Progra~1Microchipxc8v2.32binxc8.exe --chip=16f887 --outdir=".output-files" ".ProjectInitApp.c"
C:Progra~1Microchipxc8v2.32picbinpicc --chip=16f887 --outdir=.output-files .ProjectInitApp.c
Microchip MPLAB XC8 C Compiler V2.32
Build date: Feb 1 2021
Part Support Version: 2.32
Copyright (C) 2021 Microchip Technology Inc.
License type: Node Configuration
Non line specific message: (1091) main function "_main" not defined
(908) exit status = 1
(908) exit status = 1
The terminal process "C:WINDOWSSystem32WindowsPowerShellv1.0powershell.exe -Command .Build.cmd 16f887" terminated with exit code: 1.
Terminal will be reused by tasks, press any key to close it.
Мой основной класс:
//main.c
// CONFIG1
#pragma config FOSC = INTRC_NOCLKOUT// Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
// CONFIG2
#pragma config BOR4V = BOR21V // Brown-out Reset Selection bit (Brown-out Reset set to 2.1V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
#define _XTAL_FREQ 8000000 // 8Mhz
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#include <pic16f887.h>
#include "Projectuser.h"
void main(void) {
//InitApp();
unsigned short adc_value; // variable to hold ADC conversion result in/* Configure the oscillator for the device
ANSELbits.ANS0 = 0; // Disable analog on pin RA0
TRISAbits.TRISA0 = 0; // Set pin RA0 as output
while(1) {
PORTAbits.RA0 = 0; // Set RA0 to LOW
// calculate wait time
adc_value = adc_convert(1); // perform A/D conversion using input from channel 1 (AN1)
__delay_ms(500); // Right shift adc_value two spaces to convert to milliseconds
PORTAbits.RA0 = 1; // Set RA0 to HIGH
adc_value = adc_convert(1);
__delay_ms(500);
}
}
Это моя попытка создать библиотеку, чтобы я мог «легко» перенести некоторый полезный код позже в другой проект:
//user.h
#ifndef USER_H
#define USER_H
void init_adc(void);
unsigned short adc_convert(unsigned char);
#endif
Полезный код:
//InitApp.c
#include <xc.h>
#include <pic16f887.h>
#include "user.h"
/*
Initialize the Analog to Digital Converter
*/
void init_adc(void) {
TRISAbits.TRISA1 = 0b1; // Set pin RA1 as Input
//ANCON0bits.ANSEL1 =0b1;
ADCON1bits.VCFG0 = 0; // set v reference to Vdd
ADCON1bits.VCFG1 = 0; // set v- reference to Vss (Gnd)
ADCON1bits.ADFM = 1; // right justify the output
ADCON0bits.ADCS = 0b01; // use Fosc/8 for clock source
ADCON0bits.ADON = 1; // turn on the ADC
}
/*
Preform an analog to digital conversion.
@param channel The ADC input channel to use.
@return The value of the conversion.
*/
unsigned short adc_convert(unsigned char channel) {
ADCON0bits.CHS = channel; // select the given channel
ADCON0bits.GO = 1; // start the conversion
while(ADCON0bits.GO_DONE); // wait for the conversion to finish
return(ADRESH<<8)|ADRESL; // return the result
}
Вот содержимое папки «output-files», когда я запускаю задачу «Build.cmd», все файлы из компилятора отправляются сюда, но мне не хватает нескольких (например, файла «.hex»), поскольку программа не может скомпилироваться должным образом.
Нужно ли мне иметь основной класс внутри класса InitApp.c? Как правильно компилировать и связывать файлы C вместе??
Я был бы признателен Эми за помощь и совет, спасибо.
Комментарии:
1. не используйте
backslash
include paths, каково содержимое вашего./output-files
каталога, где ваша команда link2. Каков метод получения одной обратной косой черты в буквальной части (обратные знаки)?
3. @rioV8 Не является ли использование обратной косой черты при включении путей просто общим правилом?? Я только что добавил изображение с содержимым папки output-files. Я не верю, что у меня есть команды ссылок, на самом деле, я даже не уверен, что знаю, что такое команда ссылок. Сейчас я пытаюсь найти информацию об этом, где должны быть мои команды ссылок??
4. компилятор генерирует
.obj
файлы, компоновщик объединяет.obj
файлы и библиотеки в исполняемый файл. Найдите документ вашего компилятора в полном рабочем процессе сборки5. @rioV8 Вау, спасибо! Спасибо, что указали мне правильный путь, думаю, я все понял. Прочитав Руководство пользователя компилятора XC8, я узнал, что сначала мне нужно скомпилировать класс C, который я хочу использовать в качестве библиотеки, в файл «.lpp», а затем скомпилировать его вместе с моим «main.c». Позже я постараюсь написать правильный ответ на свой собственный вопрос.