4924 subscribers

Микроконтроллеры для начинающих. Часть 27. Команды управления

334 full reads
505 story viewsUnique page visitors
334 read the story to the endThat's 66% of the total page views
1,5 minute — average reading time

Мы заканчиваем краткое знакомство с набором команд процессоров микроконтроллеров. Нам осталась последняя группа команд - команды управления. Эти команды имеют узкую и несколько специфичную функциональную направленность. Но в их работе нет особых сложностей.

В отличии от предыдущих статей я не буду приводить в конце список команд. Я буду рассматривать каждую команду в отдельности в ходе статьи.

Ничего не делать

Практически во всех процессорах есть команда NOP - отсутствие операции. Эта команда ничего не делает, просто занимает место и тратит время процессора впустую. Казалось бы, зачем такое вообще нужно? Команду NOP часто используют в циклах для организации коротких задержек, которые отсчитываются в машинных циклах. Кроме того, она бывает полезна при внесении небольших изменений в двоичный код программы без необходимости ее повторной компиляции, например, во время отладки. Иногда такая команда необходима из-за особенностей процессора. И мы еще увидим это при рассмотрении прерываний PIC.

Режимы работы микроконтроллера - выполнение программы и сон

Обычно, процессор микроконтроллера непрерывно выбирает и выполняет команды. Но иногда нужно подождать какого то события и просто ничего не делать. Этим событием может быть, например, окончание работы АЦП, нажатие кнопки пользователем, внешнее прерывание свидетельствующее о поступлении информации по каналу связи.

Такое ожидание можно реализовать бесконечным циклов с непрерывной проверкой ожидаемого события. А можно просто отправить микроконтроллер в режим сна. Это позволит и снизить энергопотребление и немного улучшит ситуацию с электромагнитной совместимостью.

Режим сна по разному реализован в разных микроконтроллерах. И мы с этим еще будем разбираться отдельно. В большинстве случаев останавливается тактовый генератор процессора, что и приводит к остановке выполнения программы. Периферийные модули микроконтроллера могут выключаться или продолжать работу. Это определяется производителем, но иногда на это можно повлиять программными настройками. Возобновить выполнение программы, то есть, выйти из режима сна, микроконтроллер может по аппаратному прерыванию, что обычно и происходит.

Довольно распространенной является ситуация, когда микроконтроллер в устройстве большую часть времени проводит в режиме сна просыпаясь лишь на короткое время.

Для перевода микроконтроллера (хотя точнее, процессора) в режим сна используется команда SLEEP, которая есть у PIC и AVR.

В STM8 такая команда называется HALT - останов. Можно считать, что микроконтроллер действительно остановлен в режиме сна. Но для STM8 четко оговаривается, что останавливается и тактовый генератор и все периферийные модули. Энергопотребление при этом минимально.

Кроме того, в STM8 есть режимы не полного останова. В частности, при выполнении команды WFE (ожидание события) процессор останавливается, но периферийные модули продолжают работать. В PIC аналогичное поведение обеспечивает так называемая независимая от ядра периферия, которая имеется в некоторых моделях.

В STM8 есть и очень похожая на WFE команда WFI (ожидание прерывания). Основным отличием от WFE является то, что при выполнении WFI прерывания всегда разрешены. А при выполнении WFE их обработка зависит от флага I регистра CC.

Сторожевой пес, он же таймер

Опять таки, это тема отдельного разговора. Но мы должны ее немного коснуться сейчас, что бы понять, как работает команда сброса сторожевого таймера.

В общем, и упрощенном, случае сторожевой таймер - WDT (Watch Dog Timer) - это счетчик с отдельным тактовым генератором. Это позволяет ему работать режиме сна, когда основной тактовый генератор остановлен. Когда этот счетчик переполняется производится сброс микроконтроллера. Или его пробуждение, если он был в спящем режиме.

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

Для сброса сторожевого таймера в PIC существует специальная команда CLRWDT, так как его счетчик не имеет адреса. В AVR сторожевой таймер сбрасывается командой WDR.

В STM8 есть два сторожевых таймера, управляющие регистры которых имеют адреса и доступны программно. Поэтому специальной команды для сброса сторожевого таймера нет.

Прервемся для отладки

В AVR и STM8 есть команда BREAK, которая предназначена для использования в аппаратным отладчиком. При выполнении этой команды процессор останавливается, а продолжение нормальной работы возможно только отладчиком. Эта команда реализует установку точек останова (break point) отладчика.

Если отладчик не подключен, что BREAK выполняется как NOP.

Заключение

Подошла к концу не только статья, но и наше знакомство машинными командами микроконтроллеров. И даже знакомство в процессорами микроконтроллеров.

Это был трудный путь, который многим мог показаться и довольно скучным. Но эти знания важны для глубокого понимания работы микроконтроллер и, в конечном итоге, успешного их применения. Возможно, вы никогда не напишите ни одной машинной команды, ни одной программы на ассемблере (который мы не рассматривали, кстати). Но к этим знаниям бы будем возвращаться еще не раз, даже при программировании на С.

Начиная со следующей статьи мы будем "строить мост" между процессором, с его машинными командами и регистрами, и языком высокого уровня, в качестве которого будет выступать С.

Там будет немного полегче и понятнее для тех, кого не очень интересуют все эти темные глубины.

До новых встреч!