Разбудить Attiny13 из глубокого сна
- Войдите на сайт для отправки комментариев
Чт, 08/02/2018 - 21:12
/*
Всем доброго времени!
Нужно разбудить Attiny13 из глубокого сна нажатием кнопки, но не RESET!
Помогите, пожалуйста, с кодом для Attiny13!
Нужно, чтобы при нажатии на кнопку Atiny13 проснулся, выполнил какой-то код уже независимо нажата кнопка или нет и снова заснул до повторного нажатия кнопки.
Как разбудить прерыванием? Заранее, благодарю!
Вот код для засыпания, работает исправно, программирую через Arduino IDE 1.8.5:
*/
#define F_CPU 1200000UL // Частота МК в герцах; #include <avr/io.h> #include <avr/sleep.h> // здесь описаны режимы сна; #include <util/delay.h> #define LED 1 // Светодиод; void setup() { DDRB |= (1 « LED); // pinMode(LED, OUTPUT); } void loop() { PORTB |= (1 « LED); // digitalWrite(LED, HIGH); _delay_ms(2000); // Ждём 2 сек.; system_sleep(); // Уходим в сон } void system_sleep() { // Функция сна; PORTB &= ~(1 « LED); // digitalWrite(LED, LOW); ADCSRA &= ~(1 « ADEN); // Отключаем АЦП; ACSR |= (1 « ACD); // Откл. компаратор; set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Самый глубокий сон; while (1) { sleep_enable(); // Разрешаем сон; sleep_cpu(); // Спим; }
25 и 28 строка зачем?
Не хватает строк активировать прерывание, например int 0, синтаксис не помню, поищите.
И соответственно обработчик прерывания, в котором отключать спящий режим
Светодиод тоже не мало кушает - смысл засыпать с включённым led
http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=2...
В функции засыпания светодиод отключается.
Я особо не разбираюсь в таких записях, как
поэтому прошу вашей помощи. В ардуино разбираюсь, а для Attiny13 немного по другому всё это делается..
Не знаю зачем while, видимо чтобы не вышел, код клепал по частям. Допустим в ардуино можно подключить прерывание командой interrupt, а в attiny13 он не понимает этого..
Я особо не разбираюсь в таких записях, как
поэтому прошу вашей помощи. В ардуино разбираюсь, а для Attiny13 немного по другому всё это делается..
Не знаю зачем while, видимо чтобы не вышел, код клепал по частям. Допустим в ардуино можно подключить прерывание командой interrupt, а в attiny13 он не понимает этого..
Я тоже в этих записях не разбирался, сначала где то посмотрел, потом открываете даташит на МК, поиском ищите то имя регистра которое посмотрели - читаем до полного понимания.
Я может делаю не правильно, но выключаю всю периферии До засыпания, а после пробуждения все заново инициализирую.
Прочитайте хотя бы страниц 10 последних темы attiny - много нового узнаете.
Понял, спасибо, попробую вникнуть. Но всё же жду от кого-нибудь несколько строчек для кода))
Понял, спасибо, попробую вникнуть. Но всё же жду от кого-нибудь несколько строчек для кода))
э... я в сообщении #3 скинул ссылку на абсолютно рабочий код засыпания с пробуждением по кнопке - не то разве?
Опа, прошу прощения, был с мобильного устройства и видимо не заметил.. Сейчас потестирую и отпишусь! ;)
Уважвемый andycat!
Я прошу извинить меня за мою невнимательность! Реальный рабочий ответ был у меня прямо перед носом, да и еще около 20 часов назад! Я очень много времени потратил на поиск этого ответа! Большое Вам спасибо!!! Буду изучать регистры, сейчас немного начал приближаться к этому!
Attiny13a - полёт отличный! Потребление - 1 мкА! Сработка от прерывания тоже работает отлично! Всё замечательно!
Нашёл еще одно ваше сообщение: http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=25#comment-316246
пытался повторить, но компилятор выдал ошибку на WDTCR = bb; WDTCR |= _BV(WDIE);
Блога нет и не будет, тут есть и совсем гуру, я так, любитель. WDIE - надо смотреть в ДШ есть там или нет, лениво да и времени особо нет.
я использовал прерывание PCINT потому что PB2 (INT0) было занято OLED дисплеем, поищите примеры с прерыванием INT0 для Attiny13 - с ним попроще, думаю из за этого проблемы.
Понял, благодарю! ;)