Использование PortB в качестве приемника, не работает

Из идей здесь я пытаюсь использовать PB0-3 в качестве стоков для светодиодной матрицы, и контакты просто не будут тонуть.

Мой тестовый код:

void setup() {
  //bitClear(SPCR, 6);
  pinMode(PD5, OUTPUT);

  pinMode(PB0, OUTPUT);
  pinMode(PB1, OUTPUT);
  pinMode(PB2, OUTPUT);
  pinMode(PB3, OUTPUT);

  digitalWrite(PB0, LOW);
  digitalWrite(PB1, LOW);
  digitalWrite(PB2, LOW);
  digitalWrite(PB3, LOW);
}

// функция цикла запускается снова и снова навсегда
void loop() {
  digitalWrite(PD5, HIGH);
  delay(1000);            
  digitalWrite(PD5, LOW); 
  delay(1000);            
}

(Используя стандартный Blink в качестве отправной точки для тестов)

Мой контроллер представляет собой ATMega328P, запрограммированный с помощью USBaspLoader на моей собственной печатной плате.

Если я подключу физический контакт, который должен быть соединен с проводом, к земле, светодиод начнет мигать, поэтому кажется, что "отправляющая" часть работает, а "принимающая" - нет. Как видите, я попытался вручную отключить порт SPI, но безуспешно. Пробовал разные контроллеры, среди них старый добрый ATMega8-16, вроде ничего не работает. Я даже макетировал тестовую схему, но не повезло, PortB не тонет.

, 👍0

Обсуждение

Почему вы используете что-то вроде PB3 с digitalWrite() и т. д.?, @Majenko


1 ответ


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

1

PB3 и т. д. не относятся к контактам Arduino. Вместо этого они ссылаются на биты во внутренних регистрах.

Чтобы использовать digitalWrite() и т. д., вы должны использовать выводы Arduino, а не номера битов внутреннего регистра.

Сопоставление контактов и портов/битов определяется выбранной платой, и если вы хотите найти ее, вам следует изучить файл pins_arduino.h для выбранной платы.

,

Спасибо, подумал я, потому что компилятор не жаловался, что они определены как таковые. Есть ли способ посмотреть промежуточный код?, @BastetFurry

Вы имеете в виду ассемблерный код? Я думаю, вы можете дизассемблировать файл elf с помощью avr-objdump -S, но это, вероятно, вам не поможет. Обычно PBx определяется как x (PB3 определяется как 3) и предназначен для использования как PORTB |= (1 << PB3)., @Majenko