Определения выводов ATTiny85
В течение двух недель я рвал на себе волосы, пытаясь выяснить определения контактов для ATTiny85 в PlatformIO. Моя проводка в основном такая:
Мой скетч:
#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. Что я делаю неправильно?
@tmountjr, 👍1
Обсуждение1 ответ
Лучший ответ:
Макросы, такие как 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
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Связь последовательного порта Digispark
- Ошибка "collect2.exe: error: ld returned 1 exit status"
- Библиотеки I2C для ATTiny85?
- ATtiny85 Digispark clones failing USB handshake - как их запрограммировать?
- длина провода i2c
- Программирование сервопривода на ATtiny85
- Программирование микроконтроллера Attiny85 без arduino
Само изображение, на которое вы ссылаетесь, показывает PB4 на физическом контакте 3., @Edgar Bonet
Верно. Я хочу сказать, что в коде есть
PB2
, но потенциометр реагирует на контакт 3. Код, который вы там видите, работает с той проводкой, которую вы видите, хотя это не должно быть так, потому что, если бы определения контактов были правильными , этот зеленый провод должен быть подключен рядом с VCC, а не с GND., @tmountjr