0

我正在使用 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 倍。导致亮度问题的功能丢失了什么?

4

1 回答 1

2

显然宏DDRA隐藏了某种与某些硬件寄存器相关的左值。更改该左值会更改寄存器和亮度。如果该左值的实际类型是uint8_t,那么为了将其传递给您struct Pin,您应该将结构的相应成员初始化为

pin6.pinReg = &DDRA; 

注意&操作员。

您在代码中拥有的pin6.pinReg = DDRA甚至不应该编译,或者至少应该对分配中的不兼容类型产生警告。

于 2013-10-03T21:10:33.010 回答