|
Покритикуйте алгоритм включения и выключения устройства на AVR |
|
|
|
Mar 31 2011, 11:38
|

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

|
Цитата(aaarrr @ Mar 30 2011, 14:45)  Логика USART'а сброшена не будет такой инициализацией. Нужно было сначала сбросить RXEN и TXEN в 0, чтобы получить то же состояние, что и после хардварного сброса. Не понимаю , а зачем мне логика USART , которая у меня по-сути была , если наступили условия при которых я делаю программный сброс . Ну был включён у меня передатчик и что с того - условия наступили перезапускается вся система. Вы представьте задачку с МЕНЮ , в котором Вы можете вкл. и выкл. устройства и Вы отключили USART совсем, для новых условий задачи он Вам не нужен т.е при программном сбросе - Вы пропишите в него 000 чтобы не мешал. Я не вижу смыла записать сначала 000 USART, а затем ещё раз записать в него же необходимые числа , если преполагается использование USART
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Mar 31 2011, 11:54
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(ILYAUL @ Mar 31 2011, 15:38)  Не понимаю , а зачем мне логика USART , которая у меня по-сути была , если наступили условия при которых я делаю программный сброс . Ну был включён у меня передатчик и что с того - условия наступили перезапускается вся система. Только вот после "сброса" приемный регистр может содержать старые данные, и после разрешения приема вы тут же их получите. А оно надо? С каким-нибудь SPI может быть то же самое - SPIF в "1", первый обмен будет испорчен. Цитата(ILYAUL @ Mar 31 2011, 15:38)  Вы представьте задачку с МЕНЮ , в котором Вы можете вкл. и выкл. устройства и Вы отключили USART совсем, для новых условий задачи он Вам не нужен т.е при программном сбросе - Вы пропишите в него 000 чтобы не мешал. Это о чем? Давайте не будем придумывать меню и другие избыточные сущности в контексте обсуждения проблемы программного сброса. Цитата(ILYAUL @ Mar 31 2011, 15:38)  Я не вижу смыла записать сначала 000 USART, а затем ещё раз записать в него же необходимые числа , если преполагается использование USART А он есть.
|
|
|
|
|
Mar 31 2011, 18:04
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
defunct, именно так. Дело в том, что питание будет подаваться при подсоедниении к клеммам аккумулятора - а это всерьез и надолго. Выключения и включения физической коммутацией нет, обесточивания при выключении питания не будет. в этом и задумка. Подключили к аккумулятору - нужно еще и на панельку нажать. А далее - нажал кнопку выключения - заработал сторожевой таймер и сбросил контроллер, контроллер стартовал и, ничего не включая сразу в режим сна, просыпаясь раз в секунду, дабы узнать не давит ли кто на тачпанель. Если да - то дальше по тексту программы. Выглядит это все как включение и выключение от тачпанели. ILYAUL, а что вам не понравилось? У вас мобильник от простого нажатия кнопки включается? Правильно, нет, подержать нужно. По этому принципу работают многие современные устройства. К тому же сенсорная панель - это одна большая кнопка, сам бог велел защитить ее от случайного касания. Есть другой минус - человеческие рефлексы. Челове должне привыкнуть, что прикасаться нужно в течение секунды, однако возможны варианты, когда влючение произойдет практически сразу после нажатия (в зависимости от текущего состояния таймера) И вот это будет раздражать. Как это поправить - мыслей нет. МОжно конечно настроить на 16 мс, а потом просто ждать секунду, но тогда теряется смысл засыпаний - опрос тачпанели занимает 1 мс, еще какое -то время на танцы вокруг этого опроса, соотношение рабочего и спящего режимов получается невелико... Выглядит это так: Код StartUP(); PowerDown(); delay_ms(3);
// SetBackLight(0);
#asm("cli"); #pragma optsize- #asm("wdr") WDTCSR |= (1<<WDCE) | (1<<WDE); WDTCSR = (1<<WDIE) | (1<<WDP2) | (1<<WDP1); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif #asm("sei"); SMCR =(1<<SE)|(1<<SM1); sleep_flag=1; #asm("SLEEP") SPCR_tmp=SPCR; SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0); // Настройка SPI while(sleep_flag) { GetTouchStat(touch_x,touch_y); if ((x==0)||(y==0)) {sleep_flag=1; #asm("SLEEP");} else sleep_flag=0; } PowerUp(); delay_ms(10); SPCR=SPCR_tmp; Повторюсь - в обработчике прерывания то собачьего таймера ничего нет, он просто лает на контроллер и тот просыпается от страха.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|