|
Покритикуйте алгоритм включения и выключения устройства на AVR |
|
|
|
Mar 29 2011, 09:21
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Господа, есть некое устройство на АТМега, управляющее TFT-дисплеем с тачпанелью и небольшим набором периферии. Подключено к автомобильному аккумулятору постоянно. А значит нужно предусмотреть включение и выкючение устройства. При всем изяществе конструкции, наличии тачпанели слишком жалко будет смотреться механический переключатель для коммутации. Хочется выключать устройство нажав виртуальную кнопку на тачпанели, а включать простым прикосновением к экрану. А посему возникла такая идея: Контроллер управляет дисплеем через специальную плату (если кому интересно TFT-компаньон) Эта плата умеет выходить в режим пониженного потребления и понимает в нем только две команды - выход из режима пониженного энергопотребления и опрос тачпанели. Я планирую по нажатии на виртуальную кнопку на экране переводить его в PowerDown. Затем переводть в PowerDown (именно в этот режим) и сам AVR. Как включать? Предварительно - настроить WatchDog на 1 сек и на генерацию прерывания по переполнению. В прерывании опрашивать тачпанель и если было прикосновение - можно просыпаться. Однако получается следующее - при выключении всего устройства мы его на самом деле не выключаем, а переводим в спящий режим, и при включении оказываемся на том же месте. Хотелось бы перезагрузить и контроллер. А для этого хочу попробовать следующее - если при обработке прерывания от сорожевого таймера выяснится что к тачпанели прикасались - перенастраивать таймер на сброс контроллера и более короткий период (самый короткий 16 мс). После чего ждать следующего переполнения таймера.
Пока не пробовал, идею сочинял на работе, попробую только дома.
Вопросы: 1. Довольно странный алгоритм получился - при выключении устройство на самом деле просто останавливается, а истинная его перезагрузка происходит только при включении. Хотя на самом деле ввсе выглядит благористойно (забыл сказать - в режиме PowerDown TFT компаньон не только меньше жрет, но и подсветку отключает). Может есть какие-то более адекватные истрически сложившиеся алгоритмы? 2. Есть ли какой-то иной способ программного сброса AVR? Цеплять какой-нибудь выход на RESET не предлагайте, плата сделана и детали напаяны. 3. Не происходит ли чего нехорошего с портами ввода вывода в режиме PowerDown АВР? Нужно чтобы пины оставались в том же состоянии. Спасибо.
Сообщение отредактировал zheka - Mar 29 2011, 09:22
|
|
|
|
|
Mar 29 2011, 09:53
|
Местный
  
Группа: Участник
Сообщений: 256
Регистрация: 5-04-09
Из: Москва
Пользователь №: 47 180

|
Цитата(zheka @ Mar 29 2011, 13:21)  ... 2. Есть ли какой-то иной способ программного сброса AVR? Цеплять какой-нибудь выход на RESET не предлагайте, плата сделана и детали напаяны. 3. Не происходит ли чего нехорошего с портами ввода вывода в режиме PowerDown АВР? Нужно чтобы пины оставались в том же состоянии. ... 2. .ORG 0x00 RESET: . . . . JMP RESET 3. Пины останутся в том же состоянии
|
|
|
|
|
Mar 29 2011, 10:45
|
Местный
  
Группа: Участник
Сообщений: 256
Регистрация: 5-04-09
Из: Москва
Пользователь №: 47 180

|
Цитата(zheka @ Mar 29 2011, 14:38)  Извните, ассемблера не знаю. Пишу на С. Но даже глядя на то, что вы написали - это просто уловка для перемещения программы в начало, а не сброс. Если Вам нужно перезагрузить МК после выхода из Powerdown - "уловка" поможет. Если перезагрузить зависший МК - альтернативы WDT не вижу.
|
|
|
|
|
Mar 29 2011, 17:22
|

Частый гость
 
Группа: Участник
Сообщений: 148
Регистрация: 23-02-07
Пользователь №: 25 618

|
Цитата(zheka @ Mar 29 2011, 11:21)  Однако получается следующее - при выключении всего устройства мы его на самом деле не выключаем, а переводим в спящий режим, и при включении оказываемся на том же месте. Хотелось бы перезагрузить и контроллер. Объясните необходимость сброса проца. По идее перезагрузка не нужна, если проц. повиснит его сбросит вачдог. Для надежности поставьте внешний супервизор по питанию. Если все же видите необходимость повысить надежность, после выхода из сна(при касании тачскрина) запустите принудительную инициализацию важных данных. Хотя самый простой метод "JMP 0"
Сообщение отредактировал Marian - Mar 29 2011, 17:24
|
|
|
|
|
Mar 29 2011, 18:27
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(zheka @ Mar 29 2011, 14:38)  Но даже глядя на то, что вы написали - это просто уловка для перемещения программы в начало, а не сброс. Интересно , а что Вы понимаете под сбросом? Или Вы считаете что Цитата .... но я все же предпочту для перезагрузки WDT перемещает программу куда то вдругое место ,а не на 0x0000
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|