我的AVR PWM库代码中的错误

时间:2017-09-30 08:33:47

标签: c++ avr

您好我正在用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;
}

1 个答案:

答案 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()`.
}

这假设只会传入NINVINV两种模式/值。如果用户传入其他值,那么您会得到一些奇怪的结果,但您也可以检查<{1}}语句之前PWMmode以确保其有效。