微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在MICROCHIP XC8的库中正确使用__delay_ms?

如何解决如何在MICROCHIP XC8的库中正确使用__delay_ms?

我在尝试创建一个函数内部调用“ __delay_ms()”的库时遇到了一些麻烦。进行了广泛的搜索,但找不到解决方案,也找不到其他解释。我正在使用XC8 v2.30 MPLAB 5.45。

我有一个包含标头“ qc3.h”的主要功能

#include <xc.h> // include standard header file

// set Config bits
#pragma config FOSC=INTOSC,PLLEN=OFF,WDTE=OFF,MCLRE=ON,#pragma config CLKOUTEN=OFF,IESO=OFF,FcmeN=OFF,CP=OFF,CPD=OFF,BOREN=OFF
#pragma config WRT=OFF,STVREN=ON,BORV=LO,LVP=OFF

// DeFinitions
#define _XTAL_FREQ 500000 // this is used by the __delay_ms(xx) and __delay_us(xx) functions

#include "qc3.h"

#define LED PORTAbits.RA2




//**********************************************************************************
//***************** main routine ***********************************************
//**********************************************************************************
void main ( ) 
{
    // set up oscillator control register
    OSCCONbits.SPLLEN=0; // PLL is disabled
    OSCCONbits.IRCF=0x07; //set OSCCON IRCF bits to select OSC frequency=500Khz
    OSCCONbits.SCS=0x02; //set the SCS bits to select internal oscillator block
    // OSCON should be 0x7Ah Now.

    // Set up I/O pins
    ANSELAbits.ANSELA=0; // set all analog pins to digital I/O
    ADCON0bits.ADON=0; // turn ADC off
    DACCON0bits.DACEN=0; // turn DAC off

    // PORT A Assignments (0 = OUTPUT,1 = INPUT)
    TRISAbits.TRISA0 = 0; // RA0 = nc
    TRISAbits.TRISA1 = 0; // RA1 = nc
    TRISAbits.TRISA2 = 0; // RA2 = nc
    TRISAbits.TRISA3 = 0; // RA3 = nc (MCLR)
    TRISAbits.TRISA4 = 0; // RA4 = nc
    TRISAbits.TRISA5 = 0; // RA5 = nc
    
    
    QC3_Initialize(); // incia protocolo para handshake
         
    while(1)
    {
        __delay_ms(100);
        LED = 1;
        __delay_ms(100);
        LED = 0; 
    } 
}

qc3.h:

#ifndef QC3_H_ /* Include guard */
#define QC3_H_

/**
  Section: Included Files
*/

#include <xc.h>
#include <stdint.h>
#include <stdbool.h>

#ifdef __cplusplus // Provide C++ Compatibility

    extern "C" {

#endif

//Quick Charge 3 Pin defines
#define DP_HIGH PORTAbits.RA0
#define DM_HIGH PORTAbits.RA1

#define DP_LOW PORTAbits.RA5
#define DM_LOW PORTAbits.RA4

void QC3_Initialize(void);

//void onewireWriteBit(int b);
//unsigned char onewireReadBit();
//unsigned char onewireInit();
//unsigned char onewireReadByte();
//void onewireWriteByte(char data);
//unsigned char onewireCRC(unsigned char* addr,unsigned char len);

#ifdef __cplusplus // Provide C++ Compatibility

    }

#endif

#endif

qc3.c:

#include "qc3.h"


void QC3_Initialize(void) {
  __delay_ms(150);
 DP_HIGH = 0;
  
}

错误

make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'D:/Google Drive/Projetos/Pedais/Fonte para pedais isolada/QUICK CHARGE/PIC'
make -f nbproject/Makefile-default.mk dist/default/production/PIC.production.hex
make[2]: Entering directory 'D:/Google Drive/Projetos/Pedais/Fonte para pedais isolada/QUICK CHARGE/PIC'
"D:\Program Files\microchip\xc8\v2.30\bin\xc8-cc.exe" -mcpu=12F1840 -c -mdfp="D:/Program Files/microchip/MPLABX/v5.45/packs/microchip/PIC12-16F1xxx_DFP/1.2.63/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -I"head_and_lib" -mwarn=-3 -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/head_and_lib/qc3.p1 head_and_lib/qc3.c 
"D:\Program Files\microchip\xc8\v2.30\bin\xc8-cc.exe" -mcpu=12F1840 -c -mdfp="D:/Program Files/microchip/MPLABX/v5.45/packs/microchip/PIC12-16F1xxx_DFP/1.2.63/xc8" -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -I"head_and_lib" -mwarn=-3 -Wa,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/source/ISOPOWER.p1 source/ISOPOWER.c 
make[2]: *** [build/default/production/head_and_lib/qc3.p1] Error 1
make[2]: *** Waiting for unfinished jobs....
head_and_lib/qc3.c:6:3: error: use of undeclared identifier '_XTAL_FREQ'
  __delay_ms(150);
  ^
D:/Program Files/microchip/MPLABX/v5.45/packs/microchip/PIC12-16F1xxx_DFP/1.2.63/xc8\pic\include\pic.h:101:51: note: expanded from macro '__delay_ms'
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))
                                                  ^
1 error generated.
(908) exit status = 1
nbproject/Makefile-default.mk:123: recipe for target 'build/default/production/head_and_lib/qc3.p1' Failed
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
make[2]: Leaving directory 'D:/Google Drive/Projetos/Pedais/Fonte para pedais isolada/QUICK CHARGE/PIC'
nbproject/Makefile-default.mk:91: recipe for target '.build-conf' Failed
make[1]: Leaving directory 'D:/Google Drive/Projetos/Pedais/Fonte para pedais isolada/QUICK CHARGE/PIC'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' Failed

BUILD Failed (exit value 2,total time: 913ms)

编译器抱怨(使用未声明的标识符'_XTAL_FREQ'),但是在#define _XTAL_FREQ 500000之后声明了标头。为什么?

如果我取消了该功能的延迟:

void QC3_Initialize(void) {
  __delay_ms(150);
 DP_HIGH = 0;

成功构建

所以。如果QC3.c从未被声明过(即使在“ .h”标头中),那么“何时”被称为“?”

如果包含“ .h”的“ .c”是为什么要声明“ .h”?不应该这样吗?或至少是“ .h” 包含“ .c”?

似乎是基本的东西,但真让我震惊

谢谢

解决方法

您在包含_XTAL_FREQ的C源文件中定义了main(),但是由于您是在__delay_ms()中调用qc3.c单独翻译单元),那是需要存在该定义的地方。

最简单的解决方法可能是在qc3.h中对其进行定义。

,

您必须在.c文件中输入_XTAL_FREQ,否则您可能会得到。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?