реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Помогите усыпить в прерывании..., камень Mega169
DenisIV
сообщение Mar 4 2009, 00:18
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Собственно, есть проект на Mega169. Тактовая внутренняя 8М, 2 прерывания:

1. Таймер 1 (~1000Hz) - опрос клавиатуры, индикатора и т.д.
2. Таймер 2 (RTC, кварц32768) - раз в секунду считается время.

вот в 1-м таймере опрашивается датчик внешнего напряжения, его дребезг и т.д. и через некоторое время
необходимо проц усыпить, дабы он не скушал слабенький аккум (~20mah,4.8v) Но просыпаться раз в 1 сек от таймера 2
и, добавив секунду снова уснуть(если питание не появилось)...
Может кто сталкивался с такими задачами?
Собственно интересует правильный процесс перехода в спячку, просыпание и снова спячка...
т.е. необходимо ли разрешить прерывания и не сбрасывать флаг для TMR1 что бы проснулся от TMR2?
но как я понимаю, флаг сбрасывается при входе в прерывание, значит его нужно ручками установить?
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 4 2009, 01:18
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(DenisIV @ Mar 4 2009, 03:18) *
Собственно интересует правильный процесс перехода в спячку, просыпание и снова спячка...
т.е. необходимо ли разрешить прерывания и не сбрасывать флаг для TMR1 что бы проснулся от TMR2?
но как я понимаю, флаг сбрасывается при входе в прерывание, значит его нужно ручками установить?

А какая связь между этими прерываниями ? Проснуться по прерыванию TMR1 все равно нельзя, так что речь может идти только о обработке TMR2. Соответственно, включить асинхронный режим с нужным прескалером, раскрыть прерывания по переполнению (как вариант), выставить соответствующий режим обслуживания команды sleep. Особенность TMR2 в асинхронном режиме (169 не щупал, но, думаю, так же, как и в других) - нельзя выйти из обработчика TMR2 сразу (т.е. можно, но тогда нельзя сразу же опять уходить в sleep), должен выполнится один цикл таймера (1/32768 sec).
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Mar 4 2009, 04:27
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Цитата(rx3apf @ Mar 4 2009, 04:18) *
А какая связь между этими прерываниями ? Проснуться по прерыванию TMR1 все равно нельзя, так что речь может идти только о обработке TMR2. Соответственно, включить асинхронный режим с нужным прескалером, раскрыть прерывания по переполнению (как вариант), выставить соответствующий режим обслуживания команды sleep. Особенность TMR2 в асинхронном режиме (169 не щупал, но, думаю, так же, как и в других) - нельзя выйти из обработчика TMR2 сразу (т.е. можно, но тогда нельзя сразу же опять уходить в sleep), должен выполнится один цикл таймера (1/32768 sec).

Именно TMR2, т.к. проц выключает свой тактовый генератор. Проблема в другом: именно в прерывании если просто выполнить sleep, проц от TMR2 не проснётся-прерывания-то выключены при входе в обработчик TMR1. А если их включить, то возможен бесконечный цикл/переполнение стека с TMR1. Вот я и думаю, что что-то здесь не так... Может остановить TMR1 и включить прерывания?
А в sleep нужно уходить максимально быстро...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 4 2009, 04:53
Сообщение #4


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Особенность TMR2 в асинхронном режиме (169 не щупал, но, думаю, так же, как и в других) - нельзя выйти из обработчика TMR2 сразу (т.е. можно, но тогда нельзя сразу же опять уходить в sleep), должен выполнится один цикл таймера (1/32768 sec).


Я может чегото пропустил, но где Вы это вычитали?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Mar 4 2009, 06:24
Сообщение #5


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Цитата(Rst7 @ Mar 4 2009, 07:53) *
Я может чегото пропустил, но где Вы это вычитали?

К сожалению из опыта.(Я раньше писал только на асм, там извращался как мог...) А насчёт цикла 1/32768 вы пожалуй правы. Иначе sleep не действует, а сразу выполняется обработчик TMR2 несколько раз... Самое интересное, что я жду пока в регистре ASSR младшие 3 бита будут равны 0, но почему-то это не помогает...
Да, делитель у меня на TMR2 на 128. (счётчик на 256*делитель 128=32768). На осциле вижу импульсы(тест. ножку сделал) примерно 3-4 штуки по 12 микросекунд. это обработка TMR2+sleep. Как бы не получить время 1/32768*128=3.9ms Это будет катастрофа sad.gif

Сообщение отредактировал DenisIV - Mar 4 2009, 06:25
Go to the top of the page
 
+Quote Post
xemul
сообщение Mar 4 2009, 06:32
Сообщение #6



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(DenisIV @ Mar 4 2009, 07:27) *
Именно TMR2, т.к. проц выключает свой тактовый генератор. Проблема в другом: именно в прерывании если просто выполнить sleep, проц от TMR2 не проснётся-прерывания-то выключены при входе в обработчик TMR1. А если их включить, то возможен бесконечный цикл/переполнение стека с TMR1. Вот я и думаю, что что-то здесь не так... Может остановить TMR1 и включить прерывания?
А в sleep нужно уходить максимально быстро...

И куда ж все так торопятся? От того, что контроллер уснет на 1 мс позже, земная ось погнется?
Не засыпайте в прерывании. Засыпайте только снаружи.
У Вас по TMR1 выполняется несколько задач. Могу предположить, что они друг на друга не очень сильно завязаны, но пока все не завершены, засыпать не стОит. Так заведите какую-нить структуру типа SleepInh и отдайте в ней по биту на каждую такую задачу. Каждый раз, стартанув задачу, взводите бит, завершив - сбрасываете. Если SleepInh == 0, значит пора спать.
Я, правда, не представляю, как можно работать с клавиатурой со временем реакции > 1 с. Наверное, разумнее будет просыпаться по TMR2 с частотой 32-64-128 Гц - тогда опрос клавы (и 1 такт устранения дребезга) можно выполнять единожды на прерывание TMR2.
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Mar 4 2009, 06:42
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Цитата(xemul @ Mar 4 2009, 09:32) *
И куда ж все так торопятся? От того, что контроллер уснет на 1 мс позже, земная ось погнется?
Не засыпайте в прерывании. Засыпайте только снаружи.
У Вас по TMR1 выполняется несколько задач. Могу предположить, что они друг на друга не очень сильно завязаны, но пока все не завершены, засыпать не стОит.

Я уже писал, что стоит аккум ~20mah,4.8v а устройство должно проработать недели 2-3 без внешнего корма и эта миллисекунда мне очень дорога...
А TMR1 выполняет общие функции (клавиатура,дребезг,жки) и ко времени привязан слабо.
TMR2 только секунды добавляет (<50 тактов выполнение)
А снаружи инженерная математика(и логарифмы и синусы и т.д) и эта математика думает иногда очень долго(минуты). Поэтому в неё нельзя. Поэтому и сабж. Сейчас на данный момент достиг 118 мкс, пытаюсь укоротить хотя бы ещё втрое...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 4 2009, 06:57
Сообщение #8


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
К сожалению из опыта.


Код в студию. Потому что опыт, мягко говоря, неоднозначный.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Mar 4 2009, 07:12
Сообщение #9


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Цитата(Rst7 @ Mar 4 2009, 09:57) *
Код в студию. Потому что опыт, мягко говоря, неоднозначный.

Примерно через часик скину. Сейчас добился примерно 30 мкс, а это как раз 1/32768, но нужно всё проверить...
Go to the top of the page
 
+Quote Post
xemul
сообщение Mar 4 2009, 07:22
Сообщение #10



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(DenisIV @ Mar 4 2009, 09:42) *
Я уже писал, что стоит аккум ~20mah,4.8v а устройство должно проработать недели 2-3 без внешнего корма и эта миллисекунда мне очень дорога...
А TMR1 выполняет общие функции (клавиатура,дребезг,жки) и ко времени привязан слабо.
TMR2 только секунды добавляет (<50 тактов выполнение)
А снаружи инженерная математика(и логарифмы и синусы и т.д) и эта математика думает иногда очень долго(минуты). Поэтому в неё нельзя. Поэтому и сабж. Сейчас на данный момент достиг 118 мкс, пытаюсь укоротить хотя бы ещё втрое...

Я уже прочитал про аккум. 1 мс была помянута образно. Пусть будет 100 мкс, если все задачи у Вас завершаются за это время. Но, судя по "инженерной математике", это далеко не так. Я не знаю алгоритма работы Вашего устройства, и как часто ему приходится заниматься математикой, но, имхо, убиваться над потреблением контроллера за сверхбыстрый (и некорректный) уход в спячку на фоне минут в математике бессмысленно.
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Mar 4 2009, 07:46
Сообщение #11


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Цитата(xemul @ Mar 4 2009, 10:22) *
Я уже прочитал про аккум. 1 мс была помянута образно. Пусть будет 100 мкс, если все задачи у Вас завершаются за это время. Но, судя по "инженерной математике", это далеко не так. Я не знаю алгоритма работы Вашего устройства, и как часто ему приходится заниматься математикой, но, имхо, убиваться над потреблением контроллера за сверхбыстрый (и некорректный) уход в спячку на фоне минут в математике бессмысленно.

Как всегда, задача нестандартная... Математика тормозит, но клавиатурой прерывается. Всё хорошо, пока есть питание. А когда его нет, всё скидывается в еепром и считается время бездействия.
К сожалению, 30 мкс пока не получилось. Получилось только 120 мкс. Буду думать дальше, но наврядли. Тем не менее, могу скинуть то, что есть, если интересно...
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 4 2009, 08:23
Сообщение #12


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(Rst7 @ Mar 4 2009, 07:53) *
Я может чегото пропустил, но где Вы это вычитали?

Вообще-то из даташита. После того, как наступил...

Цитата(DenisIV @ Mar 4 2009, 09:24) *
К сожалению из опыта.(Я раньше писал только на асм, там извращался как мог...) А насчёт цикла 1/32768 вы пожалуй правы.

Просто это написано в даташите.
Цитата
Иначе sleep не действует, а сразу выполняется обработчик TMR2 несколько раз...

Именно так. Про то и написано. Что переполнение, что сравнение.
Цитата
Самое интересное, что я жду пока в регистре ASSR младшие 3 бита будут равны 0, но почему-то это не помогает...

Помогает. Но надо не просто ждать, а _модифицировать_ какой-нибудь из связанных с TMR2 регистров, а потом уже ждать обнуление соответствующего бита. Этого достаточно.
Цитата
Да, делитель у меня на TMR2 на 128. (счётчик на 256*делитель 128=32768). На осциле вижу импульсы(тест. ножку сделал) примерно 3-4 штуки по 12 микросекунд. это обработка TMR2+sleep. Как бы не получить время 1/32768*128=3.9ms Это будет катастрофа sad.gif

Нет, один цикл осциллятора, независимо от значения прескалера. У меня все устройства сейчас именно в таком режиме работают (mega8, mega168). С потреблением все в порядке...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Mar 4 2009, 08:28
Сообщение #13


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Вообще-то из даташита.


Гм. Действительно. Как-то это мимо меня прошло... Ааа... Понял. В том приборе моем, который спит и просыпается от часов, кварцевый генератор основной, и пока он раскачается, цикл TOSC1 вполне проходит.

Хотя стоп... Есть у меня другой прибор, там внутренний RC. Пойду-ка я посмотрю, чего там, может за давностью лет не помню...


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Mar 4 2009, 08:31
Сообщение #14


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(DenisIV @ Mar 4 2009, 07:27) *
то выключены при входе в обработчик TMR1. А если их включить, то возможен бесконечный цикл/переполнение стека с TMR1. Вот я и думаю, что что-то здесь не так... Может остановить TMR1 и включить прерывания?
А в sleep нужно уходить максимально быстро...

Мда. Извращенно. Ну, вообще-то, если раскрыть прерывания (только, конечно, не TMR1, а то, пожалуй, будет рекурсия) и уйти в sleep (когда он разрешен) внутри прерывания TMR1, то повторного прерывания случиться не должно, процессор уснет, и таймер тоже встанет. Однако после выполнения прерывания TMR2 возобновится работа того обработчика, где был sleep. Вообще, я бы такое (обработку асинхронного пропадания внешнего питания) попробовал бы сделать через внешние прерывания.

Сообщение отредактировал rx3apf - Mar 4 2009, 08:36
Go to the top of the page
 
+Quote Post
xemul
сообщение Mar 4 2009, 08:42
Сообщение #15



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(DenisIV @ Mar 4 2009, 10:46) *
Как всегда, задача нестандартная... Математика тормозит, но клавиатурой прерывается. Всё хорошо, пока есть питание. А когда его нет, всё скидывается в еепром и считается время бездействия.
К сожалению, 30 мкс пока не получилось. Получилось только 120 мкс. Буду думать дальше, но наврядли. Тем не менее, могу скинуть то, что есть, если интересно...

Т.е. математику на аккумуляторе Вы не считаете? А клаву обрабатываете? Или только время бездействия (надеюсь, Вы это время в ЕЕПРОМ не сохраняете)?
Ей-ей, отключив лишнюю периферию и использовав внешний супервизор питания, включаемый когда нужно с ноги контроллера, наэкономите больше.

Цитата(rx3apf @ Mar 4 2009, 11:31) *
Вообще, я бы такое (обработку асинхронного пропадания внешнего питания) попробовал бы сделать через внешние прерывания.

А смысл? Есть резервное питание от аккумулятора, при пропадании основного все равно нужно скинуть в ЕЕПРОМ некоторое количество данных, поэтому скорость реакции на пропадание основного не очень и интересна. Электроэнергии на сохранение в ЕЕПРОМ будет сожжено больше, чем за сутки работы TMR2 на часовом кварце. имхо, разумнее организовать сохранение данных в ЕЕПРОМ в спячке (просыпаясь по TMR2, проверять состояние очереди записи и, при необходимости, завершенность предыдущей записи - в такой последовательности будет экономичнее).
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 02:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.0149 секунд с 7
ELECTRONIX ©2004-2016