Почему я читаю только нули из 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;
}

, 👍3


1 ответ


Лучший ответ:

4

Регистр PORTB аппаратно инициализируется нулем. Ты никогда записать в этот регистр, чтобы он всегда оставался нулевым.

Возможно, вы путаете PORTB и PINB:

  • PORTB — регистр выходного порта, которым вы управляете
  • PINB – регистр входа порта, для которого биты соответствующие входным контактам, управляются тем, что управляет этими контактами. Контакты снаружи.
,

Я подаю сигнал на эти контакты извне. Я программировал XMega, который использует один и тот же PORTB для ввода и вывода. Сейчас вижу в даташите PINB, наверное вы правы, попробую., @Joe

@Joe: Да, это то, что я понял, прочитав ваш вопрос., @Edgar Bonet

Спасибо, это был ответ, я не знал, что процессор, который я использую, имеет разные регистры для ввода и вывода., @Joe

Разные регистры, правда. И есть даже бесплатная польза: если вы попытаетесь _записать_ в регистры _input_ порта, вы получите функциональность переключения: для каждого бита, который вы записываете в единицу, переключается соответствующий выходной контакт., @Edgar Bonet