Как использовать контакт сброса в качестве контакта ввода-вывода с ATtiny44

input reset programmer arduinoisp

Я использую 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.

, 👍0

Обсуждение

Похоже, вы нашли ответ на то, что вы на самом деле спрашиваете. * «После того, как я запрограммирую (микросхема перестанет работать).» * Чип выполняет код независимо от того, включена ли функция сброса. Значит, твоя проблема в другом. Я бы посмотрел, избегал ли я обнаружения отключения питания, и обратил внимание на то, что я на самом деле использовал в качестве признака, чтобы определить, что он «перестает работать», и, возможно, это приведет к другому вопросу., @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


1 ответ


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

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
все-в-одном

Примечание:

  1. RSTDISBL равен 1, когда предохранитель равен «0» (запрограммировано).
  2. DebugWIRE включен, если запрограммирован DWEN Fuse, а биты блокировки не запрограммированы.

Поскольку у вас включен DebugWIRE, похоже, причина в этом. Альтернативная функция RESET все еще активна.

Обратите внимание, что согласно примечанию 1 ниже таблицы 19–4 на странице 160:

После программирования предохранителя RSTDISBL необходимо использовать высоковольтное последовательное программирование для замены предохранителей и дальнейшего программирования.

Это означает, что ваша схема на PB3 должна выдерживать высокое напряжение, а источник напряжения должен обеспечивать достаточный ток, который схема дополнительно потребляет при высоком напряжении.


Теперь ваш код.

Вы используете вывод "0" и надеюсь иметь PB3. Ну судя по этой беззастенчиво связанной распиновке это не правильно:

Распиновка Arduino ATtiny44

Закрепить "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