не правильно работает время
- Войдите на сайт для отправки комментариев
Пнд, 20/08/2018 - 16:29
Скажите, пожалуйста, а вот такая программа:
void loop() { Serial.println(millis()); delay(2000); wdt_enable(WDTO_500MS); //Задаем интервал сторожевого таймера (0.5с) WDTCSR |= (1 << WDIE); //Устанавливаем бит WDIE регистра WDTCSR для разрешения прерываний от сторожевого таймера set_sleep_mode(SLEEP_MODE_EXT_STANDBY); sleep_mode(); digitalWrite(test_pin, f); } ISR (WDT_vect) { wdt_disable(); f=!f; }
в мониторе порта выводит значение каждые 2 с, а по идее должно 2.5 с. в спящем режиме функция millis не пашет?
как же быть, если надо считать время, когда мк спит?
На то он и спящий, чтобы в это время ничего не делать. Соответственно, функция millis показывает только то время, которое было проведено в режиме бодрствования.
Использовать внешний источник времени.
а кроме внешнего источника времени есть какие-нибудь варианты?
а кроме внешнего источника времени есть какие-нибудь варианты?
вариант очень простой - при пробуждении прибавлять установленную задержку WDT к счетчику миллис - как раз и получите 2.5с
вариант очень простой - при пробуждении прибавлять установленную задержку WDT к счетчику миллис - как раз и получите 2.5с
но тогда ни о какой точности в плюс/минус 1 мс и речи быть не может.
вариант очень простой - при пробуждении прибавлять установленную задержку WDT к счетчику миллис - как раз и получите 2.5с
но тогда ни о какой точности в плюс/минус 1 мс и речи быть не может.
естественно, для точности используйте какой либо внешний таймер/часы
Подскажите какую-нибудь простую миниатюрную микросхему генератора импульсов. Не ds1307. Она просит батарейку
Таймер NE555 ?
Таймер NE555 ?
у него точность будет ровно такая же, как у встроенного WDT
Таймер555 ппц какой не точный. Там плюс 5 градусов температура окружающей среды и точность ушла.
Видимо акромя ds1307 ничего больше и нет
не правильно работает время
Время - оно такое ...
ни о какой точности в плюс/минус 1 мс и речи быть не может.
Так ото ж ...
ЕвгенийП, может посоветуете что-нибудь? Есть варианты акромя ds1307?
Волшебства не бывает. Все, что гоняет электроны - жрет энергию. Есть ли смысл погружать МК в сон, оставляя счет времени чипу RTC - вопрос с эмпирическим ответом.
Волшебства не бывает. Все, что гоняет электроны - жрет энергию. Есть ли смысл погружать МК в сон, оставляя счет времени чипу RTC - вопрос с эмпирическим ответом.
Я ж не говорю, что хочу чуда. я спрашиваю чем заменить ds1307 ? мне от нее надо только выход генератора, который настраевается по spi от мк.
А нет ли такой микросхемы генератора, которую просто припаял с обвязкой и он точно генерит импульсы. главное точно по времени.
Тогда, полагаю, необходимо озвучить требования к генератору - скорость, точность, напряжение питания и пр. И после этого уже ждать осмысленных рекомендаций.
А то вы как в магазине готового платья сейчас: "хочу что-то носить, но вы мне всё советуете не то - угадать не можете что ли?"
Любой генератор на кварце. Да хоть бы и Atmel328.
К176ИЕ12.
Тогда, полагаю, необходимо озвучить требования к генератору - скорость, точность, напряжение питания и пр. И после этого уже ждать осмысленных рекомендаций.
А то вы как в магазине готового платья сейчас: "хочу что-то носить, но вы мне всё советуете не то - угадать не можете что ли?"
согласен. не подумал. питание от 2 до 5v. потребление менее 1 мА. скорость чего? нужны импульсы порядка 100мс. точность - хмммм. 1 мс на 2 минуты времени. видимо это дикая точность.
есть какие-нибудь осмысленные рекомендации?
Любой генератор на кварце. Да хоть бы и Atmel328.
это прикол такой?
Ну, хорошо, генератор генерит. А считать его тики кто будет? Ещё один контроллер заводить?
А считать его тики будет основной мк. Просыпаться по тику раз в секунду и считать.
Ну, тогда вернёмся к первому посту. Кто ему мешает раз в секунду просыпаться по вочдогу и прибавлять секунду? Или Вам по прежнему нужна точность " плюс/минус 1 мс"?
Вы бы вообще сказали что у Вас за окружение? Например, МК голый или ардуина? Если ардуина, то вообще забейте на это - ничего Вы её сном не сэкономите.
PIC16F627A
мешает точность wd которая вообще никакая. а так идея: перед сном запускаем генератор импульсов ds1307 и просыпаемся по тику через точный промежуток времени и его уже учитываем в программе.
голый мк atmega328, тактирующийся кварцем 8 мгц и с делителем на 8 (1мгц минимум необходим для общения с соседями). в таком режиме потребление порядка 2-3 мА, при спящем режиме stand режиме потребление порядка 0,2-0,3 мА - это устраивает, но мк должен считать время и по прошествии этого времени выполнить команду.
sasken - изучите внимательнее даташит атмеги328 на предмет спящих режимов. В режиме Idle millis остается активным, при этом типичное потребление при VCC =3v и такте 1 МГц порядка 0.3мА
Спасибо. Почитаю. Это моё первая работа со спящими режимами.
Почему бы не считать время .. самим таймером watchdog-а? :)
Потому что wd не точный ппц как что.
Переход в спящий режим занимает кучу времени. По крайней мере мне осциллограф показал около 10 мс. Сам wd считает от своего внутреннего такта, который зависит и от напряжения и от температуры. Выход быстрый около 6 тактов. Но суммарно время хз какое получается.
хмммм. не дрыгается нога при таком режиме. что я делаю не так? если поменять set_sleep_mode(SLEEP_MODE_IDLE) на set_sleep_mode(SLEEP_MODE_EXT_STANDBY) то все работает хорошо, но это не тот режим, что мне надо.
А чо, нельзя у DS1307 настроить SQW? И пусь раз в секунду будит Дуню по прерыванию.
А чо, нельзя у DS1307 настроить SQW? И пусь раз в секунду будит Дуню по прерыванию.
ну так это и было идеей. пока не выяснилось, что в режиме IDLE функция millis работает. теперь не понятно почему по wd не выходит из режима IDLE
Кста, если у тебя Ардуина, а не голый контроллер, все твои потуги на энергосбережение результата не родят.
голый камень у меня с обвязкой: кварц, два кондера 22 пф и резистор на ресет
тогда я вапще не понимаю. Загонять можно в более глубокий SLEEP, чем IDLE и по прерыванию с часов будить. Да, выходить из прерывания будет дольше в масштабах процессорного времени, ну дак и жрать будет меньше существенно. А DS1307 можно и от ионистора питать некоторое время (~около недели).
тогда я вапще не понимаю. Загонять можно в более глубокий SLEEP, чем IDLE и по прерыванию с часов будить.
Автор выше в теме написал "ds1307 не предлагать. Она просит батарейку"
блин. нет. вариант с ds1307 возможен, но если можно обойтись без rtc, то почему бы и нет? а получается что с режимом IDLE это можно. только вот не понимаю почему он не срабатывает от wd
тогда я вапще не понимаю. Загонять можно в более глубокий SLEEP, чем IDLE и по прерыванию с часов будить.
Автор выше в теме написал "ds1307 не предлагать. Она просит батарейку"
тогда ладно. я сливаюсь, автору удачи. пусть городит неведому хрень.
я сливаюсь, автору удачи. пусть городит неведому хрень.
удачи.
Советчик из вас как из ... молоко.
про ds1307 уже все обсудили и решили выше. зачем вы ее опять предлагаете? видимо не захотели читать ветку полностью.
уже было сказано, что ds1307 нужна ТОЛЬКО для генерации импульсов через точный промежуток времени. остальное, чем обладает микросхема - нафиг не надо для этой задачи. (это как использовать автобус для перевозки одного листа бумаги) соответственно был задан вопрос - а если ли какие-нибудь микросхемы типа ds1307, но только в качестве генератора. остальное все не надо. видимо таких не существует. ок. значит ставим ее.
НО !!!! далее мой косяк - не увидел, что функция millis работает в режиме IDLE. это значит, что бы посчитать время, включая то, что находится мк в режиме сна, достаточно использовать этот режим. это ж даже лучше - не надо никаких дополнительных обвесов типа DS1307, но вот запара - не выходит atmega328 из IDLE по wd. вопрос - почему?
и тут на счену приходит DetSimen и предлагает ВНИМАНИЕ ВНИМАНИЕ - поставить DS1307!!!!
а потом сваливает со словами:"пусть городит неведому хрень".
ну что ж сказать? ок. до свидания.
а получается что с режимом IDLE это можно. только вот не понимаю почему он не срабатывает от wd
Ну, если из POWER DOWN от WDT просыпается, то уж из IDLE подавно.)
удалюсь в скит, посыпав лысину пеплом
хмммм. не дрыгается нога при таком режиме. что я делаю не так? если поменять set_sleep_mode(SLEEP_MODE_IDLE) на set_sleep_mode(SLEEP_MODE_EXT_STANDBY) то все работает хорошо.
а если так:
неа. не взлетело. на тестовом пине меандр с частотой 30.53 Гц.
так а ничего и не поменялось, кроме как f теперь можно обьявлять не как volatile bool ?
ничего и не поменялось, кроме как f теперь можно обьявлять не как volatile bool ?
ну я собственно это и имел в виду... думал - а вдруг вы ее как volatile не обьявили
добавка - а что-то я не понял, почему там 30 Гц? У вас МК вообще не спит. что ли?
аналогично стало любопытно, решил проэкспериментировать над Arduino Nano, скетч который ниже прекрасно работает в режиме SLEEP_MODE_PWR_DOWN но не работает в режиме SLEEP_MODE_IDLE - - происходи вечный ребут - быстрое моргание встроенного светодиода. кто нибудь может подсказать почему?
загружаю через ISP
происходи вечный ребут - быстрое моргание встроенного светодиода. кто нибудь может подсказать почему?
Загрузчик кривой?
происходи вечный ребут - быстрое моргание встроенного светодиода. кто нибудь может подсказать почему?
Загрузчик кривой?
не знаю, может быть, загрузчик Optiboot
но как он может влиять на режим сна не понятно
andycat, если в нано загружен оптибут -то она уже становится Уно :) Так что видимо у вас загрузчик родной , от Нано.
да бог бы с ним с загрузчиком, интересно почему спящий режим SLEEP_MODE_IDLE не работает
andycat, где не работает? Если речь про Arduino IDE то вероятно потому, что просыпается от любого чиха. А чихает как минимум нулевой таймер, его ж никто не останавливал..
Вот, может, натолкнёт на мысли: https://andreasrohner.at/posts/Electronics/How-to-make-the-Watchdog-Timer-work-on-an-Arduino-Pro-Mini-by-replacing-the-bootloader/