Jump to content

-=FISHER=-

Members
  • Content Count

    729
  • Joined

  • Last visited

Community Reputation

5 Обычный

About -=FISHER=-

  • Rank
    Завсегдатай

Информация

  • Город
    Уфа

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    Автоэлектрика

Recent Profile Visitors

1314 profile views
  1. Выглядит лаконичнее, надо бы запомнить.
  2. Но ведь иначе "отжатие" кнопок не отследить?...
  3. Только вот в Вашем примере, если ни одна кнопка не нажата, то таймер останавливает,а мне ведь нужно чтобы в этом случае менялось направление... И если я просто допишу в этот if, переворот значение direction, то оно будет меняться при каждом опросе кнопок.
  4. @ARV У меня получилось адаптировать тот программный таймер который я использую под Ваши примеры (дописав пару функций и исправив существующие). Всё заработало как часы! Спасибо! Осталось разобраться с "переворотом направления" изменения яркости, и морганием при упоре в потолок или пол. Разбираюсь.
  5. Сейчас разбираю Ваш пример, появились вопросы. 1. Чтобы таймер запустился без выполнения процедуры, Вы запускаете его с параметром NULL вместо указания ссылки на функцию? void StartTimer(SoftTimer *CurSoftTimer, enum StateTimer state, unsigned int time, void (*pFunc)()); StartTimer(&Timer_KK, ACTIVE, 1*sec, NULL); 2. Я правильно понимаю, что эта функция вернет TRUE если значения поля time для указанного таймера будет равно 0? bool TimeoutTimer(SoftTimer *CurSoftTimer) //проверяем не вышло ли время { return CurSoftTimer->time == 0; } if(TimeoutTimer(&Timer_KK)) //если время таймера вышло { //что-то делаем }
  6. В коде, что я выше привел функция get_button тоже возвращает комбинацию битов, перед этим обрабатывая дребезг. А в вашем случае, Вы как раз результат работы аналогичной функции и передаете в key_repeater? И через определённое время транслируете дальше? А как потом анализируете? Вернула она вам например 0b00000001, какие дальше варианты?
  7. Хотел сейчас записать функцию опроса кнопок вот так: uint8_t get_button(void) //опрос сразе двух кнопок { static unsigned char but_code; but_code=PIND & BUTTON_PINS; _delay_ms(10); if(but_code==(PIND & BUTTON_PINS)) { return but_code; } else { return 0xff; } } void check_buttons(void) { static unsigned char command; command=get_button(); if(command==Command_CH0_BTN_CLICK) //нажали кнопку №1 { if(input_state==GAB_ON) { } if(input_state==GAB_OFF) { } } if(command==Command_CH1_BTN_CLICK) //нажали кнопку №2 { if(input_state==GAB_ON) { } if(input_state==GAB_OFF) { } } if(command==Command_ALL_BTN_OFF) //ни одна кнопка не нажата { if(direction){direction=-1;} else{direction=1;} } } Но понимаю что такой подход не подойдет, ведь при входе в эту функцию, когда ни одна кнопка не нажата, постоянно будет инвертироваться значение направления изменения значения... Получается нужно делать по старинке опрашивая каждый пин отдельно, учитывать дребезг и кучу флагов нажатия и отжатия использовать?...
  8. Я просто пока вижу только один вариант, это отследив нажатие кнопки (кстати в автомате состояний, как вы меня когда-то научили), затем через if проверив включены ли габариты и исходя (как Вы мне показали только что) из значения direction отнять или прибавить яркость, и опять такие проверив перед этим через if, не уперся ли я в потолок или дно. UPD: сейчас только понял что в автомате состояний не получится, так как отслеживать одно и то же нажатие нужно много раз подряд, не переходя в другое состояние.
  9. Это гениально!)) То есть достаточно просто опрашивать кнопку раз в 100 мс ?? Это проще чем я думал! Значит опрос кнопки нужно проводить в прерывании таймера, откалиброванным на 100 мс. А можете рассказать, хотя бы в общих чертах, что имеется ввиду под хитрым способом с Вашей колокольни?
  10. Да, именно так и планировал, но вот дальше. А если я не буду его анализировать явно, типа: if(dir==0){прибавляем яркость;} if(dir==1){убавляем яркость} То как же МК поймет когда прибавлять, а когда убавлять?... Процесс изменения одинаков, если брать во внимание количество каналов, для всех 8 яркостей, поэтому универсальная функция бы здесь не помешала... Да, но если изменение яркости (инкремент Bright++) будет происходить каждый раз, когда программа будет отслеживать нажатие кнопки - неправильно, потому что светодиод вспыхнет на полную яркость за доли секунды. Вот поэтому я написал что нужно как бы разрешение (наверное это не самый рациональный подход, но концепция ведь верная?) на изменение яркости, которое будет выдаваться, предположим, каждые 100 мс. @ARV Спасибо что отвечаете
  11. Нужно распутать клубок if-else... Вот смотрите, прежде чем изменить яркость мне нужно проверить аж 4 параметра, это всё у меня получаются вложенные if-else. Допустим я отловил нажатие первой кнопки (пример для 0-го канала): 1. Разрешено ли изменение яркости? (То есть "протикал" ли таймер нужный отрезок времени чтобы яркость плавно изменялась, а не мгновенно); 2. Какое направление изменения яркости (наращивать или убавлять яркость?); 3. Включены габариты или нет? (Чтобы понимать дневной или ночной параметр мы регулируем) (input_state == GAB_ON) или (input_state == GAB_OFF); 4. Яркость уже достигла минимума или максимума? (Чтобы морганием сигнализировать о достижении предела). И только потом будет ясно, какой из вариантов действий выбрать: chanel[0].BrightDay++; chanel[0].BrightDay--; chanel[0].BrightNight++; chanel[0].BrightNight--;
  12. У меня просто в голове крутится конструкция с множеством IF-ELSE, мне почему-то кажется это неправильным. Я вечером распишу как я это представляю и скину сюда.
  13. У меня появился интересный вопрос, каким образом можно более рационально организовать настройку параметра яркости каждого из двух каналов, с помощью двух кнопки, при следующих условиях. Меня интересует для начала хотя бы алгоритм: 1. Имеется две кнопки, одна для 1-го канала, другая для 2-го; (Далее пример реакций на нажатие для одной кнопки, для второй всё аналогично, только номер канала меняется). 2. Нажимая на кнопку первый раз и удерживая, начинает расти яркость канала; 3. Отпустив кнопку и нажав её повторно и удерживая начинает уменьшаться яркость канала; 4. Если яркость упрется в 0 или 255, канал начинает моргать, показывая что достигнуто критическое значение; 5. Есть режим яркости для выключенных габаритов и для включенных, какой из них включен на данный момент, определяется по содержанию переменной button_state, которое может равняться 1 или 0. @ARV Было бы интересно услышать Ваш подход с методами нисходящего программирования.
  14. Это опечатка, выше поправил
×
×
  • Create New...