您好我正在用c ++创建一个PWM库,以便在我的项目中使用。我已经开始在下面开始研究它是我的代码的一部分还没有完成。我已经逐位编写代码并构建它以查找错误,我发现了一些错误,所以我停了下来。即使我已经定义了正确的参数,它也会给出错误。它应首先预处理#if并为TCC0A分配0x80。但它跳过#if,#elif和#else正在执行。请帮我纠正给定的代码。
IDE:Atmel Studio 7.0
MCU:ATmega328p
代码:
/************************************************************
PWM.h file
************************************************************/
#ifndef PWM_H_
#define PWM_H_
//PWM outputs
#define OC0A 1
#define OC0B 2
//PWM modes
#define NINV 0b10000000 //Non-inverting Mode
#define INV 0b11000000 //Inverting Mode
#include <avr/io.h>
class PWM
{
public:
void Initialize(unsigned char PWMoutputpin, unsigned char PWMmode)
{
TCCR0A = 0x00; TCCR0B = 0x00;
#if ((PWMoutputpin == OC0A) && (PWMmode == NINV))
TCCR0A |= NINV;
#elif ((PWMoutputpin == OC0A) && (PWMmode == INV))
TCCR0A |= INV;
#elif ((PWMoutputpin == OC0B) && (PWMmode == NINV))
TCCR0A |= (NINV >> 2);
#elif ((PWMoutputpin == OC0B) && (PWMmode == INV))
TCCR0A |= (INV >> 2);
#else
#error PWM::Initialize() parameters not defined properly.
#endif
}
};
#endif /* PWM_H_ */
/******************************* END **********************/
/************************************************************
main.cpp file
************************************************************/
#include <avr/io.h>
#include "PWM.h"
int main(void)
{
PWM p; //define PWM as p object
p.Initialize(OC0A,NINV); //initialize PWM with OC0A as output with non-inverting mode
return 0;
}
答案 0 :(得分:0)
如上所述,您无法按照自己的方式使用#if
。编译器只能在执行#if
语句时在编译时做出一次决策。您正尝试根据更改的参数输入或运行时使用#if
语句。当您的库代码被另一个函数调用时,#if
无法在运行时使用,此时编译已经完成。
您的代码应更改为:
void Initialize(unsigned char PWMoutputpin, unsigned char PWMmode)
{
TCCR0A = 0x00; TCCR0B = 0x00;
if ((PWMoutputpin == OC0A) && (PWMmode == NINV))
TCCR0A |= NINV;
else if ((PWMoutputpin == OC0A) && (PWMmode == INV))
TCCR0A |= INV;
else if ((PWMoutputpin == OC0B) && (PWMmode == NINV))
TCCR0A |= (NINV >> 2);
else if ((PWMoutputpin == OC0B) && (PWMmode == INV))
TCCR0A |= (INV >> 2);
else
// #error PWM::Initialize() parameters not defined properly.
// Your error output message can be sent by `cout` or some
// other method like `assert()`.
}
您甚至可以进一步简化代码。请注意,如果您的输出引脚OC0A
TCCR0A
值仅为or
并且PWM模式如何? OC0B
:
void Initialize(unsigned char PWMoutputpin, unsigned char PWMmode)
{
TCCR0A = 0x00; TCCR0B = 0x00;
if (PWMoutputpin == OC0A)
TCCR0A |= PWMmode;
else if (PWMoutputpin == OC0B)
TCCR0A |= (PWMmode >> 2);
else
// #error PWM::Initialize() parameters not defined properly.
// Your error output message can be sent by `cout` or some
// other method like `assert()`.
}
这假设只会传入NINV
和INV
两种模式/值。如果用户传入其他值,那么您会得到一些奇怪的结果,但您也可以检查<{1}}语句之前PWMmode
以确保其有效。