Чи потрібно ініціалізувати регістри та порти 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 показують саме це:

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

Штифти Port C тризначні, коли стан скидання стає активним, навіть якщо годинник не працює.


1
Це саме те, що я шукав :)
Стефан Пол Ноак

наскільки я пам’ятаю, якщо ви залишите вхід плаваючим, ви отримуєте на ньому випадковий шум, тому початковий стан може бути нульовим, це нормально, але він може стати не нульовим після першого тактового циклу.
міцез

@miceuz Суть у тому, щоб не мати виходів у невідомому стані . Вони можуть мати небажаний вплив на зовнішній ланцюг, підключений до мікроконтролера
m.Alin

1
@miceuz ви переглядаєте вхідні регістри портів, правда? вони мають N / A як свій початковий стан (що має сенс, оскільки вони просто відображають все, що застосовується до шпильки). Але я переглядав регістри напрямів даних. Я просто хотів бути впевненим, що у мене випадково не встановлений порт як вихід, можливо, суперечить напругам, застосованим до штифта.
Стефан Пол Ноак

о так, справді, вибачте за шум ..
miceuz

4
  • Ініціалізація портів ЗАВЖДИ хороша ідея, незалежно від того, що пише в описі даних.

  • Якщо аркуш нічого не говорить, то це надзвичайно життєва ідея.


Визначити вміст даних про порт вам потрібно лише в тому випадку, коли ви дбаєте про те, що станеться під час роботи вашої програми.

Якщо ви не переймаєтесь результатом, вам не доведеться встановлювати біти даних про порт :-).

Якщо виробники прямо в аркушах даних чітко заявляють, що біти даних порту встановлені або очищені, то вони можуть бути, Але НЕ БУДЕ насправді дійсно гарна ідея ініціалізувати їх самостійно. "Граничні умови" - це те, коли більшість речей піде не так - наприклад, початок циклу, кінець циклу, кругова обмотка буфера, кругла точка, .... Запуск процесора - це апаратний еквівалент. У реальному світі з шумом та поломками та людьми в ньому, відповідаючи за долю своїх програм, наскільки це можливо, це справді гарна ідея. Ініціалізація портів є легкою частиною цього.


Повністю погодився. Я просто зрозумів, що замість апаратного скидання може відбутися стрибок до запуску програми або - що недавно зі мною трапилося, коли непрямі стрибки пішли не так - лічильник програм просто переповнюється і знову доходить до 0x0000. Хто знає, в якому стані будуть порти після цього ...
Штефан Пол Ноак

1

Ні регістри, ні SRAM не ініціалізуються після скидання, лише деякі периферійні регістри. Ви повинні ініціалізувати речі, які ви використовуєте.


Чи знаєте ви чи маєте посилання на втрачені з яких периферійних регістрів це стосується? Я знайшов "початкові значення" для деяких таких, як UCSRCу таблиці. Що з портами вводу / виводу, особливо напрямком даних?
Стефан Пол Ноак

2
Порти вводу / виводу встановлюються на вхід. Це все в аркуші даних.
Леон Геллер

@ LeonHeller о, дякую, зараз я це бачу. Тут же в описі реєстру. Я якось пропустив це ...
Стефан Пол Ноак

@ noah1989, Леон правильний, початкові значення для периферійних регістрів завжди задаються нижче візуалізації регістра (або як би це зображення з іменами окремих бітів називалося :)).
авакар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.