1-й генерация AVR ATtiny2313, ATmega8 звука
2-й включение/отключение питания МК одной кнопкой, т.к. есть необходимость сделать один девайс, где надо реализовать так питание.
Тренируюсь в программировании МК на WinAVR
можно:saint981 писал(а):можно немного описать этот модуль?
собственно говоря, усыпляют контроллер так:avr/sleep.h – Управление энергосберегающими режимами и режимами «сна»
В этом модуле определен ряд макросов и функций, реализующих общий интерфейс управления режимами «сна».
Использование инструкции SLEEP позволяет снизить общее энергопотребление в некоторых применениях. Микроконтроллеры AVR реализуют несколько различных вари-антов «сна», для которых в модуле определены следующие константы (о поддержке вы-бранным контроллером соответствующего режима следует справиться в документации к контроллеру, не все константы определены для любого контроллера):
SLEEP_MODE_IDLE – режим «бездействия» Idle
SLEEP_MODE_PWR_DOWN – режим «отключения» Power Down
SLEEP_MODE_PWR_SAVE – режим «экономии» Power Save
SLEEP_MODE_ADC – режим «снижения шума АЦП» ADC Noise Reduction
SLEEP_MODE_STANDBY – режим «ожидания»
SLEEP_MODE_EXT_STANDBY – расширенный режим «ожидания»
Практически управление режимом энергосбережения сводится к вызову макроса set_sleep_mode() для указания нужного режима и последующего включения этого режима макросом sleep_mode(). Следует помнить, что если нет необходимости остановить работу микроконтроллера вплоть до аппаратного сброса, необходимо разрешить прерывания до выполнения этих макросов.
В некоторых случаях может потребоваться большая гибкость в управлении режимами экономии, для чего предусмотрены отдельные функции sleep_enable(), sleep_disable() и sleep_cpu().
Функции и макросы модуля
set_sleep_mode()
set_sleep_mode(mode) – макрос, подготавливающий микроконтроллер к заданному режиму сна. Параметр mode – одна из определенных ранее констант режима. Этот макрос эквивалентен переходу в режим Idle, т.е. остановки тактового генератора и отключения периферии, если это требуется режимом, не происходит. Для полноценного включения режима требуется второй макрос sleep_mode()
sleep_mode()
sleep_mode() – макрос, переводящий микроконтроллер в режим сна. Его реализация такова, что программист вправе считать, что «возврат» из макроса произойдет уже после «пробуждения» контроллера.
sleep_enable()
void sleep_enable(void) – функция, устанавливающая бит разрешения режима сна (SE-бит).
sleep_disable()
void sleep_disable(void) – функция, сбрасывающая бит разрешения режима сна (SE-бит)
sleep_cpu()
void sleep_cpu(void) – функция, «усыпляющая» микроконтроллер, т.е. эквивалент-ная команде SLEEP.
Код: Выделить всё
#include <avr/sleep.h>
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_mode();Аффтар перевёл значение в 16-ричную систему. Иногда это оправданно и удобно, но скажите мне, почему бы в таких случаях, когда нужно побитно работать с регистром, не воспользоваться фитчами winavr-а указывая, даже не номера конкретных битов, а их название(!)?saint981 писал(а):афтар персчитал значения каким-то образом и врпоге указал так:
Код: Выделить всё
MCUCR|=(1<<SM0); //Sleep Mode: Power-down
MCUCR|=(1<<SE); //Sleep Enable
asm("sleep"); //ZZZzzzz... ZZZzzzz... ZZZzzzz...
если следовать стилю WinAVR, то следует воспользоваться макросом _BV():AI_Disable писал(а):но скажите мне, почему бы в таких случаях, когда нужно побитно работать с регистром, не воспользоваться фитчами winavr-а указывая, даже не номера конкретных битов, а их название(!)?Код: Выделить всё
MCUCR|=(1<<SM0); //Sleep Mode: Power-down MCUCR|=(1<<SE); //Sleep Enable asm("sleep"); //ZZZzzzz... ZZZzzzz... ZZZzzzz...
Код: Выделить всё
MCUCR |= _BV(SM0);
MCUCR |= _BV(SE);Просто не уважаю я эти макросыARV писал(а):если следовать стилю WinAVR, то следует воспользоваться макросом _BV():
это я занимался переводом документации к avr-libc и WinAVRwvw писал(а):ARV, а откуда цитата с описанием макросов WinAVR?