простые интересные РАДИОСХЕМЫ сделанные своими руками

» Гость

Мы рады вас видеть. Пожалуйста зарегистрируйтесь или авторизируйтесь!





» ДАТАШИТЫ
Например: TDA1562

» СХЕМЫ


Отметить прочитанными   -   Поиск   -   Правила   -   Новые сообщения

Модератор форума: Igoran, Витинари, Sam  
Форум радиолюбителей » СХЕМЫ » НАЧИНАЮЩИМ » Помощь в программировании (Подскажите в какой теме можно задать вопрос)
Помощь в программировании
Ср, 15.11.2017, 16:18 | Сообщение # 81        
nolpofaze
аватар
  Постов: 397  Offline Друзья 
Ник, выдели переменную, допустим flag_s и в прерывании приравниваешь ее к 1, в майне проверяешь, если у флага есть 1, то делаешь то-то и сбрасываешь флаг в 0. Еще, обработку кнопок лучше сделать на еще одном таймере. А то у тебя антидребезг, не совсем, выходит, что на время антидребезга контроллер впадает в кому)


Отредактировал nolpofaze - Ср, 15.11.2017, 16:28
Ср, 15.11.2017, 16:31 | Сообщение # 82        
Ник
аватар
  Постов: 210  Offline
nolpofaze, то есть кнопки обрабатывать в прерывании или я не так понял (извиняюсь за глупые вопросы просто охота правильно понять).
Ср, 15.11.2017, 16:35 | Сообщение # 83        
nolpofaze
аватар
  Постов: 397  Offline Друзья 
Ник, точно, в прерывании, таймеров хватает. Да, подсчет минут, часов, ЖКИ можно вот по этому indikacia_LCD флажку и делать, а из прерывания все это вытряхнуть. Дело в том, что этот таймер работает на частоте кварца 32768Гц, это очень не быстро, и нагружать прерывание еще и расчетом чего-то там, представь сколько это все займет времени (как-бы и не те твои 12 секунд в час)?
Ср, 15.11.2017, 16:51 | Сообщение # 84        
Ник
аватар
  Постов: 210  Offline
Дело в том что в живую часы спешат. Можно написать пример по обработке кнопок?

Добавлено (15.11.2017, 16:51)
---------------------------------------------
И еще вопрос когда обрабатавается прерывание в это время таймер уже начал новый отсчет или нет, и нужно ли делать обнуление счетчика в прерывании или это делать когда нужно по решению какой то задачи?

Ср, 15.11.2017, 17:20 | Сообщение # 85        
nolpofaze
аватар
  Постов: 397  Offline Друзья 
Да, счетчик таймера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        
Ник
аватар
  Постов: 210  Offline
Сделал мелкие изменения в программе. Залил на макетку программу, и о, чудо! 20 мин работают и пока не спешат smile
Чт, 16.11.2017, 08:30 | Сообщение # 87        
nolpofaze
аватар
  Постов: 397  Offline Друзья 
Ник, мы рады за тебя) а то кварц плохой, кварц плохой)

Добавлено (16.11.2017, 08:30)
---------------------------------------------
Осталось кнопки по человечьи сделать... Алгоритм простой, настраиваешь таймер на частоту герц так на 200-300 (5-6 мс) и в обработке прерывания проверяешь уровни на ногах где кнопки, ну и соответственно на каждую кнопку свой обработчик)

Чт, 16.11.2017, 16:18 | Сообщение # 88        
Ник
аватар
  Постов: 210  Offline
То есть если мне надо задержка на ~ 0.8 сек перед изменением значения, то надо зайти ~240 раз в прерывание, а обработчик делать в основной программе. И как быть если все таймеры задействованы? Я перед этой программой написал многоканальный регулятор температуры, то там мне пришлось задействовать все три таймера и кнопки я обрабатывал в функции. Каждая функция (к примеру изменение температуры) для своих кнопок.
Чт, 16.11.2017, 16:49 | Сообщение # 89        
nolpofaze
аватар
  Постов: 397  Offline Друзья 
Ник, если задействованы все таймеры, то есть смысл делать программный таймер, на одном из задействованных. Т.е. делаешь счетчик/счетчики, щелкаешь им/ими в прерывании таймера, а в основной функции проверяешь значение. Совпало значение -> выполняешь что-то, что надо.
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        
Ник
аватар
  Постов: 210  Offline
Вот чтобы избавиться от delay, я сделал такие значения на кнопках. Программа все равно выполняется, она на условии не зависает. Войдя в условие прибавило значение дребезга и продолжило дальше, пока зажата кнопка будет и дальше прибавлять значение дребезга и обрабатывать программу. Вроде при работе программы я тормозов не увидел, да вроде и глюков пока нет (ее уже используют почти месяц). Попробую написать программу с использованием предложенного метода даже сейчас видно что можно использовать разные временные задержки главное правильно рассчитать. Почти операционка выходит. nolpofaze, огромное спасибо.
Форум радиолюбителей » СХЕМЫ » НАЧИНАЮЩИМ » Помощь в программировании (Подскажите в какой теме можно задать вопрос)
Поиск:
Кто есть кто на форуме радиолюбителей: Администратор Модераторы Друзья Пользователи
Группа вконтакте Канал ютуб Группа в фэйсбук Мобильная версия © 2010-2018, "Радиосхемы". Все права защищены. Почта