2015-03-03 4 views
0

Я использую ATtiny85 в качестве микроконтроллера. Я пытаюсь читать два входа со скоростью около 3 В каждый и выводить 5 В для каждого входа «on» (более 1 В). Я использую PINB0 & PINB1 для ввода и PINB3 & PINB4 для вывода. Проблема в том, что оба PINB0 & PINB1 включены, я получаю два выхода 5 В, но когда только один из них включен, я получаю только 2 В, я пытаюсь исправить это, поэтому я получаю 5 В выход.ATTiny85 цифровой выход «on» не может доставить 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 
    } 
} 
} 
+0

Где вы измеряете это напряжение? Во всяком случае, то, что вы делаете, вероятно, не имеет смысла. Вы не можете последовательно выводить выходы, и если вы поместите их параллельно, вы можете просто сделать необходимую логику в программном обеспечении и упростить до одного выхода. –

+0

Это не проблема с программным обеспечением - вы не можете контролировать вывод уровня на выводе GPIO, он определяется (и более или менее равным) напряжением питания чипа. Поэтому это не является подходящим вопросом для SO. Вероятность заключается в том, что к какой-либо схеме эти выходы подключены, перетаскивая эти сигналы вниз (например, представляя слишком низкий и импеданс, и слишком много тока); что вы пытаетесь водить? – Clifford

+1

@Clifford может показаться, что выход 2v, если код (непреднамеренно) делает PWM с соотношением 2: 3. –

ответ

3

С кодом вы публикуемым, когда только один вход установлен, то соответствующий выход быстро включать и выключать в цикле, а не оставаться на, что дает выходное напряжение что среднее значение находится где-то между максимумом выходной и низкой. Это происходит потому, что, хотя вы правильно устанавливаете выходной максимум, вы также устанавливаете его низким, когда вы снимаете другой вывод непосредственно перед или после. Например, если только штырь 1 высок, вы запускаете этот код в цикле:

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

Поскольку смещение 0 по PINB3 битов (или любой другой суммы) дает ноль, который затем и с PORTB, первая линия очищает все бит PORTBвыключение обоих выходов. Затем в следующей строке вы снова включаете контакт 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); 

Таким образом, вы и PORTB со значением со всеми установленными битами, кроме одного, который вы хотите для очистки, вместо значения без битов.

Смежные вопросы