четверг, 21 марта 2013 г.

Сброс

Микроконтроллер ATmega328 имеет возможность сброса (реинициализации) разными способами:
  • При включении питания микроконтроллера
  • Аппаратный сброс 
  • Тайм-аут сторожевого таймера
  • Падения напряжения питания ниже заданной величины
При наступлении одного из этих событий все регистры принимают начальные значения, а в счетчик команд загружается адрес вектора сброса. Вектор сброса может располагаться как по адресу 0x0000, так и в начале области загрузчика. 

High fuse byte:
7
6
5
4
3
2
1
0
RSTDISBL
DWEN
SPIEN
WDTON
EESAVE
BOOTSZ1
BOOTSZ0
BOOTRST

Бит BOOTRST (0) управляет значением вектора сброса (1 - по адресу 0x0000 / 0 - в области загрузчика)
Биты  BOOTSZ1 (2) и BOOTSZ0 (1) управляют расположением области загрузчика и его размером:
  • 00 - загрузчик располагается по адресу 0x3800 и его размер 512 байт
  • 01 - загрузчик располагается по адресу 0x3C00 и его размер 1024 байта
  • 10 - загрузчик располагается по адресу 0x3E00 и его размер 2048 байт
  • 11 - загрузчик располагается по адресу 0x3F00 и его размер 4096 байт
Бит RSTDISBL (7) позволяет отключить аппаратный сброс микроконтроллера и использовать вывод RESET (1 ножка) как порт ввода вывода (0 - сброс отключен / 1 - сброс включен).

Для определения каким образом был сброшен микроконтроллер существует регистр MCUSR:
7
6
5
4
3
2
1
0
-
-
-
-
WDRF
BORF
EXTRF
PORF

Бит WDRF (3) устанавливается в 1 если сброс произошел по тайм-ауту сторожевого таймера.
Бит BORF (2) устанавливается в 1 если сброс произошел по снижению питания (от системы BOD).
Бит EXTRF (1) устанавливается в 1 если сброс произошел по сигналу низкого уровня на выводе RESET (1 ножка).
Бит PORF (0) устанавливается в 1 если сброс произошел при включении питания микроконтроллера.

Управление системой сброса также осуществляется заданием длительности задержки сброса. Это было описано в посте Тактирование микроконтроллера - Часть 1