Как использовать контакт сброса в качестве контакта ввода-вывода с ATtiny44
Я использую Arduino IDE в качестве ISP-программатора для программирования микросхемы ATtiny44. К сожалению, у меня закончились контакты, поэтому я хочу использовать контакт сброса в качестве ввода-вывода. Я прочитал несколько статей в Интернете, в которых говорится, что это возможно, и даже в техническом описании это указано.
У меня тоже есть высоковольтный программатор. Я написал код в Arduino IDE, а затем использовал его шестнадцатеричный файл для программирования с помощью программатора высокого напряжения (TNM PROGRAMMER).
После программирования микросхема перестает работать.
////////////////////////////////////РЕДАКТИРОВАТЬ////////// ///////////////////////////
const int led = 0;
const int reset_led = 11; //физический контакт 4 на attiny
// функция настройки запускается один раз, когда вы нажимаете сброс или питание платы
void setup() {
// инициализируем цифровой вывод LED_BUILTIN как выход.
pinMode(led, OUTPUT);
pinMode(reset_led, OUTPUT);
}
// функция цикла запускается снова и снова навсегда
void loop() {
digitalWrite(reset_led, HIGH); // включаем светодиод (HIGH - уровень напряжения)
digitalWrite (led, HIGH);
delay(1000); // ждем секунду
digitalWrite(reset_led, LOW); // выключаем светодиод, понижая напряжение
digitalWrite(led, LOW); // выключаем светодиод, понижая напряжение
delay(1000); // ждем секунду
}
Новая настройка фьюз-бита:
////////////////////////РЕДАКТИРОВАТЬ 2 ////////////////////// /////////////////////
Теперь индикатор сброса полностью погас, а другой все еще мигает. Питание моего attiny44 от 5 В. Код такой же, как и раньше
////////////////////////////////РЕДАКТИРОВАТЬ 3////////////// ////////////////////////
#include <avr/io.h>
const int led = 0;
#define ledd PB3
// функция настройки запускается один раз, когда вы нажимаете сброс или питание платы
void setup() {
// инициализируем цифровой вывод LED_BUILTIN как выход.
pinMode(led, OUTPUT);
DDRB |= (uint8_t)(1<<PB3);
pinMode (ledd, OUTPUT);
}
// функция цикла запускается снова и снова навсегда
void loop() {
PORTB |= (uint8_t)(1<< PB3);
digitalWrite (led, HIGH);
digitalWrite (ledd, HIGH);
delay(1000); // ждем секунду
PORTB &= ~((uint8_t)(1 << PB3)); // установить для PB3 значение "низкий"
digitalWrite(led, LOW); // выключаем светодиод, понижая напряжение
delay(1000); // ждем секунду
}
Этот код чудесным образом сработал, спасибо @thebusybee.
/////////////////////////////////////////////////// //////////////////////////
Вывод PB3 — это вывод 11 в Arduino.
1 ответ
Лучший ответ:
В паспорте содержится информация:
Глава 1.1.4 гласит:
Вывод сброса также можно использовать как (слабый) вывод ввода-вывода.
"Слабое качество" означает здесь, что выходная функция не может обеспечить такой же ток, как другие выходы, согласно рисункам с 21-24 по 21-27, начиная со стр. 198, примерно от 2 до 3 мА. Обычно этого недостаточно для светодиодов, если только вы не используете высокоэффективный светодиод.
А на странице 66 есть эта релевантная таблица (я вырезал нерелевантный столбец для PB2):
Таблица 10-8. Переопределение сигналов для альтернативных функций в PB[3:2]
Имя сигнала PB3/RESET/dW/PCINT11 ПУОЭ RSTDISBL(1) + DEBUGWIRE_ENABLE(2) ПУОВ 1 DDOE RSTDISBL(1) + DEBUGWIRE_ENABLE(2) ДДОВ DEBUGWIRE_ENABLE(2) • Передача debugWire ПВОЭ RSTDISBL(1) + DEBUGWIRE_ENABLE(2) ПВОВ 0 ВОМ 0 ДИЭОЭ RSTDISBL(1) + DEBUGWIRE_ENABLE(2) + PCINT11 • PCIE1 ДИЕВ DEBUGWIRE_ENABLE(2) + (RSTDISBL(1) • PCINT11 • PCIE1) DI Ввод dW/PCINT11 все-в-одном Примечание:
- RSTDISBL равен 1, когда предохранитель равен «0» (запрограммировано).
- DebugWIRE включен, если запрограммирован DWEN Fuse, а биты блокировки не запрограммированы.
Поскольку у вас включен DebugWIRE
, похоже, причина в этом. Альтернативная функция RESET
все еще активна.
Обратите внимание, что согласно примечанию 1 ниже таблицы 19–4 на странице 160:
После программирования предохранителя RSTDISBL необходимо использовать высоковольтное последовательное программирование для замены предохранителей и дальнейшего программирования.
Это означает, что ваша схема на PB3 должна выдерживать высокое напряжение, а источник напряжения должен обеспечивать достаточный ток, который схема дополнительно потребляет при высоком напряжении.
Теперь ваш код.
Вы используете вывод "0" и надеюсь иметь PB3. Ну судя по этой беззастенчиво связанной распиновке это не правильно:
Закрепить "0" PA0.
PB3 не имеет назначенного номера.
Вашим следующим шагом может быть поиск исходников библиотеки Arduino и проверка, присвоен ли вообще номер PB3. Боюсь, это не так. Если вам повезло и он есть, используйте его. Тогда вы захотите рассказать нам о своей находке.
Вы можете получить прямой доступ к регистру управления направлением данных и регистру порта. Возьмите свою спецификацию и другую документацию, прочтите и внедрите.
Это не проверено:
// в setup():
DDRB |= (uint8_t)(1U << 3);
// в цикле():
PORTB |= (uint8_t)(1U << 3); // установить для PB3 значение "высокий"
PORTB &= ~((uint8_t)(1U << 3)); // установить для PB3 значение "низкий"
Да, я прочитал его и отключил, но он все равно не работал у меня. После того, как я отключу debugWire, светодиод сброса полностью погаснет., @electro_nooobbbb
Что ж, это хороший знак, потому что теперь контакт стал выходом и стал «низким» (эмм, как ты подключил светодиод?) или, по крайней мере, отключил подтяжку. Другой светодиод все еще мигает? -- Кстати, в названии у вас написано 44А, а в прозе 44. Что именно? (Исправьте свой вопрос.), @the busybee
О, это облегчение знать! Итак, я подключил +ive светодиода напрямую к контакту сброса, а -ive напрямую идет к GND микросхемы. Да, с новой настройкой другой светодиод все еще мигает., @electro_nooobbbb
Пожалуйста, **добавьте** к своему вопросу то, что вы пробовали сейчас, и опубликуйте текущие предохранители. Если вы изменили скетч, пожалуйста, добавьте его тоже., @the busybee
Готово, отредактируйте 2. Код такой же, как и до сброса программируемого контакта 11., @electro_nooobbbb
Не могли бы вы уточнить, какой это аппарат, 44А или 44?, @the busybee
Устройство attiny44, а не attiny44A. Я упоминал в edit2 выше, @electro_nooobbbb
Итак, ваш заголовок ввел меня в заблуждение. Я исправил это. Теперь мне нужно получить другой лист данных и проверить различия. :-( Это займет некоторое время, у меня есть другая работа., @the busybee
хорошо. нет проблем, я проверил, что они почти одинаковы, просто есть разница в размере памяти., @electro_nooobbbb
Верно. Я отредактировал свой ответ относительно номеров страниц и тому подобного. Однако, поскольку у меня нет ATtiny44, я не могу проверить это в реале. В настоящее время он должен работать, так как ваши предохранители установлены, я бы сказал., @the busybee
Хорошо, у меня 44А, я пробовал с этим, все равно не работает. Пожалуйста, перепроверьте мои предохранители, шип, боден или, может быть, в объявлении моего пин-кода есть некоторые проблемы., @electro_nooobbbb
Смотрите мое редактирование, ваш код неверен. Я полагал, что вы это уже проверили. Подсказка: не программируйте "случайно", разработка - это больше наука, чем искусство., @the busybee
OMG, он работает с вашим кодом. Большое вам спасибо, но почему нам нужно писать высокие и низкие таким образом, это должно работать и с простым кодированием, потому что в будущем я должен объявить этот вывод как один из моих выводов антенны, как мне это сделать? (# определить CSN 0) Эту команду я должен написать для PB3. я должен объявить CSN PIN-код антенны для pb3, @electro_nooobbbb
Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/142922/discussion-between-electro-nooobbbb-and-the-busybee)., @electro_nooobbbb
Я только что разместил свой код выше., @electro_nooobbbb
Если пин не имеет номера, назначенного библиотекой Arduino, вы не можете использовать общие функции. Это то, что я написал в своем ответе. «Если у тебя нет ног, ты не можешь ходить». Однако вы можете реализовать свой собственный обходной путь. -- Пожалуйста, рассмотрите возможность пометить ответ как «принятый»., @the busybee
Я принял. Библиотека Arduino назначила его как контакт 11 (PB3 — это контакт 11), но если мы его закодируем, он не будет работать. Я думаю, это из-за функции digitalWrite, я попробую изменить эту функцию и обновить ее завтра., @electro_nooobbbb
Не у каждой модели Arduino контакт номер 11 назначен на PB3, я нашел несколько разных назначений. Убедитесь, что вы смотрите на правильную модель!, @the busybee
Я перепроверил, что PB3 — это контакт 11 для платы Arduino UNO. Я прикрепил картинку выше, @electro_nooobbbb
Конечно, у Uno это есть. Но вы используете ATtiny44, у Uno есть ATmega328P., @the busybee
ATtiny44 также объявил вывод сброса как вывод 11, но если вы закодируете его таким образом, он всегда отклоняется. (#define CSN 2) это контакт моей антенны, который я хочу переключить на контакт сброса. Я могу использовать для этого язык avr, но как мне его объявить., @electro_nooobbbb
Нет, согласно распиновке, «RESET» не имеет номера контакта, назначенного для ATtiny44. Где вы нашли это? -- Так как проблема программирования - еще один зверь, не стесняйтесь публиковать новый вопрос. Возможно, вы захотите добавить ссылку на это в свой вопрос., @the busybee
Хорошо, я создам новую ссылку, @electro_nooobbbb
https://arduinoprosto.ru/q/92300/how-to-declare-pb3-reset-pin-or-attiny44-in-program-using-arduino-ide-платформа, @electro_nooobbbb
- Внешний программатор ArduinoISP выдает ошибку проверки?
- Сброс Arduino Uno в коде
- При использовании Arduino Uno в качестве ISP: "Yikes! Invalid device signature" - плохое соединение, неверную конфигурацию или неверную версию avrdude?
- Как сбросить или отформатировать Arduino?
- Чтение из Serial
- Сторожевой таймер застрял в цикле перезапуска? (мигает зеленый светодиод)
- Программаторы для этой платы отсутствуют - Программирование ESP32 Cam с помощью Ardunio IDE
- ESP8266 — Отправка команды сброса программного обеспечения
Похоже, вы нашли ответ на то, что вы на самом деле спрашиваете. * «После того, как я запрограммирую (микросхема перестанет работать).» * Чип выполняет код независимо от того, включена ли функция сброса. Значит, твоя проблема в другом. Я бы посмотрел, избегал ли я обнаружения отключения питания, и обратил внимание на то, что я на самом деле использовал в качестве признака, чтобы определить, что он «перестает работать», и, возможно, это приведет к другому вопросу., @timemage
Что вы подразумеваете под "_перестает работать_"?, @the busybee
Если вы питаете его от батареи 3,6 В (полностью заряженной 4,2 В), то при уровне БПК 4,3 В он будет все время удерживаться в состоянии сброса (может немного работать, если батарея полностью заряжена, и вам повезло имеют пороговое отклонение ближе к 4В), @KIIV
Вы можете включить предохранитель CKOUT, чтобы PB2 указывал, что часы идут. Похоже, вы принудительно запускаете сторожевой таймер, а мы не видим вашего кода, что возвращает нас к вопросу о том, как вы определяете «перестает работать»., @timemage
@timemage Контакт сброса — PB3. Я подключил один светодиод к контакту сброса, чтобы указать, работает ли он., @electro_nooobbbb
@KIIV Да, вы правы, я тоже провел некоторое исследование и изменил питание на постоянное 5 В, но светодиод на контакте сброса не мигал., @electro_nooobbbb
@thebusybee Это означает, что светодиод, подключенный к контакту сброса, полностью гаснет., @electro_nooobbbb
@timemage Как вы можете прочитать мой код выше, на плате есть два светодиода, светодиод при сбросе остается включенным, но похоже, что напряжение или ток чрезвычайно низкие, из-за чего яркость светодиода трудно увидеть (этот светодиод должен мигать в соответствии с кодом). Я подключил контакт сброса к потенциометру, но в тот момент, когда я меняю значение потенциометра, светодиод, подключенный к контакту 0, выключается или зависает., @electro_nooobbbb
Пожалуйста, посетите [тур], чтобы узнать, как работает этот сайт. Это не форум. Пожалуйста, добавьте уточнение к вашему вопросу, [изменив] его. Здесь, в комментариях, он теряется. -- Если светодиод на контакте 0 перестает мигать, когда вы поворачиваете потенциометр в направлении GND, я бы сказал, что контакт 11 по-прежнему находится в состоянии /RESET. Это также объясняет «светящийся» светодиод на этом контакте, потому что контакт является входом. Вы уверены, что ваши предохранители исправны?, @the busybee
Я не уверен на 100% насчет фьюзбитов. Пожалуйста, проверьте, я добавил новую картинку в сообщение выше под редактированием @thebusybee. Светодиод при сбросе также горит (не мигает), но яркость очень низкая., @electro_nooobbbb
Если _вы_ не уверены насчет фьюзбитов, а результат указывает на то, что RSTDSBL установлен неправильно, как _мы_ можем быть уверены и помочь вам? ;-) Вы не менее трех раз читали документацию к устройству и программатору, чтобы убедиться в правильности установки фьюзов?, @the busybee
@thebusybee Если вы посмотрите выше, я добавил скриншот последней настройки фьюз-бита. Я использую этот программатор HV и attiny уже давно, поэтому я думаю, что единственная новая вещь заключается в том, что я никогда раньше не использовал RESET как GPIO. Просто для подтверждения, RESET (PB3) - это программный контакт 11., @electro_nooobbbb
Как сказано в техническом паспорте (), «_Pullup активируется, а выходной драйвер и цифровой вход деактивируются, когда контакт используется в качестве контакта RESET». То, что вы видите, подтверждает, что RSTDSBL не запрограммирован., @the busybee
В моем программаторе HV есть опция Disable Reset Pin (RSTDSBL), и у нас есть два варианта выбора (Да или Нет). ofc, если нам нужно отключить его, мы должны выбрать «ДА» и запрограммировать его. Верно?, @electro_nooobbbb
Вы пробовали другой вариант?, @the busybee
Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/142913/discussion-between-electro-nooobbbb-and-the-busybee)., @electro_nooobbbb
Я полагаю, вы имели в виду вариант «НЕТ». Да, я сделал, это не тренировка, @electro_nooobbbb
*"Пин сброса - PB3.*" Я понятия не имею, почему вы мне это сказали. Ваш вопрос решился или нет?, @timemage