|
Внимание! Форум только для чтения, продолжение на Shemaforum.ru
Помощь в программировании
|
| Ср, 15.11.2017, 16:18 | Сообщение # 81
|
nolpofaze
Постов: 681
Друзья |
Ник, выдели переменную, допустим flag_s и в прерывании приравниваешь ее к 1, в майне проверяешь, если у флага есть 1, то делаешь то-то и сбрасываешь флаг в 0. Еще, обработку кнопок лучше сделать на еще одном таймере. А то у тебя антидребезг, не совсем, выходит, что на время антидребезга контроллер впадает в кому)
Отредактировал nolpofaze - Ср, 15.11.2017, 16:28 |
| |
| Ср, 15.11.2017, 16:31 | Сообщение # 82
|
Ник
Постов: 229
Друзья |
nolpofaze, то есть кнопки обрабатывать в прерывании или я не так понял (извиняюсь за глупые вопросы просто охота правильно понять).
|
| |
| Ср, 15.11.2017, 16:35 | Сообщение # 83
|
nolpofaze
Постов: 681
Друзья |
Ник, точно, в прерывании, таймеров хватает. Да, подсчет минут, часов, ЖКИ можно вот по этому indikacia_LCD флажку и делать, а из прерывания все это вытряхнуть. Дело в том, что этот таймер работает на частоте кварца 32768Гц, это очень не быстро, и нагружать прерывание еще и расчетом чего-то там, представь сколько это все займет времени (как-бы и не те твои 12 секунд в час)?
|
| |
| Ср, 15.11.2017, 16:51 | Сообщение # 84
|
Ник
Постов: 229
Друзья |
Дело в том что в живую часы спешат. Можно написать пример по обработке кнопок?Добавлено (15.11.2017, 16:51) --------------------------------------------- И еще вопрос когда обрабатавается прерывание в это время таймер уже начал новый отсчет или нет, и нужно ли делать обнуление счетчика в прерывании или это делать когда нужно по решению какой то задачи?
|
| |
| Ср, 15.11.2017, 17:20 | Сообщение # 85
|
nolpofaze
Постов: 681
Друзья |
Да, счетчик таймера2 считает не останавливаясь от 0 и до 255 по кольцу, и только в момент 255+1=0 идет по вектору прерывания по переполнению, вот-сюда: interrupt [TIM2_OVF] void timer2_ovf_isr(void) выполнение твоего кода (а таймер, это периферийное устройство, как принтер у PC, продолжает свою работу, считает). Какого счетчика? Если счетчика таймера2, то не надо ничего обнулять.Добавлено (15.11.2017, 17:20) --------------------------------------------- Ник, я бы поделился примером, но не на си, на си нет у меня.
|
| |
| Ср, 15.11.2017, 17:35 | Сообщение # 86
|
Ник
Постов: 229
Друзья |
Сделал мелкие изменения в программе. Залил на макетку программу, и о, чудо! 20 мин работают и пока не спешат 
|
| |
| Чт, 16.11.2017, 08:30 | Сообщение # 87
|
nolpofaze
Постов: 681
Друзья |
Ник, мы рады за тебя) а то кварц плохой, кварц плохой)Добавлено (16.11.2017, 08:30) --------------------------------------------- Осталось кнопки по человечьи сделать... Алгоритм простой, настраиваешь таймер на частоту герц так на 200-300 (5-6 мс) и в обработке прерывания проверяешь уровни на ногах где кнопки, ну и соответственно на каждую кнопку свой обработчик)
|
| |
| Чт, 16.11.2017, 16:18 | Сообщение # 88
|
Ник
Постов: 229
Друзья |
То есть если мне надо задержка на ~ 0.8 сек перед изменением значения, то надо зайти ~240 раз в прерывание, а обработчик делать в основной программе. И как быть если все таймеры задействованы? Я перед этой программой написал многоканальный регулятор температуры, то там мне пришлось задействовать все три таймера и кнопки я обрабатывал в функции. Каждая функция (к примеру изменение температуры) для своих кнопок.
|
| |
| Чт, 16.11.2017, 16:49 | Сообщение # 89
|
nolpofaze
Постов: 681
Друзья |
Ник, если задействованы все таймеры, то есть смысл делать программный таймер, на одном из задействованных. Т.е. делаешь счетчик/счетчики, щелкаешь им/ими в прерывании таймера, а в основной функции проверяешь значение. Совпало значение -> выполняешь что-то, что надо. interrupt [TIM1_OVF] void timer1_ovf_isr(void) { proc1++; proc2++; proc3++; }
void main(void) {
while(1) { if(proc1==20) funk1; if(proc2==50) funk2; if(proc3==150)funk3; } }
void funk1(void) { делаем что-то полезное... proc=0; } void funk2(void) { ......} ..... как-то так. А задержка... плохо это, задержка (delay - в любых видах). Часики, точно будут лагать.
Отредактировал nolpofaze - Чт, 16.11.2017, 16:52 |
| |
| Чт, 16.11.2017, 17:27 | Сообщение # 90
|
Ник
Постов: 229
Друзья |
Вот чтобы избавиться от delay, я сделал такие значения на кнопках. Программа все равно выполняется, она на условии не зависает. Войдя в условие прибавило значение дребезга и продолжило дальше, пока зажата кнопка будет и дальше прибавлять значение дребезга и обрабатывать программу. Вроде при работе программы я тормозов не увидел, да вроде и глюков пока нет (ее уже используют почти месяц). Попробую написать программу с использованием предложенного метода даже сейчас видно что можно использовать разные временные задержки главное правильно рассчитать. Почти операционка выходит. nolpofaze, огромное спасибо.
|
|
Форум только для чтения, обсуждение на Shemaforum.ru
|
|