Разбудить Attiny13 из глубокого сна

Max_Budkin
Offline
Зарегистрирован: 19.11.2017
/*
Всем доброго времени!
Нужно разбудить 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(); // Спим;
}

 

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

25 и 28 строка зачем?
Не хватает строк активировать прерывание, например int 0, синтаксис не помню, поищите.
И соответственно обработчик прерывания, в котором отключать спящий режим

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Светодиод тоже не мало кушает - смысл засыпать с включённым led

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
Max_Budkin
Offline
Зарегистрирован: 19.11.2017

В функции засыпания светодиод отключается.

Max_Budkin
Offline
Зарегистрирован: 19.11.2017

Я особо не разбираюсь в таких записях, как 

  ADCSRA &= ~(1 << ADEN); 
  ACSR |= (1 << ACD); 

 

поэтому прошу вашей помощи. В ардуино разбираюсь, а для Attiny13 немного по другому всё это делается.. 

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

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Max_Budkin пишет:

Я особо не разбираюсь в таких записях, как 

  ADCSRA &= ~(1 << ADEN); 
  ACSR |= (1 << ACD); 

 

поэтому прошу вашей помощи. В ардуино разбираюсь, а для Attiny13 немного по другому всё это делается.. 

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


Я тоже в этих записях не разбирался, сначала где то посмотрел, потом открываете даташит на МК, поиском ищите то имя регистра которое посмотрели - читаем до полного понимания.
Я может делаю не правильно, но выключаю всю периферии До засыпания, а после пробуждения все заново инициализирую.
Прочитайте хотя бы страниц 10 последних темы attiny - много нового узнаете.

Max_Budkin
Offline
Зарегистрирован: 19.11.2017

Понял, спасибо, попробую вникнуть. Но всё же жду от кого-нибудь несколько строчек для кода))

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Max_Budkin пишет:

Понял, спасибо, попробую вникнуть. Но всё же жду от кого-нибудь несколько строчек для кода))

э... я в сообщении #3 скинул ссылку на абсолютно рабочий код засыпания с пробуждением по кнопке - не то разве?

Max_Budkin
Offline
Зарегистрирован: 19.11.2017

Опа, прошу прощения, был с мобильного устройства и видимо не заметил.. Сейчас потестирую и отпишусь! ;)

Max_Budkin
Offline
Зарегистрирован: 19.11.2017

Уважвемый andycat!

Я прошу извинить меня за мою невнимательность! Реальный рабочий ответ был у меня прямо перед носом, да и еще около 20 часов назад! Я очень много времени потратил на поиск этого ответа! Большое Вам спасибо!!! Буду изучать регистры, сейчас немного начал приближаться к этому! 

Attiny13a - полёт отличный! Потребление - 1 мкА! Сработка от прерывания тоже работает отлично! Всё замечательно! 

Нашёл еще одно ваше сообщение: http://arduino.ru/forum/programmirovanie/attiny13a-101-primenenie?page=25#comment-316246

пытался повторить, но компилятор выдал ошибку на WDTCR = bb; WDTCR |= _BV(WDIE);

Arduino: 1.8.5 (Windows 7), Плата:"ATtiny13 (ATtiny13a), 1.2 MHz"
 
In file included from e:\distrib\arduino_pro\arduino\hardware\tools\avr\avr\include\avr\io.h:99:0,
 
                 from C:\Users\Администратор\Documents\Arduino\hardware\attiny13\avr\cores\core13/WProgram.h:22,
 
                 from C:\Users\Администратор\Documents\Arduino\hardware\attiny13\avr\cores\core13/Arduino.h:11,
 
                 from sketch\sketch_feb09o.ino.cpp:1:
 
C:\Users\Администратор\Documents\Arduino\sketch_feb09o\sketch_feb09o.ino: In function 'void setup_watchdog(int)':
 
sketch_feb09o:85: error: 'WDIE' was not declared in this scope
 
exit status 1
'WDIE' was not declared in this scope
 
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
 
Это наверное из-за того, что ваш код для attiny85?
 
Вы только на форуме свои проекты выкладываете? Может у вас есть свой блог? Интересно было бы заглянуть:)
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Блога нет и не будет, тут есть и совсем гуру, я так, любитель. WDIE - надо смотреть в ДШ есть там или нет, лениво да и времени особо нет.

я использовал прерывание PCINT потому что PB2 (INT0) было занято OLED дисплеем, поищите примеры с прерыванием INT0 для Attiny13 - с ним попроще, думаю из за этого проблемы.

Max_Budkin
Offline
Зарегистрирован: 19.11.2017

Понял, благодарю! ;)