Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

Глава 7. Система команд АVR 187 Команды эти могут, как мы говорили, потребоваться для сохранения SREG (см. лис­ тинг 7 .4) . Далее в этой главе мы расскажем, как с помощью команд push/pop орга­ низовать деление на локальные и глобальные переменные, если это потребуется (обычно по причине нехватки РОН). А здесь еще приведем удобный способ обмена содержимым между двумя РОН, который не требует промежуточного третьего ре­ гистра (листинг 7 . 1 1 ) . Пример подобного фокуса вы можете встретить в программе термометра на основе дисплея ТМ1 637 в главе 16, где действительно наблюдается дефицит регистров. push r l б push r17 рор rlб рор rl 7 К оманды управления системо й Их всего три : nop (по operation, пустая команда), s leep - перевод МК в режим энергосбережения) и wdr - сброс сторожевого таймера. Последнюю команду мы рассмотрим подробнее в главе 14, а здесь кратко остановимся на двух остальных. Операция nop входит в набор команд всех ассемблеров и служит для заполнения ячеек памяти программ пустыми значениями, если это зачем-то требуется, - на­ пример, чтобы выровнять адрес процедуры по определенному адресу в памяти или задержать выполнение на фиксированное количество тактов . Встретив эту команду (в AVR ее код - все нули двухбайтового слова), процессор выполнит единствен­ ную операцию инкрементирования содержимого счетчика команд. При использовании команды s leep режим энергосбережения должен быть разре­ шен предварительно и, если потребуется, установлен его тип. Разрешение осущест­ вляется установкой бита SE в регистре мcucR, как показано в разд. «Команды сдвига и операции с битами» этой главы. Если более никаких битов не устанавливать, то это означает наиболее щадящий режим Idle, другие режимы необходимо выбирать специально (подробнее об этом рассказано в главе 14) . Отметим, что инструкция советует устанавливать бит разрешения непосредственно перед командой sleep. На самом деле это только механизм защиты от сбоев - в реальности просто следует избегать установки разрешения с самого начала (в процедуре инициализации), а делать это лишь по мере необходимости в процессе выполнения программы. Команда s leep сработает только, если она вызывается из основной программы, а не из прерывания . Если энергосбережение не разрешено, то команда sleep ничего не делает, и это позволяет «поиграть» возможностями. Например, при необходимости передачи последовательности байтов по относительно медленному UART, можно разрешить МК «заснуть», только когда будет передан последний байт. Тогда основной цикл может включать в себя единственную команду s leep, а разрешать «спящий» режим мы будем перед выходом из процедуры прерывания «передача завершена» (ТХ Complete) после передачи последнего байта.

RkJQdWJsaXNoZXIy MTExODQxMg==