我正在用AVR编程,我正在尝试创建一个将引脚设置为输出的功能。我创建了一个结构来保存寄存器和引脚号,如下所示:
typedef struct Pin{
uint8_t pinNo;
volatile uint8_t* pinReg;
};
然后我有这个功能来设置一个输出引脚。
void pin_output(struct Pin pin){
//DDRA |= _BV(DDA6);
*(pin.pinReg) |= _BV(pin.pinNo);
}
这样称呼:
struct Pin pin6;
pin6.pinNo = DDA6;
pin6.pinReg = DDRA;
pin_output(pin6);
这样可以正常工作,但LED亮度非常暗淡。如果我像这样设置输出:
DDRA |= _BV(DDA6);
该引脚的预期亮度比使用该功能的亮度高3-5倍。在导致亮度问题的功能中迷失了什么?
答案 0 :(得分:2)
显然,宏DDRA
隐藏了与某些硬件寄存器绑定的某种左值。改变左值会改变寄存器和亮度。如果该左值为uint8_t
的实际类型,那么为了将其传递给struct Pin
,您应该将结构的相应成员初始化为
pin6.pinReg = &DDRA;
请注意&
运算符。
您的代码中的pin6.pinReg = DDRA
甚至不应该编译,或者至少应该为赋值中的不兼容类型生成警告。