Нужно ли инициализировать регистры и порты AVR на ноль?

9

Во время процедуры инициализации моего кода я использую такие вещи, как:

clr    r0  ; will always stay zero

а также:

out    PORTA, r0; initialize ports
out    DDRA, r0
out    PORTB, r0
...

Это действительно необходимо? Или я могу быть уверен, что это происходит автоматически после сброса? В частности, могу ли я полагаться на то, что все порты будут установлены как входы по умолчанию, чтобы не было проблем с внешними напряжениями, когда код не выполняется?

Стефан Пол Ноак
источник

Ответы:

6

Порты ввода / вывода AVR устанавливаются на INPUT / Tri-State / Hi-Z (DDRx = 0x00) после сброса. Большинство микроконтроллеров (если не все?) Имеют такое поведение. Это самое безопасное состояние для контакта. Поэтому да, вы можете положиться на порты, которые будут автоматически установлены в качестве входов.

Некоторые выдержки из ATmega16 показывают, что:

введите описание изображения здесь

Выводы порта C устанавливаются трижды, когда условие сброса становится активным, даже если часы не работают.

m.Alin
источник
1
Это именно то, что я искал :)
Stefan Paul Noack
Насколько я помню, если вы оставите входной сигнал плавающим, вы получите случайный шум на нем, поэтому начальное состояние может быть нулевым, это нормально, но оно может стать ненулевым после первого тактового цикла.
Mysuz
@miceuz Суть в том, чтобы не иметь выходов в неизвестном состоянии . Они могут оказать нежелательное влияние на внешнюю цепь, которая подключена к микроконтроллеру
м.Алин
1
@miceuz вы ссылаетесь на регистры ввода порта, верно? они имеют N / A в качестве исходного состояния (что имеет смысл, поскольку они просто отражают все, что применяется к выводу). Но я ссылался на регистры направления данных. Я просто хотел убедиться, что я не случайно установил порт в качестве выхода, возможно, конфликтуя с напряжениями, подаваемыми на вывод.
Стефан Пол Ноак
о да, действительно, извините за шум ..
Mysuz
4
  • Инициализация порта ВСЕГДА хорошая идея, независимо от того, что указано в техническом описании.

  • Если в техническом описании ничего не сказано, тогда это жизненно важная идея.


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

Если вас не волнует результат, вам не нужно устанавливать биты данных порта :-).

Если производители прямо указывают в листах данных, что биты данных порта установлены или очищены, то они могут быть НО, но это все-таки действительно хорошая идея - инициализировать их самостоятельно в любом случае. «Граничные условия» - это то, где большинство вещей идет не так, как надо - например, начало цикла, конец цикла, круговая точка циклического переноса буфера, .... Запуск процессора является аппаратным эквивалентом. В реальном мире с шумом, глюками и людьми в нем, если вы отвечаете за судьбу ваших программ, то это действительно хорошая идея. Инициализация порта является легкой частью этого.

Рассел МакМахон
источник
Полностью согласен Я просто подумал, что вместо аппаратного сброса может быть скачок к запуску программы или - что недавно случилось со мной, когда косвенные скачки пошли не так - счетчик программ просто переполнился и снова достиг 0x0000. Кто знает, в каком состоянии будут порты после этого ...
Стефан Пол Ноак
1

Ни регистры, ни SRAM не инициализируются при сбросе, только некоторые из периферийных регистров. Вы должны инициализировать вещи, которые вы используете.

avakar
источник
Вы знаете или имеете ссылку на потерянные регистры, к которым это относится? Я нашел «начальные значения» для некоторых, таких как UCSRCв таблице. А как насчет портов ввода / вывода, особенно направления данных?
Стефан Пол Ноак
2
Порты ввода / вывода настроены на ввод. Это все в техпаспорте.
Леон Хеллер
@ Леон Хеллер, спасибо, теперь я вижу это. Прямо там в реестре описания. Я как-то пропустил это ...
Стефан Пол Ноак
@ noah1989, Леон прав, начальные значения для периферийных регистров всегда указываются под визуализацией регистра (или как там это изображение с именами отдельных битов называется :)).
Avakar