Jump to content

-=FISHER=-

Members
  • Content Count

    746
  • Joined

  • Last visited

Community Reputation

5 Обычный

About -=FISHER=-

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

Информация

  • Город
    Уфа

Электроника

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

Recent Profile Visitors

1336 profile views
  1. В общем я сделал "по тупому": void set_bright(uint8_t cnum, uint8_t mode) { if(dir==1) //если увеличиваем яркость { if(chanel[cnum].Bright[mode] < 255) //пока не уперлись в потолок увеличиваем яркость { chanel[cnum].Bright[TARGET]+=dir; } else //а когда упёрлись { //мигаем тем каналом, яркость которого регулировали, останавливая мигание //на предельном значении потолка, т. е. 255 if(cnum==0){OCR1A=0; _delay_ms(100); OCR1A=255; _delay_ms(100); } if(cnum==1){OCR1B=0; _delay_ms(100); OCR1B=255; _delay_ms(100); } } } if(dir==-1) //если уменьшаем яркость { if(chanel[cnum].Bright[mode] > 0) //пока не уперлись в пол увеличиваем яркость { chanel[cnum].Bright[TARGET]+=dir; } else //а когда упёрлись { //мигаем тем каналом, яркость которого регулировали, останавливая мигание //на предельном значении потолка, т. е. 0 if(cnum==0){OCR1A=255; _delay_ms(100); OCR1A=0; _delay_ms(100);} if(cnum==1){OCR1B=255; _delay_ms(100); OCR1B=0; _delay_ms(100);} } } }
  2. Спасибо, добавил. В этом случае "мигаем" пока кнопка остается нажатой. Потом кнопку отпусили и при следующем нажатии яркость должна начать в противоположную сторону. Но ведь теперь туда уже не войти? Голову сломал уже, как же найти такой алгоритм, чтобы это заработало?... void set_bright(uint8_t cnum, uint8_t mode) { if((chanel[cnum].Bright[mode] < 255) && (chanel[cnum].Bright[mode] > 0)) //изменяем яркость, пока не упремся в границу { chanel[cnum].Bright[TARGET]+=dir; } if((chanel[cnum].Bright[mode]==255)||(chanel[cnum].Bright[mode]==0)) //если уперлись в нижнюю или верхнюю границу { //мигаем } }
  3. Да я всё понял, очень жалко что в таком виде логика не работает. Думал может что-то очевидное упускаю.
  4. @ARV Глупый вопрос у меня... Такой красивый лаконичный метод: if((OCR1A<255)&&(OCR1A>0)) { OCR1A+=dir; } Но вот незадача, как только упремся в 255 или 0, сюда больше не можем зайти! А когда я отпускаю кнопку, направление меняется и следует начать обратно от 255 вниз или от 0 вверх... Неужели придется разбивать на два условия отдельно (OCR1A<255) else if (OCR1A>0)?...
  5. а зачем добавлять вот это при объявлении перечисления?
  6. @ARV Сейчас хочу переписать программу используя Вашу идею о том чтобы сделать массивы яркости, скорости и задержки вместо переменных для каждого значения, записал перечисления вот так: enum //ПЕРЕЧИСЛЕНИЕ ЗАДЕРЖЕК { TURN_ON, SHUT_DOWN }delay_modes ; enum //ПЕРЕЧИСЛЕНИЕ ЯРКОСТЕЙ { DAY, NIGHT, CURRENT, TARGET }bright_modes; enum //ПЕРЕЧИСЛЕНИЕ СКОРОСТЕЙ { RISE, FALL, GAB, TEMP, RUN, CHANGE }speed_modes; Теперь хочу объявить структуру с массивами, делаю так: typedef struct //структура для хранения всех свойств канала { unsigned char Delay[sizeof(delay_modes)], //задержка включения, выключения Bright[sizeof(bright_modes)]; //яркость канала днём (при выключенных габаритах) unsigned int Speed[sizeof(speed_modes)]; //скорость розжига канала } ch; На эту запись, компилятор не ругается, но потом я пытаюсь записать заводские значения для создания файла *.eep и вот здесь вываливается куча ошибок: ch chanel[CHANELS_COUNT]; ch EEMEM chanel_ee[CHANELS_COUNT] = {{.Delay[TURN_ON]=1, .Delay[SHUT_DOWN]=2, .Bright[DAY]=60, .Bright[NIGHT]=230, .Bright[CURRENT]=255, .Bright[TARGET]=255, .Speed[RISE]=250, .Speed[FALL]=250, .Speed[GAB]=10, .Speed[TEMP]=0, .Speed[RUN]=0, .Speed[CHANGE]=50}, {.Delay[TURN_ON]=4, .Delay[SHUT_DOWN]=2, .Bright[DAY]=50, .Bright[NIGHT]=230, .Bright[CURRENT]=255, .Bright[TARGET]=255, .Speed[RISE]=250, .Speed[FALL]=250, .Speed[GAB]=10, .Speed[TEMP]=0, .Speed[RUN]=0, .Speed[CHANGE]=50}}; //массив структур для двух каналов в ПЗУ Вот часть из них: Что я делаю не так подскажите пожалуйста?
  7. Понятно что реакции не хватит, но будет ли яркость меняться плавно для зрения, если прыгать через 6 ступенек? И вообще конечно самый большой для меня вопрос, это "красивая" функция мигания при упирании в предел яркости.
  8. Думаю в основном вы правы, но всё же в ходе экспериментов я понял, что комфортная скорость, исходя из эргономичности, чтобы яркость от минимума до максимума менялась при удерживании кнопки не более чем за 10 секунд. Иначе создается ощущение что устройство вялое и вообще тормозит. На моей машине сейчас стоит вот такая версия плавного розжига. Это не моя, естественно, разработка. Но основы процесса регулировки яркости с кнопки, я бы хотел реализовать примерно так: Видео демонстрация плавного розжига
  9. Тогда получится что розжиг и затухание будет происходить крайне медленно...
  10. Автоповтор ведь будет повторятся очень часто, а значит и моргание будет больше похоже на бешеный стробоскоп? И как в таком случае без таймера организовать контроль скорости моргания, я не представляю... Поделитесь пожалуйста мыслями.
  11. опечатка... Понятно, попробую вечером исправить и проверить. А если dir будет с отрицательным значением (-1), то соответственно будем убавлять? Два действия в одной строчке! как же я сам об этом не додумался! Это очень хорошая мысль! А как бы могла выглядеть эта функция например? При каждом её выполнении значение регистра OCR должно меняться то в 0, то в 255 как я это себе представляю. Но не смотря на то что заходить при нажатой кнопке программа будет очень часто, моргание должно происходить с частотой не чаще 3-4 раз в секунду я думаю. А когда кнопку мы отпустим, то регистр OCR должен опять принять исходное значение, то есть либо верхняя граница 255, либо нижняя 0. Смотря куда уперлись, логично же так?
  12. Спасибо попробую. Ещё хотел спросить, как бы мне моргать правильнее, когда счёт будет упираться в границу? Для одной кнопки обработчик нажатия будет выглядеть как-то так по смыслу, знаю что размашисто написал, и ещё будет точно такой же код только с номером канала 1, для второй кнопки. Напрашивается функция с аргументом в виде номера канала? Сильнее наверное не получится сократить, например действия для включенных и выключенных габаритов по сути одинаковые, меняется только изменяемый параметр BrightDay или BrightNight. if(state=GAB_OFF) //если габариты выключены, настраиваем дневную яркость { if(dir) //направление счёта "вверх" { if(ch[0].BrightDay<255){ch[0].BrightDay++;} //пока не уперлись прибавляем else{flash();} //если уперлись - моргаем } else //направление счёта "вниз" { if(ch[0].BrightDay>0){ch[0].BrightDay--;} //пока не уперлись вычитаем else{flash();} //если уперлись - моргаем } } if(state=GAB_ON) //если габариты включены, настраиваем ночную яркость { if(dir) //направление счёта "вверх" { if(ch[0].BrightNight<255){ch[0].BrightNight++;} //пока не уперлись прибавляем else{flash();} //если уперлись - моргаем } else //направление счёта "вниз" { if(ch[0].BrightNight>0){ch[0].BrightNight--;} //пока не уперлись вычитаем else{flash();} //если уперлись - моргаем } }
  13. Я объявляю и инициализирую переменную сразу так: char dir = 1; Затем при отжатии кнопки происходит действие: dir*=-1; Я предполагаю что значение переменной dir в таком случае может быть либо 1 либо -1.
×
×
  • Create New...