0

我正在使用 ATtiny85 作为微控制器。我正在尝试读取两个大约 3 V 的输入,并为每个“开”输入(超过 1 V)输出 5 V。我使用 PINB0 和 PINB1 进行输入,使用 PINB3 和 PINB4 进行输出。问题是当 PINB0 和 PINB1 都打开时,我得到两个 5 V 输出,但是当只有一个打开时,我只得到 2 V,我正在尝试解决这个问题,所以我得到 5V 输出。

这是我的代码:

#inlude <avr/io.h>
#include <stdint.h>

int main(void)
{
// set pin 0 to input (pi signal 0)
DDRB &= ~(1 << PINB0);
PORTB &= 0 << PINB0;

// set pin 1 to input (pi signal 1)
DDRB &= ~(1 << PINB1);
PORTB &= 0 << PINB1;

//set pin 3 to output of 0
DDRB |= 1 << PINB3;
PORTB &= 0 << PINB3;

//set pin 4 to output of 1
DDRB |= 1 << PINB4;
PORTB &= 0 << PINB4;

while (1)
{
    if (bit_is_clear(PINB, 0) && bit_is_clear(PINB, 1))
    {
        PORTB &= 0 << PINB3;    //output zero volts 
        PORTB &= 0 << PINB4;    //output zero volts
    }
    else if (bit_is_clear(PINB, 0) && !(bit_is_clear(PINB, 1)))
    {
        PORTB &= 0 << PINB3;    //output zero volts
        PORTB |= 1 << PINB4;    //output 5 volts
    }
    else if (!(bit_is_clear(PINB, 0)) && bit_is_clear(PINB, 1))
    {
        PORTB |= 1 << PINB3;    //output 5 volts
        PORTB &= 0 << PINB4;    //output zero volts
    }
    else
    {
        PORTB |= 1 << PINB3;    //output 5 volts
        PORTB |= 1 << PINB4;    //output 5 volts
    }
}
}
4

1 回答 1

3

使用您发布的代码,当仅设置一个输入时,相应的输出会在您的循环中快速打开和关闭,而不是保持打开状态,从而提供平均介于高输出和低输出之间的输出电压。发生这种情况是因为尽管您正确地将输出设置为高电平,但是当您在之前或之后立即清除其他输出时,您也将其设置为低电平。例如,当只有 pin 1 为高时,您在循环中运行此代码:

    PORTB &= 0 << PINB3;    //output zero volts
    PORTB |= 1 << PINB4;    //output 5 volts

0由于按位(或任何其他数量)移位PINB3会给出零,然后您将其与 与PORTB,第一行清除关闭两个输出的所有位。然后在下一行中,重新打开引脚 4。PORTB

同样,当只有 pin 0 为高时,您运行以下命令:

    PORTB |= 1 << PINB3;    //output 5 volts
    PORTB &= 0 << PINB4;    //output zero volts

在这种情况下,第一行打开引脚 3,但第二行再次关闭两个输出

与其尝试移动0到正确的位位置,不如尝试移动1然后反转位。例如,要关闭引脚 4:

    PORTB &= ~(1 << PINB4);

...并关闭引脚 3:

    PORTB &= ~(1 << PINB3);

这样一来,您将与PORTB除您要清除的位之外的所有位都设置了的值,而不是没有设置位的值。

于 2015-03-03T01:26:01.123 回答