将定义传递给函数

时间:2013-10-03 21:05:33

标签: c avr avr-gcc atmel

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

1 个答案:

答案 0 :(得分:2)

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

pin6.pinReg = &DDRA; 

请注意&运算符。

您的代码中的pin6.pinReg = DDRA甚至不应该编译,或者至少应该为赋值中的不兼容类型生成警告。