|
|
|
|
вот он - http://www.iar.se/index.php?show=1014_ENG&&page_anchor=http://www.iar.se... там и ФЛАШ демка работы есть. и демо версия тоже. извините за ОФФтоп. |
|
|
picmaniac, а терминалы на дугах какие? |
|
|
chav1961: терминалы - прошу дать определение. А то как у армянского радио: Что такое горжетка, мы не знаем, но догадываемся. Рекомендуем не ездить на лошади верхом, на велосипеде, а также не мыться жесткой мочалкой. |
|
|
Был бы признателен за ссылки на литературу по проектированию софта. picmaniac, вы там книгу какую-то упоминали? |
|
|
библиотека для скачивания http://www.roboforum.ru/viewforum.htm?f=19 |
|
|
Вот мой вариант. Сыроват еще, но все сразу что-то не получается. Назовем это мыслями вслух. У нас есть граф со всеми возможными состояниями, аж 4=) ВКЛ не в счет, в "свиче" оно рассматриваться не будет. Дабы отслеживать состояние нашего девайса, в соответствии с рекомендациями picmaniaca, обьявим переменную state. Эта переменная будет отображать текущее состояние девайса. Значаний у этой переменной рАвно как и состояний будет 4: state = 0 - состояние сна state = 1 - состояние установки state = 2 - обратный отсчет state = 3 - воспроизведение звука Для реализации метода конечных автоматов на Си, нам очень подходит оператор switch. Если кто не знает че это за оператор, загляните в любую книгу по С/С++ или в того же Шпака. Лучше в чем книге написано все равно не обьясню. Смотрим на граф, что мы там видим? Мы идим что при подаче питания мы можем перейти только в СОН. При включении питания записываем в state ноль. Т.е. перед функцией мэин() записываем state=0; Или в самой мэин() но перед бесконечным циклом. далее входим в бесконечный цикл. А там вот такая конструкция: void main(void) { char state=0; for (;;)//или while(1), эффект один, но лучше знать оба способа.У меня компилер ПИК18 // от хайтек при написании while(1) забивает всю прамять безусловными переходами { switch(state) { case0: гоовимся ко сну. Чистим зубы=) И все переменные заодно. Переводим порты в начальное состояние. break; case1: отображаем значение десятков и единиц на индикатор ЕСЛИ кнопки не нажаты в течении 10с, state=0;// x-p-p-p-p break; case2: ПОКА десятки НЕ РАВНЫ 0 И единицы НЕ РАВНЫ 0 отображаем значение десятков и единиц на индикатор state++; переход в состояние воспроизведения звука case3: играем мелодию в течение 30секунд state=0; break; }//конец свича } конец цикла for } //конец ф-ции мэин Такое содержание предполагает что остальные вещи будут обрабатываться в прерываниях. У нас их будет 5: 1. От таймера. Должны же мы как-то считать время 2. Внешнее прерывание RB0/INT 3. От кнопки десятков 4. От кнопки единиц 5. От кнопки Старт/Стоп Прерывание от таймера: При каждом переполнении таймера, скажем 1мс(можно и больше), будет инкрементироваться переменная RTC(Real Time Counter). По значению этой переменной мы будем знать время. И изменять по прошествию минуты значение переменной "минуты". В режиме СОН, вывод порта RB0 сконфигурирован на вход. Также режиме ОТСЧЕТ и СИГНАЛ. Прерывание от RB0 будет выполнять 2 задачи: 1. Будить девайс. при этом state устанавливаем в единицу. При этом нужно бибикнуть. 2. Досрочно укладывать девайс спать, Если одна из кнопок будет зажата дольше чем 1с. Время обработки этих прерываний не критично. Точно считать реальное время нужно только в режиме ОТСЧЕТ, а в этом режиме будет работать только прерывание от таймера. Если же пользователь зажмет любую кнопку, значение часов будет по барабану поскольку девайс заснет. Прерывание от кнопки Десятков: Это прерывание будет работать только в режиме УСТАНОВКА. Каждое нажатие этой кнопки будет инкрементировать байт десятков и проверять не равен ли он девяти. Если равен, сброс переменной. Прерывание от кнопки единиц минут: Будет работать только в режиме УСТАНОВКА. инкремент переменной "минуты". Если она равна 9, сброс переменной. Прерывание от кнопки Старт/Стоп в режиме установка: ЕСЛИ Десятки не равны нулю И единицы не равны нулю state++; Бибикнуть( ); Критикуем=) |
|
|
Книга о switch-технологии вот: http://is.ifmo.ru/books/switch/6 Разговор об этом был тут: http://pro-radio.ru/controllers/2108-54/ Я бы сначала определился с условиями, при которых должны происходить переходы между состояниями. И с действиями, которые должны при этом выполняться. Тогда сможем нарисовать более подробный граф, отметить на нём эти условия и действия. А потом уже, глядя на граф, писать код. Это будет наглядно и всем понятно, я надеюсь. Отдельные прерывания от кнопок я бы делать не стал. Пробуждение - да, по INT. А для считывания положения кнопок не лучше ли будет предусмотреть специальную функцию, с подавлением дребезга. А в прерываниях по переполнению таймера нам ещё динамическую индикацию организовать требуется, помните. |
|
|
За книгу спасибо, жаль только что кусками. Подумаю пока над условиями переходов. Чем Вам ненравятся прерывания от кнопок? Конечно не так читабельно.... Но так отпадает задача игнорирования одновременного нажатия кнопок. Точная работа прерываний от таймера нужна только в режиме отсчета, а в этом режиме у нас прерывания только от ИНТ. Туда лепить плавное приращение цифр прийдется, но я в этом особой проблемы не вижу. Насчет индикации. Можно подробней? Сделал таймер на 4 индикатора, в прерывании от таймера только младший байт секунд приращивал. Он правда спешил довольно ощутимо, но пришла сессия и мне резко не до разбирательств и экспериментов стало.Может я просто лишний раз инкрементировал значения, нужно заглянуть.... Скажите, какие именно действия планируется выполнять в прерывании от таймера? |
|
|
Как вариант: счёт времени (в режиме счёта), проверка - не истекла ли выдержка, поочерёдный вывод текущих символов на разряды индикатора, отслеживание останова счёта пользователем. Только вот я ещё не решил, как лучше обмениваться данными между обработчиком прерываний и основной программой. У меня было для этой цели 3 флага - GO, USERSTOP, START. GO - признак режима счёта, USERSTOP - признак принудительного сброса пользователем, START - чтоб различать ситуации, когда пользователь дал команду "старт" и ещё не успел кнопку отпустить, и когда он кнопку в режиме счёта нажал, чтоб сбросить. Возможно, это не лучшее решение. Тут я ещё подумаю. И, кстати, прерываний как таковых по INT у меня не было предусмотрено. Ведь есть возможность просто будить МК, не отправляя его в обработку прерывания. Для этого делается GIE = 0. Могу показать свои наброски графов, но лучше завтра. А то у нас, смотрю, опять ликбез в диалог вырождается. Завтра народу побольше будет, вот и обсудим. |
|
|
picmaniac, под терминалами имелись в виду терминальные символы. В тех книгах, которые Вы рекомендуете, этот термин (прошу прощения за каламбур) встречается довольно часто  |
|
|
|
|