Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прошу помочь оптимизировать код. От жары уже все плавится
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
smk

Все работает, только много места занимает. Суть смысл в том, что есть сенсор, которым нужно включать/выключать светодиод и устанавливать яркость светодиода. По задумке короткие касания включают и выключают. Удерживание переводит в режим димирования и происходит он пока удерживается сенсор. Отпущенный сенсор прекращает димирование, а через некоторое время выключает режим настройки. Желательно чтобы яркость менялась от max до min и обратно (это не влезло) ну и в 2-3 раза медленнее. Еще нужно по выходу из настройки писать в EEPROM что настроили и при включении грузить. Не влазит все это. Прошу помочь. Спасибо.

Код
        
unsigned char pwm, pwm2, flag, flag2, on_off, revers;

      if (GET_SENSOR_STATE(0) !=0)
        {
          if(flag==0) {flag2=~flag2; flag=1; pwm=0;}//
          if(pwm>80) {on_off=255; pwm2=0;}
        }
      else
        {
          flag=0;
          if((flag2==0)&(on_off==0)) DDRB &= ~(1u << PORTB2);//
          else {flag2=255;}
          if(pwm2>120) on_off=0;
        }
      if(flag2==255) DDRB |= (1u << PORTB2);
      if(on_off==255)PORTD &= ~(1u << PORTD6);
      else PORTD |= (1u << PORTD6);        
        
#pragma vector=TIMER0_COMPA_vect
__interrupt static void timer0_isr( void )
{
   if (GET_SENSOR_STATE(0) !=0)
     {
       ++pwm;
       if(on_off == 255)
       {
/*      if((revers==0)&(OCR0A != 255)) ++OCR0A;
       else
          {
          revers = 255;
          if(OCR0A !=0) --OCR0A;
          else revers = 0;
          }*/
        ++OCR0A;
       }
     }
   else ++pwm2;
}

zltigo
Использовать биты вместо байтов или если уже используете байты, то хотя-бы с зачатками разума
не:
if(on_off==255)PORTD &= ~(1u << PORTD6);
else PORTD |= (1u << PORTD6);
а в стиле:
PORTD = on_off.

не:
if(on_off == 255)
а:
if(on_off )

И так далее, и так далее....



Сам алгоритм не смотрел, но что-то счетчиков всяких многовато для такой задачи.
-SANYCH-
А зачем вам переменная "revers"?
У Вашем коде она нигде не используется, кроме как в закомментированном куске кода. Вообще то не плохо было бы почистить код перед тем как выкладывать.
smk
Цитата(zltigo @ Jul 18 2011, 20:15) *
Сам алгоритм не смотрел, но что-то счетчиков всяких многовато для такой задачи.

Вот та же мысль терзает. За советы спасибо. Попробую.

revers используется как признак направления счета.
ARV
поглядите мой проект http://arv.radioliga.com/content/view/152/44/
я там при помощи одной кнопки кучу функций делал, в том числе регулировал значение параметра в обе стороны. исходники прилагаются, там есть функции работы с кнопкой - возможно, анализ моего варианта вам чем-то поможет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.