0

ATtiny85 をマイクロコントローラとして使用しています。2 つの入力をそれぞれ約 3 V で読み取り、「オン」入力 (1 V 以上) ごとに 5 V を出力しようとしています。入力には PINB0 と PINB1 を使用し、出力には PINB3 と PINB4 を使用しています。問題は、PINB0 と PINB1 の両方がオンの場合、5 V の出力が 2 つ得られますが、一方のみがオンの場合、2 V しか得られないため、5 V の出力が得られるように修正しようとしています。

これが私のコードです:

#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

あなたが投稿したコードでは、入力が1つだけ設定されている場合、対応する出力はオンのままではなく、ループ内でオンとオフをすばやく切り替え、高出力と低出力の間の平均出力電圧を提供します。これは、出力を正しくハイに設定しても、直前または直後に他の出力をクリアするときにローにも設定するために発生します。たとえば、ピン 1 のみが High の場合、ループで次のコードを実行します。

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

ビット (またはその他の量) をシフト0するとゼロになるため、これを AND します。最初の行では、両方の出力をオフにするすべてのビットがクリアされます。次に、次の行でピン 4 をオンに戻します。PINB3PORTBPORTB

同様に、ピン 0 のみが高い場合は、次を実行します。

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

この場合、最初の行はピン 3 をオンにしますが、2 番目の行は再び両方の出力をオフにします。

0正しいビット位置にシフトしようとする代わりに、シフトしてからビット1を反転してみてください。たとえば、ピン 4 をオフにするには:

    PORTB &= ~(1 << PINB4);

...そしてピン 3 をオフにするには:

    PORTB &= ~(1 << PINB3);

PORTBそうすれば、ビットが設定されていない値の代わりに、クリアしたいビットを除くすべてのビットが設定された値とANDします。

于 2015-03-03T01:26:01.123 に答える