Определения выводов ATTiny85

attiny85 platformio

В течение двух недель я рвал на себе волосы, пытаясь выяснить определения контактов для ATTiny85 в PlatformIO. Моя проводка в основном такая:

ATTiny85 Тест стеклоочистителя

Мой скетч:

#include <Arduino.h>
#include <avr/io.h>

#define WIPER PB2

void setup()
{
  pinMode(WIPER, INPUT);
}

void loop()
{
  int wiper_raw = analogRead(WIPER);
  int wiper = map(wiper_raw, 13, 1024, 0, 255);
  // показываем фактическое значение, возможно, не имеющее отношения к вопросу

  delay(100);
}

(Отображение фактического значения осуществляется путем отправки сопоставленного значения на неопиксельный джойстик на красном канале, поэтому, по сути, поворот ручки переключает джойстик от полного выключения до все более яркого и яркого красного цвета.) Горшок подключен к тому, что должно быть физическим контактом 3, также известным как PB4, также известным как контакт 4 Arduino, также известный как ADC2 и т. д. и т. п. (с использованием https://nerdytechy.com/wp-content/uploads/2021/01/attiny85-guide-pinout.png в качестве руководства, но это ничем не отличается из любого другого списка распиновки, который я видел.)

В скетче я ссылаюсь на PB2, который, как сообщает VSCode, оценивается как 2. Это физический контакт 7. Когда я подключил сигнальный контакт потенциометра к контакту 7, я не получил ответа при манипулировании диском. Поэтому я начал подключать его ко всем остальным контактам (кроме VCC, GND и RESET), и самый последний, который я пробовал, контакт 3, реагировал на изменения на потенциометре.

Ни одно руководство по распиновке, которое я когда-либо видел, не перечисляет PB2 на физическом контакте 3. Что я делаю неправильно?

, 👍1

Обсуждение

Само изображение, на которое вы ссылаетесь, показывает PB4 на физическом контакте 3., @Edgar Bonet

Верно. Я хочу сказать, что в коде есть PB2, но потенциометр реагирует на контакт 3. Код, который вы там видите, работает с той проводкой, которую вы видите, хотя это не должно быть так, потому что, если бы определения контактов были правильными , этот зеленый провод должен быть подключен рядом с VCC, а не с GND., @tmountjr


1 ответ


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

3

Макросы, такие как PB2, определены в avr-libc для доступа к биты необработанных портов ввода-вывода с такими утверждениями, как

PORTB |= _BV(PB2);  // устанавливаем PB2 как ВЫСОКИЙ

Они не идентифицируются однозначно как контакт: если у вас более одного порта (скажем, на Uno) и PB2, и PC2 равны 2.

Если вы используете основные функции Arduino, вам не следует использовать эти макросы. Вместо этого используйте простые числа 0, 1... с digitalRead() и digitalWrite() и макросы A0, A1... с analogRead(). Альтернативно, с помощью analogRead() вы можете использовать необработанный аналоговый вывод. числа 0, 1, которые интерпретируются как синонимы A0, A1...

Написание чего-то вроде

analogRead(PB2);

это сбивает с толку, поскольку вы используете макрос avr-libc PB2 в неправильный контекст. Более того, поскольку это то же самое, что и analogRead(2);, ядро Arduino интерпретирует его как эквивалент

analogRead(A2);

Как видно на изображении распиновки, вывод A2 Arduino аналогичен ADC2, PB4 и физический контакт 3.

,

Отлично, вот и все. Таким образом, в основном на изображении распиновки, которое я привел выше, мне следовало использовать синие метки «Arduino Pin» (т. е. «4/A2»). Изменил код для использования A2, и все заработало нормально. Спасибо!, @tmountjr