какие-то не понятки с библиотекой сна

sasken
Offline
Зарегистрирован: 28.10.2015

Здравствуйте. мучаю библиотеку сна.

и какая-то странная вещь у меня происходит.

Ниже приведенный код работает только при прерывании события LOW, а мне надо Change

на других событиях так же не работает. только LOW.
куда смотреть?
на пин 3 приходит меандр с микросхемы часов

#include "LowPower.h"
#include <Wire.h>

volatile int state = LOW;
const int wakeUpPin = 3;
const int test_pin = 16;

void wakeUp()
{
  state = !state;
}

void setup()
{
  Wire.begin();
  Wire.beginTransmission(0x68);
  Wire.write(0x00);
  Wire.write(0x00);
  Wire.endTransmission();
  Wire.beginTransmission(0x68);
  Wire.write(0x07);
  Wire.write(0x10);  // Set Square Wave to 1 Hz
  Wire.endTransmission();
  delay(1000);
  
    pinMode(test_pin,OUTPUT); //пин тест
    digitalWrite(test_pin, LOW); //пин тест на ноль
    pinMode(wakeUpPin, INPUT);   
}

void loop() 
{
    digitalWrite(test_pin, state);
    attachInterrupt(1, wakeUp, LOW);
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
    detachInterrupt(1); 
}

 

b707
Offline
Зарегистрирован: 26.05.2017

какой контроллер?

на атмега328 change interrupt на INT0 INT1 для пробуждения использовать нельзя, см даташит табл 7-1

sasken
Offline
Зарегистрирован: 28.10.2015

камень 48 вообще.
уже допер, что просто добавив строки atmega48 в библиотеку - не особо решает задачу. хотя change на int0 работает отлично.
сейчас поставил 328P.
завелось.

на счет пробуждения не понял. таблица 7-1 вообще про eeprom

P.s. что бы не плодить темы, скажите, пожалуйста, я посмотрел выход мк из сна, у меня получилось 6,6 мс. как-то долговато он выходит. или нет? у меня 328p тактируется от внешнего кварца 4МГц

Upper
Offline
Зарегистрирован: 23.06.2020

По даташиту, запуск кварца после сна занимает 16000 периодов, т.е. для 16 МГц - 1 мс, для 4 МГц - 4 мс.

При работе от встроенного RC генератора просыпается за 6 периодов.

Если у вас есть внешние часы и важно быстро просыпаться, то можно перейти на использование RC генератора.

b707
Offline
Зарегистрирован: 26.05.2017

sasken пишет:

на счет пробуждения не понял. таблица 7-1 вообще про eeprom

даташит на атмегу328, раздел 7 - Power Management and Sleep Modes

таблица 7-1 на странице 39, примечание 3 - "for INT0 INT1 only level interrupt"

 

sasken
Offline
Зарегистрирован: 28.10.2015

b707 пишет:

sasken пишет:

на счет пробуждения не понял. таблица 7-1 вообще про eeprom

даташит на атмегу328, раздел 7 - Power Management and Sleep Modes

таблица 7-1 на странице 39, примечание 3 - "for INT0 INT1 only level interrupt"


Увидел. спасибо. таблица 9-1
INT1, INT0 and Pin Change

а где написано, что по change нельзя?

 

b707
Offline
Зарегистрирован: 26.05.2017

sasken пишет:

Увидел. спасибо. таблица 9-1
INT1, INT0 and Pin Change

а где написано, что по change нельзя?

вы какой даташит-то смотрите? дайте ссылку

sasken
Offline
Зарегистрирован: 28.10.2015

https://files.amperka.ru/datasheets/ATmega328.pdf - это не атмега328P

там это написано

а вот на атмега 328
https://static.chipdip.ru/lib/549/DOC001549488.pdf
тут не вижу, что change не работает

b707
Offline
Зарегистрирован: 26.05.2017

sasken пишет:

а вот на атмега 328
https://static.chipdip.ru/lib/549/DOC001549488.pdf
тут не вижу, что change не работает

все точно так же, таблица 14-1, страница 62 - читайте внимательнее.

 

Кстати, первая ваша ссылка тоже даташит на атмегу328, просто другая ревизия.

sasken
Offline
Зарегистрирован: 28.10.2015

b707 пишет:

все точно так же, таблица 14-1, страница 62 - читайте внимательнее.

не понимаю почему на int0/1 нельзя использовать Change ?
Вроде внимательно прочитал. Ткните неуча носом, пожалуйста.
а если очень хочется Change использовать, то можно? или так работать не будет?

Upper
Offline
Зарегистрирован: 23.06.2020

Можно использовать Change. В данном случае (плата на 328) ошибка в даташите, широко известная в узких кругах.
К тому же вы сами писали, что у вас работает.

А с LOW вы работаете не правильно. Надо запрещать прерывание по LOW в обработчике, иначе будут постоянные прерывания пока на пине сохраняется LOW.

sasken
Offline
Зарегистрирован: 28.10.2015

Upper пишет:
В данном случае (плата на 328) ошибка в даташите, широко известная в узких кругах.

Да где там эта ошибка то? Чего-то я в глаза долблюсь. в упор не вижу.

Upper пишет:
А с LOW вы работаете не правильно.

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

Upper
Offline
Зарегистрирован: 23.06.2020

Вам в #8 сообщении ответили с указанием страницы.

Повторю.
Note:
1. Only recommended with external crystal or resonator selected as clock source.
2. If Timer/Counter2 is running in asynchronous mode.
3. For INT1 and INT0, only level interrupt

sasken
Offline
Зарегистрирован: 28.10.2015

Upper пишет:
3. For INT1 and INT0, only level interrupt

Видимо я не понимаю эту фразу.
Имхо это "только прерывания уровня" или "только уровень прерываний" или "одноуровневое прерывание".
"HIGH и LOW тут можно, а Change нельзя" - я б не догадался так перевести.

b707
Offline
Зарегистрирован: 26.05.2017

sasken пишет:

Upper пишет:
3. For INT1 and INT0, only level interrupt

Видимо я не понимаю эту фразу.
Имхо это "только прерывания уровня" или "только уровень прерываний" или "одноуровневое прерывание".
"HIGH и LOW тут можно, а Change нельзя" - я б не догадался так перевести.

Просто путаетесь в терминах. Прерывания уронвня ("Level interrupt") - это и есть HIGH или LOW. А Change- это не level int

b707
Offline
Зарегистрирован: 26.05.2017

дел