Anjey_N 0 7 марта, 2008 Опубликовано 7 марта, 2008 · Жалоба Всем привет! Вот пришёл просить помощи. Задача несложная, только я вконец уже запутался. Есть МК ATmega16, АЛС, индикация динамическая, кнопки М, +, - Есть массив переменных set_temp[3]. Пока кнопки не нажаты, происходит каждые 5 сек поочерёдный вывод на индикатор содержимого массива. ( с этим я разобрался работает). При нажати на М включается режим редактирования, 2 мл разряда индикатора мигают. Кнопками + и - изменяется содержимое элемента массива. Последующее нажатие М приводит к переходу к следующему элементу массива. Если все элементы отредактированы - записать в EEPROM. Кто что посоветует, или поможет кодом. Свой я надлежаще оформлю и выставлю позже. Пишу на Си в ИАРе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 7 марта, 2008 Опубликовано 7 марта, 2008 · Жалоба А вопрос-то в чем - как кнопки опрашивать? Кнопки нужно опрашивать одновременно с выводом на индикатор - настроить PA7 на вход, включить встроенный pull-up (хотя я бы поставил внешний) и смотреть состояние порта с некоторой задержкой после начала вывода очередной цифры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 7 марта, 2008 Опубликовано 7 марта, 2008 · Жалоба в прерывании таймера - опрос кнопок, антидребезг, установка флагов нажатия кнопок, динамическая индикация. в главном цикле - логика обработки флагов нажатых кнопок: смена содержимого ячейки, индекса текущей ячейки, запись в EEPROM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anjey_N 0 7 марта, 2008 Опубликовано 7 марта, 2008 · Жалоба А вопрос-то в чем - как кнопки опрашивать? Кнопки нужно опрашивать одновременно с выводом на индикатор - настроить PA7 на вход, включить встроенный pull-up (хотя я бы поставил внешний) и смотреть состояние порта с некоторой задержкой после начала вывода очередной цифры. я так исделал, код кнопки я получаю, не получается дальше. Не сохраняются данные в памяти, содержимое масива при длительном нажатии на кнопку увеличивается/уменьшается неравномерно, иногда останавливается. Если вам не сложно и есть желание можете написать свой код Хочется посмотреть! :beer: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
algidim 0 7 марта, 2008 Опубликовано 7 марта, 2008 · Жалоба У вас схема не может работать по определению, ну подумайте сами. В тот момент, когда вы выставляете на PA7 лог 1 и опрашиваете PD0-PD2, с челью узнать нажатую кнопку, вы получите на PD0-PD2 в любом случае лог 1, даже если кнопки не нажаты, если конечно, у вас подключены встроенные подтягивающее резисторы. Если они не подключены то результат опроса будет не предсказуем, похоже, у вас такая ситуация. Просто, прежде чем проектировать подобные схемы, нужно чётко представлять логику её работы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 7 марта, 2008 Опубликовано 7 марта, 2008 · Жалоба Поскольку для динамической индикации используется "бегущая единица", а не "бегущий ноль", то диоды нужно развернуть анодами к сканирующим пинам МК и катодами к кнопкам. А на PA7 поставить pull-down (резистор к общему проводу). Насчет алгоритмов сканирования и устранения дребезга здесь писали настолько часто, что еще один раз пальцы об клаву мозолить уже нет никакого желания. :( Пользуйтесь поиском по форуму! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 7 марта, 2008 Опубликовано 7 марта, 2008 · Жалоба Поскольку для динамической индикации используется "бегущая единица", а не "бегущий ноль... С чего бы это вдруг? Посмотрите на схему - там p-n-p транзисторы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anjey_N 0 7 марта, 2008 Опубликовано 7 марта, 2008 (изменено) · Жалоба У вас схема не может работать по определению, ну подумайте сами. В тот момент, когда вы выставляете на PA7 лог 1 и опрашиваете PD0-PD2, с челью узнать нажатую кнопку, вы получите на PD0-PD2 в любом случае лог 1, даже если кнопки не нажаты, если конечно, у вас подключены встроенные подтягивающее резисторы. Если они не подключены то результат опроса будет не предсказуем, похоже, у вас такая ситуация. Просто, прежде чем проектировать подобные схемы, нужно чётко представлять логику её работы. Не совсем так. Эта схема работает. И не только в симуляторе, но и на реальном контроллере, упрравление идёт через JTAG. PA7 настроен на вход с подтягивающим резистором. Когда нажата кнопка, лог. нуль через диод, замкнутую кнопку подаётся на вход PA7. Запоминается номер вывода и взводится флаг антидребезга на 20 мсек для устранения дребезга. После этого программа улучает момент, когда лог. нуль появляется на том выводе, который она запомнила перед пднятием флага антидребезга. Если кнопка замкнута, тогда номер вывода = запомненному номеру и программа возвращает номер вывода, те номер кнопки. Может туманно объяснил, смотри код // Сканирование клавиатуры unsigned char Scan_Key(void) { static unsigned char pk=0; static unsigned char Key_Buf; if(TESTBIT(flag,DREBEZG)) // { if(cnt_dr!=0) { delay_timer1(MSEC(1)); // задержка 1 мсек // delay_ms(1); cnt_dr--; } else { cnt_dr=CNT_DR_MAX; CLEARBIT(flag,DREBEZG); BUZER=0; // снять звуковой сигнал } } else { switch (h) { case 0 : if (!KEY) // кнопка нажата! { SETBIT(flag,DREBEZG); // взвести флаг антидребезга BUZER=1; // подать звуковой сигнал Key_Buf=n; // запомнить номер кнопки h++; // увеличить счётчик прохождений } pk=0; break; case 1 : if(n==Key_Buf) { if (!KEY) { SETBIT(key,n); // запоминаем нажатую кнопку! pk=key; SETBIT(flag,KEYBOARD); } else // если кнопка отжата, { // то проверяем - действительно ли SETBIT(flag,DREBEZG); // взводим флаг антидребезга h++; // и увеличиваем счётчик прохождений } } break; case 2 : if((KEY)&&(Key_Buf==n)) // если кнопка отжата и её { // номер соответствует записанному в буфер Key_Buf=0xFF; // запись в буфер неиспользуемого числа h=0; // обнуление счётчика прохождений pk=0; key=0; CLEARBIT(flag,BUSY); } break; default: break; } } return pk; } Изменено 7 марта, 2008 пользователем Anjey_N Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
algidim 0 7 марта, 2008 Опубликовано 7 марта, 2008 · Жалоба Да я извиняюсь, не досмотрел, схема рабочая, просто определять нажатие кнопок нужно в момент открытия любого транзистора. Ошибка в коде. А уж разбираться в вашем коде придется вам самому, за вас врят ли кто нибудь это сделает. Алгоритм сканирования кнопок и динамической индикации довольно прост. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 7 марта, 2008 Опубликовано 7 марта, 2008 · Жалоба С чего бы это вдруг? Посмотрите на схему - там p-n-p транзисторы.Миль пардон! Не стал увеличивать картинку и поэтому не рассмотрел направление стрелок. За такой стиль рисования схем наказывать нужно ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anjey_N 0 10 марта, 2008 Опубликовано 10 марта, 2008 · Жалоба Вот приготовил свой код на рассмотрение. Критикуйте! Можете потыкать меня носом в ошибки! Keys.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 10 марта, 2008 Опубликовано 10 марта, 2008 · Жалоба Так, на скорую руку писал, и без проверки, но идея вроде понятна должна быть. Если нет, то спрашивай. key.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Anjey_N 0 11 марта, 2008 Опубликовано 11 марта, 2008 · Жалоба Так, на скорую руку писал, и без проверки, но идея вроде понятна должна быть. Если нет, то спрашивай. не пошёл Ваш код. переменная антидребезга постоянно сбрасывается в исходную величину. А Вы мой код не смотрели? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 12 марта, 2008 Опубликовано 12 марта, 2008 · Жалоба не пошёл Ваш код. переменная антидребезга постоянно сбрасывается в исходную величину. А Вы мой код не смотрели? Смотрел, но ваш мне показался излишне громоздким. А что значит "не пошёл"? Там же 5 операторов. Идея то понятна? Посмотрите где я хомутнул. Если вечером время будет, то сам гляну. Индикация то работает надеюсь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rimpocha 0 12 марта, 2008 Опубликовано 12 марта, 2008 · Жалоба http://www.embedded.com/columns/breakpoint...equestid=203518 Вот! Прелестнейшая антидребезговая утилита от Jack Ganssle По таймеру это ей жирно, я решил. Дергаю из мэйнлупа -- справляется на отлично. // Service routine called by a timer interrupt bool_t DebounceSwitch2() { static uint16_t State = 0; // Current debounce status State=(State<<1) | !RawKeyPressed() | 0xe000; if(State==0xf000)return TRUE; return FALSE; } Подробное описание, в статье на английском. Если есть необходимость, переведу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться