Почему я читаю только нули из PORTB?
Я использую специальную плату, совместимую с Arduino Nano, с Atmel 328P. Я внешне меняю значения, применяемые к нескольким контактам на PORTB. Я ожидаю, что смогу прочитать значения этих контактов (низкие или высокие), но я всегда читаю нули. Однако вызывается прерывание смены контакта. Что мне нужно сделать, чтобы прочитать значения из PORTB?
Напряжение питания 5 вольт. На контакт подается высокое напряжение 3,3 В.
В приведенном ниже коде, когда я изменяю напряжение, подаваемое на контакт, светодиод 1 мигает, а светодиод 2 — нет.
#include <avr/interrupt.h>
#define LED1_PORT (PORTD)
#define LED1_PIN_bm (_BV(4)) //D1, белый
#define LED2_PORT (PORTD)
#define LED2_PIN_bm (_BV(3)) //D2, красный
volatile bool g_bValueChanged = 0;
void setup()
{
DDRB = 0; // устанавливаем все как входы
PCMSK0 = 0xfb; //исключаем 1 пин из-за шума
PCICR |= (1 << PCIE0); //включить прерывание смены контакта 0 (для контактов PB0..7)
sei();
}
uint8_t g_valuePrevious = 0;
void loop()
{
if (g_bValueChanged)
{
g_bValueChanged = false;
LED1_PORT |= LED1_PIN_bm;
delay(40);
LED1_PORT &= ~LED1_PIN_bm;
delay(40);
}
uint8_t value = PORTB;
if (value != g_valuePrevious)
{
g_valuePrevious = value;
LED2_PORT |= LED2_PIN_bm;
delay(40);
LED2_PORT &= ~LED2_PIN_bm;
delay(40);
}
}
ISR(PCINT0_vect)
{
g_bValueChanged = true;
}
@Joe, 👍3
1 ответ
Лучший ответ:
▲ 4
Регистр PORTB
аппаратно инициализируется нулем. Ты никогда
записать в этот регистр, чтобы он всегда оставался нулевым.
Возможно, вы путаете PORTB
и PINB
:
PORTB
— регистр выходного порта, которым вы управляетеPINB
– регистр входа порта, для которого биты соответствующие входным контактам, управляются тем, что управляет этими контактами. Контакты снаружи.
,
@Edgar Bonet
Смотрите также:
- Что делать с плавающими контактами Arduino?
- Какое назначение контактного конденсатора ввода-вывода на микроконтроллере AVR?
- Barebones AVR — подключение вывода RESET к Vcc
- ATMega328 работает, но не выводит ни на какие контакты
- Использование PortB в качестве приемника, не работает
- Физическое прохождение через пин для доступа к другому
- NodeMCU - Vin контакт как выход 5V?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Я подаю сигнал на эти контакты извне. Я программировал XMega, который использует один и тот же PORTB для ввода и вывода. Сейчас вижу в даташите PINB, наверное вы правы, попробую., @Joe
@Joe: Да, это то, что я понял, прочитав ваш вопрос., @Edgar Bonet
Спасибо, это был ответ, я не знал, что процессор, который я использую, имеет разные регистры для ввода и вывода., @Joe
Разные регистры, правда. И есть даже бесплатная польза: если вы попытаетесь _записать_ в регистры _input_ порта, вы получите функциональность переключения: для каждого бита, который вы записываете в единицу, переключается соответствующий выходной контакт., @Edgar Bonet