здравствуйте, вообщем я человек молодой, неопытный, самоучка, если кто подкинет мне статью и подскажет как и что буду очень благодарен, интересует след концепция: у меня есть дисплей, есть клавиатура, и есть некое устройство с n кол-вом плат. Мне надо написать систему управления данным устройством ( CAN интерфейс ), скажем так, на данном этапе я освоил сам интерфейс (уже связал 2 платы, разобрался с идентификаторами, данными), написал свой API для работы с дисплеем, с CAN шиной, с клавиатуров. Интересует следующее - у меня есть функция, которая возвращает в глобальную переменную код символа нажатой клавиши, или код отсутсвия нажатия. У меня есть таймер, который каждую 1мс генерирует прерывание, в теле этого прекрывания я вызываю эту функцию т.е. каждую 1 мс я переписываю содержимое кода клавиши. Какой вид всё это будет иметь?
я вижу это примерно так:
Код:
unsigned char key=0xff; // глобальная переменная с кодом клавишы 0xff - отсутсвие нажатия клавишы interrup timer { code_keys(); // здесь я вызываю функцию сканирования клавиатуры }
int main() { initialization(); // допусти тут инициализация всякой перефирии итп // отсюда я начинаю выводить на дисплей меню и соответвенно обрабатывать нажатия клавиш // как я это представляю себе while(1) { switch(key) { case 1: // вызов менюшки 1 - графика + новые реакции на нажатия клавиш - т.е. аналогичная данной конструкции, т.е. while содержит // такой же switch итж break case 2: // вызов менюшки 2 break; key=0xff; // по идее я должен обнулять здесь нажатие клавиши и точно так же должен его обнулять при каждом вызове функции // сканирвоания клавишы... } } }
просто уже споткнуля несколько раз на то, что приходится переписывать всё почти заного, вот поэтому хотелось бы по возможности на чужих граблях подучиться
уточните: на кой ляд раз миллион раз в секунду определять код клавиши, если клавишу по определению нажимать может человек, который даже если он Брюс Ли и Джеки Чан в одном флаконе не сумеет нажать кнопку чаще, чем 100 раз в секунду?!
и еще, чисто из опыта: вы почему-то присвоили отсутствию нажатия ненулевой код... не смотря на то, что программе все равно, для человека 0 - это аналог отсутствия чего-либо. советую при написании программы, а тем более при обдумывании ее концепции, придерживаться традиционной человеческой логики - тогда и проблем с переделками с нуля будет меньше навеняка.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
уточните: на кой ляд раз миллион раз в секунду определять код клавиши, если клавишу по определению нажимать может человек, который даже если он Брюс Ли и Джеки Чан в одном флаконе не сумеет нажать кнопку чаще, чем 100 раз в секунду?!
и еще, чисто из опыта: вы почему-то присвоили отсутствию нажатия ненулевой код... не смотря на то, что программе все равно, для человека 0 - это аналог отсутствия чего-либо. советую при написании программы, а тем более при обдумывании ее концепции, придерживаться традиционной человеческой логики - тогда и проблем с переделками с нуля будет меньше навеняка.
вот об этом я и говорю, я не знаю как лучше делать)
допустим буду я это делать каждые 200мс, а в обработчике буду просто counter++ какой-нибудь считать до 200 - нормально?
про отсутсвие нажатия и 0 - там это связанно с аппаратным подключением мк к клавишам и опросом клавиатуры, вообщем так сделать проще и так уже было сделано до меня, и в др устройствах сделано у нас так же, поэтому тут лучше оставить, сам опрос я поменял - добавил проверок и т.п.
Последний раз редактировалось jazz393 Пт апр 18, 2014 19:33:31, всего редактировалось 1 раз.
чтобы мои ответы не были пустословием, мне недостаточно информации о том, какую конечную цель вы хотите достичь - это раз. неизвестно, как и на какой элементной базе вы построили схемотехнику: что за клава, сколько кнопок, как она подключена к МК и т.п. - это два
это минимум вопросов, без ответов на которые все советы будут пустым звуком.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
чтобы мои ответы не были пустословием, мне недостаточно информации о том, какую конечную цель вы хотите достичь - это раз. неизвестно, как и на какой элементной базе вы построили схемотехнику: что за клава, сколько кнопок, как она подключена к МК и т.п. - это два это минимум вопросов, без ответов на которые все советы будут пустым звуком.
а зачем эта инфа? у меня есть рабочий опрос клавиш, который выдает мне код , опрос сделан как-то хитро - код клавишы обязательно содержит 6 единиц, что собственно я и проверяю. Какая там клава - беспонятия, работает и слава богу. Мк - at90can128 16MHz - врядли вам это что-то даст.. ..
да хотя бы затем, что лично мне обращаться к функции опроса клавиатуры в прерывнии по таймеру, да еще миллион раз в секунду, никогда бы и в голову не пришло даже с перепою! но вы почему-то так сделали - я хочу знать вашу мотивацию. я ведь не исключаю, что теоретически такое может быть необходимо... ща я начну вам рассказывать, как надо работать с клавой и заведу вас в тупик... мне хотелось бы, чтобы вы мне спасибо сказали за советы, а не послали куда-то...
и вообще, все решения зависят от условия задачи.
с вашим МК я работал, кстати. и с клавой тоже
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
да хотя бы затем, что лично мне обращаться к функции опроса клавиатуры в прерывнии по таймеру, да еще миллион раз в секунду, никогда бы и в голову не пришло даже с перепою! но вы почему-то так сделали - я хочу знать вашу мотивацию. я ведь не исключаю, что теоретически такое может быть необходимо... ща я начну вам рассказывать, как надо работать с клавой и заведу вас в тупик...
я не знаю как лучше и почему, с этой целью я и создал данную тему... и источников которые бы адекватно описывали данную информацию я тоже не имею
вот лично я из множества реализованных проектов задействовал прерывания для клавиатуры буквально в одном или двух случаях, во всех остальных все делал исключительно методом поллинга, сиречь опроса.
если ваша функция опроса возвращает код нажатых кнопок - почему бы вым не использовать ее именно для опроса? почему хотите сунуть ее в прерывания?
Код:
static uint8_t get_key(void);
int main(void){ initialization(); while(1){ switch(get_key()){ case K_NONE: break; case K_ENTER : // что-то там } } }
чем плох этот подход в вашем случае?
далее, пусть ваша функция возвращает 0xFF, если кнопки не нажаты. могу ли я предположить, что если нажать какую-то кнпку, придет один или несколько нулевых битов в возвращаемом значении? т.е. у вас как бы инверсное кодирование кодов. ну и скажите, где логика: не нажато (т.е. ничего нет) - НЕ НОЛЬ, нажато (т.е. что-то есть) - выдаем НУЛИ... разве человек привык про пустой карман говорить - в нем лежит много пустоты, а про полный - в нем лежит не много пустоты? это ведь не по-человечески! кто мешает вам в вашей функции вместо return keykode; сделать return ~keykode; и получить коды кнопок в соответствии с логикой человека: 0 если не нажато, не ноль - если нажато?
далее, обработка меню (заметил в вашем коде). меню - это не совсем основной режим, поэтому обработку перемещений по меню я никогда не делаю в основном цикле - выношу это в отдельную функцию:
int main(void){ initialization(); while(1){ switch(get_key()){ case K_NONE: break; case K_ENTER : // что-то там break; case K_MENU: switch(do_menu()){ case MNU_HELP: do_help(); break; case MNU_MODE1: set_mode(1); break; case MNU_PWR_OFF: sleep(); } break; } } }
как-то так для начала...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Ну, если действительно серьёзно и на долго хотите освоить комплексный подход к проектированию программной части такой системы, то нужно двигаться в сторону работы с сообщениями. Пример организации меню, основанного на сообщениях можно посмотреть тут: Организация древовидного меню. Также автор недавно выложил исходники в этой теме: PinBoard и древовидное меню.
Смысл в том, что при объединении многих частей в систему, нужно как-то единообразно и одновременно со всем этим хозяйством общаться. Для этих целей используются операционные системы, но их трудно применить, когда точно сам не знаешь что нужно или нет большого опыта в этой части. Поэтому можно сделать упрощённую модель ОС, основанную на сообщениях и менеджере сообщений, который доставляет их куда нужно.
Чтобы понять концепцию, нужно загрузить исходник в Proteus, поставить везде точки останова и изучать работу алгоритма. Скажу ещё, что я лично этот код не пробовал, я просто на него взглянул по-диагонали. Для себя я написал похожий код, но он выглядит куда сложнее и на C++.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 56
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения