|
Помогите усыпить в прерывании..., камень Mega169 |
|
|
|
Mar 4 2009, 00:18
|

Участник

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

|
Собственно, есть проект на Mega169. Тактовая внутренняя 8М, 2 прерывания:
1. Таймер 1 (~1000Hz) - опрос клавиатуры, индикатора и т.д. 2. Таймер 2 (RTC, кварц32768) - раз в секунду считается время.
вот в 1-м таймере опрашивается датчик внешнего напряжения, его дребезг и т.д. и через некоторое время необходимо проц усыпить, дабы он не скушал слабенький аккум (~20mah,4.8v) Но просыпаться раз в 1 сек от таймера 2 и, добавив секунду снова уснуть(если питание не появилось)... Может кто сталкивался с такими задачами? Собственно интересует правильный процесс перехода в спячку, просыпание и снова спячка... т.е. необходимо ли разрешить прерывания и не сбрасывать флаг для TMR1 что бы проснулся от TMR2? но как я понимаю, флаг сбрасывается при входе в прерывание, значит его нужно ручками установить?
|
|
|
|
|
 |
Ответов
|
Mar 4 2009, 01:18
|
Гуру
     
Группа: Участник
Сообщений: 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).
|
|
|
|
|
Mar 4 2009, 04:27
|

Участник

Группа: Свой
Сообщений: 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 нужно уходить максимально быстро...
|
|
|
|
|
Mar 4 2009, 06:32
|
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Mar 4 2009, 06:42
|

Участник

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

|
Цитата(xemul @ Mar 4 2009, 09:32)  И куда ж все так торопятся? От того, что контроллер уснет на 1 мс позже, земная ось погнется? Не засыпайте в прерывании. Засыпайте только снаружи. У Вас по TMR1 выполняется несколько задач. Могу предположить, что они друг на друга не очень сильно завязаны, но пока все не завершены, засыпать не стОит. Я уже писал, что стоит аккум ~20mah,4.8v а устройство должно проработать недели 2-3 без внешнего корма и эта миллисекунда мне очень дорога... А TMR1 выполняет общие функции (клавиатура,дребезг,жки) и ко времени привязан слабо. TMR2 только секунды добавляет (<50 тактов выполнение) А снаружи инженерная математика(и логарифмы и синусы и т.д) и эта математика думает иногда очень долго(минуты). Поэтому в неё нельзя. Поэтому и сабж. Сейчас на данный момент достиг 118 мкс, пытаюсь укоротить хотя бы ещё втрое...
|
|
|
|
|
Mar 4 2009, 07:22
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(DenisIV @ Mar 4 2009, 09:42)  Я уже писал, что стоит аккум ~20mah,4.8v а устройство должно проработать недели 2-3 без внешнего корма и эта миллисекунда мне очень дорога... А TMR1 выполняет общие функции (клавиатура,дребезг,жки) и ко времени привязан слабо. TMR2 только секунды добавляет (<50 тактов выполнение) А снаружи инженерная математика(и логарифмы и синусы и т.д) и эта математика думает иногда очень долго(минуты). Поэтому в неё нельзя. Поэтому и сабж. Сейчас на данный момент достиг 118 мкс, пытаюсь укоротить хотя бы ещё втрое... Я уже прочитал про аккум. 1 мс была помянута образно. Пусть будет 100 мкс, если все задачи у Вас завершаются за это время. Но, судя по "инженерной математике", это далеко не так. Я не знаю алгоритма работы Вашего устройства, и как часто ему приходится заниматься математикой, но, имхо, убиваться над потреблением контроллера за сверхбыстрый (и некорректный) уход в спячку на фоне минут в математике бессмысленно.
|
|
|
|
Сообщений в этой теме
DenisIV Помогите усыпить в прерывании... Mar 4 2009, 00:18     DenisIV Цитата(xemul @ Mar 4 2009, 10:22) Я уже п... Mar 4 2009, 07:46      xemul Цитата(DenisIV @ Mar 4 2009, 10:46) Как в... Mar 4 2009, 08:42  rx3apf Цитата(DenisIV @ Mar 4 2009, 07:27) то вы... Mar 4 2009, 08:31  lepert Цитата(DenisIV @ Mar 4 2009, 07:27) Именн... Mar 4 2009, 08:54 Rst7 ЦитатаОсобенность TMR2 в асинхронном режиме (169 н... Mar 4 2009, 04:53 DenisIV Цитата(Rst7 @ Mar 4 2009, 07:53) Я может ... Mar 4 2009, 06:24 rx3apf Цитата(Rst7 @ Mar 4 2009, 07:53) Я может ... Mar 4 2009, 08:23 Rst7 ЦитатаК сожалению из опыта.
Код в студию. Потому ... Mar 4 2009, 06:57 DenisIV Цитата(Rst7 @ Mar 4 2009, 09:57) Код в ст... Mar 4 2009, 07:12 Rst7 ЦитатаВообще-то из даташита.
Гм. Действительно. К... Mar 4 2009, 08:28 DenisIV Зачем всякие фиктивные прерывания? Всё красиво раб... Mar 4 2009, 14:52 galjoen Цитата(DenisIV @ Mar 4 2009, 17:52) ...
В... Mar 4 2009, 17:28
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|