ATtiny85 数字 "on" 输出无法提供 5 V

ATtiny85 digital "on" output fails to deliver 5 V

我正在使用 ATtiny85 作为微控制器。我正在尝试读取两个大约 3 V 的输入,并为每个 "on" 输入(超过 1V)输出 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
    }
}
}

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

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

由于将 0 移动 PINB3 位(或任何其他量)得到零,然后您将其与 PORTB 相与,第一行清除 allPORTB 关闭两个输出 。然后在下一行中,重新打开引脚 4。

类似地,当只有引脚 0 为高电平时,您 运行 以下内容:

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

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

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

    PORTB &= ~(1 << PINB4);

...并关闭引脚 3:

    PORTB &= ~(1 << PINB3);

这样你 AND PORTB 的值除了你想清除的位之外所有位都已设置,而不是没有位设置的值。