Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
Другие темы раздела
Atmega AVR микроконтроллер Проблема с TWI (ds1307) http://www.cyberforum.ru/avr/thread2085987.html
Вот решил я поработать с TWI на atmega88p. Переделал для начала часть Ардуиновского кода для себя (twi.c/h), запилил простой пример по работе с ds1307 и проект в Proteus. Но что то пошло не так, и...
Atmega AVR микроконтроллер Настройка Timer1 на ATtiny2313
Стараюсь настроить Timer1 на время 0.01секунды при частоте 4Мгц , но при моделировании в Proteus при частоте 4Мгц время совсем иное , намного больше. Прерывания по совпадению с регистром OCR1A . Ниже...
Atmega128 самый дешевый из мег? Atmega AVR микроконтроллер
Сравнивал цены, удивило 1.4$ за штуку http://www.otyexpress.com/item/Frii-Shi ... 43818.html примерно столько же стоят atmega8, otmyko48, иногда дешевле 0.9$ иногда дороже 2$. Atmega256 уже в...
Atmega AVR микроконтроллер Есть ли у кого примеры применения датчика давления bm085? с I2C не очень силен, пока читаю даташит как китайскую грамоту) примеров найти не смог, есть только для ардуино http://www.cyberforum.ru/avr/thread2085984.html
Atmega AVR микроконтроллер Вопрос по энкодеру http://www.cyberforum.ru/avr/thread2085983.html
Здравствуйте! У меня вопрос по энкодеру. Есть энкодер, 24 щелчка/ положения на один оборот, подключил к ардуино. При вращении должна изменяться яркость. Вопрос такой: это нормально что приращение...
Atmega AVR микроконтроллер Keil компилятор
подскажите какой пакет работает с AVR--чего-то на офсайте так и непонял(или не нашёл)
Как считать показания датчика Atmega AVR микроконтроллер
Есть ИК датчик дальномер,есть мега8 с портами АЦП как мне посмотреть получаемые параметры, например в ардуино я мог мониторить порт, а здесь как-то можно, или вариант через AVR Studyo.
Atmega AVR микроконтроллер Датчик DHT21 + AtTiny2313. Доброго времени суток :) Задался я тут целью соединить датчик температуры/влажности DHT21 с AtTiny2313. Начал читать даташит, Написано, что интерфейс 1-Wire, не совместимый с Daltos. Далее... http://www.cyberforum.ru/avr/thread2085980.html
Atmega AVR микроконтроллер DHT11 + avr http://www.cyberforum.ru/avr/thread2085979.html
Моделирую в proteus. При моделировании датчик не отвечает (не выставляет низкий уровень на шине) Код: .include "m16def.yms" .def count=r18 .def temperat=r20; risit:
Atmega AVR микроконтроллер Прошить ATMEGA128 Народ, ни разу не работал со 128 и 256 мегами. Все МК с чем приходилось работать, прошивал STK-500 либо в панельку ставил, либо ISP. Сейчас нужно прошить мегу 128. На руках только STK-500. Получится... http://www.cyberforum.ru/avr/thread2085978.html
HotD
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
0

Оптимизация кода, Си

19.02.2014, 14:41. Просмотров 9391. Ответов 30
Метки (Все метки)

День добрый. Ситация следующая. Код работает, все отлично, но написан он, мягко скажем, коряво. Если вкратце - есть 12 кнопок. Висят на совершенно разных портах, при нажатии выполняются аналогичные действия, меняются только переменные, включается однотипная периферия, в общем - изменил алгоритм для 1 кнопки, на других он будет совершенно такой-же, только с другими переменными. Сейчас выхожу из ситуации так:
Проверяю первую кнопку:
//сканируем кнопки
#define NUMBER 1
#define BUTTON BUT_1
#define TSOP TSOP_1
#define TUBE EE_TUBE_1
#define TUBE_ERR EE_TUBE_1_ERR
#define TUBE_COIN EE_TUBE_1_COIN

if (!BUTTON && !(stat_UV & (1<<(NUMBER-1))))
{
_delay_ms(150);
while(!BUTTON);
{

#ifdef DEBUG
//счетчик 30 монет
temp_EE=eeprom_read_byte(&TUBE_COIN); //читаем то, что уже в памяти
if (temp_EE>0) //чтобы не уйти в минус
{
temp_EE--;
coin_count=temp_EE; //новое включение
eeprom_write_byte(&TUBE_COIN,temp_EE); //пишем в память новое значение
}
#else
if(!sale) //если не распродажа - то считаем монеты в минус
{
temp_EE=eeprom_read_byte(&TUBE_COIN); //читаем то, что уже в памяти
if (temp_EE>0) //чтобы не уйти в минус
{
temp_EE--;
coin_count=temp_EE; //новое включение
eeprom_write_byte(&TUBE_COIN,temp_EE); //пишем в память новое значение
}

}
#endif

//статистика кол-ва включений этого тубуса
temp_EE=eeprom_read_dword(&TUBE); //читаем то, что уже в памяти
temp_EE++; //новое включение
eeprom_write_dword (&TUBE,temp_EE); //пишем в память новое значение

if (TSOP) flag_stort_tsop=1; //закрыт датчик
else flag_stort_tsop=0;
LED_OFF_ALL();

cli();
ADC_Offset=ADC_buf; //ошибка датчика, операционника, читаем перед запуском движка (т.е. ток - 0А)
sei();

LED_ON(NUMBER);
MOTOR_ON(NUMBER); //включаем мотор 1

cli();
timer2_2=0;
flag_5s=0;

timer2_0=0;
flag_70ms=0;
sei();

//обнуляем флаги
flag_stat_tsop=0;
flag_tsop=0;
flag_error=0;
while (!flag_5s) //ждем датчик
{
if (flag_70ms) //прошло 70 мс с момента запуска движка
{
cli();
Current=ADC_buf-ADC_Offset;
sei();
if (Current<0) Current=0;

if (Current>ADC_OFF) //если превышаем
{
MOTOR_OFF(NUMBER); //выключаем мотор
flag_tsop=0; //ошибка
#ifdef DEBUG
lcd_gotoxy(0,3);
sprymtf(buf_tx,"%3u,%.3f",Current,(VREF*1.15*Current/1024));
putschar(buf_tx);
#endif
briok;
}
#ifdef DEBUG
else //для отладки
{
lcd_gotoxy(0,3);
sprymtf(buf_tx,"%3u,%.3f",Current,(VREF*1.15*Current/1024));
putschar(buf_tx);
}
#endif

}
if(flag_stort_tsop) //если датчик закрыт
{
if (!TSOP)
{
_delay_ms(50);
if (!TSOP)
{
flag_tsop=1;
timer_delay_motor=0;
flag_delay_motor=0;
while(!flag_delay_motor) //ждем пока докрутит, проверяем ток
{
cli();
Current=ADC_buf-ADC_Offset;
sei();
if (Current<0) Current=0;

if (Current>ADC_OFF) //если больше 1А (грубо)
{
MOTOR_OFF(NUMBER); //выключаем мотор
flag_tsop=0; //флаг клина движка при докрутке
flag_error=1;
#ifdef DEBUG
lcd_gotoxy(0,3);
sprymtf(buf_tx,"%3u,%.3f",Current,(VREF*1.15*Current/1024));
putschar(buf_tx);
#endif
briok;
}
#ifdef DEBUG
else //для отладки
{
lcd_gotoxy(0,3);
sprymtf(buf_tx,"%3u,%.3f",Current,(VREF*1.15*Current/1024));
putschar(buf_tx);
}
#endif
}

MOTOR_OFF(NUMBER); //выключаем мотор 1
if(!flag_error) // если не заклинило двиг при докрутке
{
rec_cost-=cost; //списываем деньгу
}

flag_update_tid=0;
briok;
}
}

}
if (!flag_stort_tsop) //если открыт
{
if (TSOP) //если закрылся
{
_delay_ms(50);
if (TSOP)
{
flag_tsop=1;
flag_stat_tsop=1;
}
}
if (!TSOP && flag_stat_tsop)
{
_delay_ms(50);
if (!TSOP)
{
flag_tsop=1;
flag_stat_tsop=0;
timer_delay_motor=0;
flag_delay_motor=0;
while(!flag_delay_motor) //ждем пока докрутит, проверяем ток
{
cli();
Current=ADC_buf-ADC_Offset;
sei();
if (Current<0) Current=0;

if (Current>ADC_OFF) //если больше 1А (грубо)
{
MOTOR_OFF(NUMBER); //выключаем мотор
flag_tsop=0; //флаг клина движка при докрутке
flag_error=1;
#ifdef DEBUG
lcd_gotoxy(0,3);
sprymtf(buf_tx,"%3u,%.3f",Current,(VREF*1.15*Current/1024));
putschar(buf_tx);
#endif
briok;
}
#ifdef DEBUG
else //для отладки
{
lcd_gotoxy(0,3);
sprymtf(buf_tx,"%3u,%.3f",Current,(VREF*1.15*Current/1024));
putschar(buf_tx);
}
#endif
}

MOTOR_OFF(NUMBER); //выключаем мотор 1
if(!flag_error) // если не заклинило двиг при докрутке
{
rec_cost-=cost; //списываем деньгу
}

flag_update_tid=0;
briok;
}

}

}

}
if (!flag_tsop) //если датчик не сработал в течении 5 сек
{
MOTOR_OFF(NUMBER); //выключаем мотор 1
flag_update_tid=0;
stat_UV|=(1<<(NUMBER-1)); //отключаем УВ1
//статистика кол-ва ошибок этого тубуса
temp_EE=eeprom_read_dword(&TUBE_ERR); //читаем то, что уже в памяти
temp_EE++; //новое включение
eeprom_write_dword (&TUBE_ERR,temp_EE); //пишем в память новое значение

sprymtf(buf_tx,"AT+CMGS=\"%s\"\r\n",number_mostir);
send_uart_sym(buf_tx);
_delay_ms(300);

sprymtf(buf_tx,"TUBE %d ERROR!\r\n",NUMBER);
send_uart_debug(buf_tx);
send_uart_sym(buf_tx);

_delay_ms(300);
send_char_sym(0x1A);
}
if (coin_count==0 && lock && !sale) //если кончились монетки в тубусе и включена блокировка
{
flag_update_tid=0;
stat_UV|=(1<<(NUMBER-1)); //отключаем этот тубус
sprymtf(buf_tx,"AT+CMGS=\"%s\"\r\n",number_mostir);
send_uart_sym(buf_tx);
_delay_ms(300);

sprymtf(buf_tx,"TUBE %d EMPTY!\r\n",NUMBER);
send_uart_debug(buf_tx);
send_uart_sym(buf_tx);

_delay_ms(300);
send_char_sym(0x1A);
}
flag_tsop=0;

}
}
#undef NUMBER
#undef BUTTON
#undef TSOP
#undef TUBE
#undef TUBE_ERR
#undef TUBE_COIN
Проверяю вторую кнопку:
#define NUMBER 2
#define BUTTON BUT_2
#define TSOP TSOP_2
#define TUBE EE_TUBE_2
#define TUBE_ERR EE_TUBE_2_ERR
#define TUBE_COIN EE_TUBE_2_COIN

if (!BUTTON && !(stat_UV & (1<<(NUMBER-1))))
{
_delay_ms(150);
while(!BUTTON);
{

#ifdef DEBUG
//счетчик 30 монет
temp_EE=eeprom_read_byte(&TUBE_COIN); //читаем то, что уже в памяти
if (temp_EE>0) //чтобы не уйти в минус
{
temp_EE--;
coin_count=temp_EE; //новое включение
eeprom_write_byte(&TUBE_COIN,temp_EE); //пишем в память новое значение
}
#else
if(!sale) //если не распродажа - то считаем монеты в минус
{
temp_EE=eeprom_read_byte(&TUBE_COIN); //читаем то, что уже в памяти
if (temp_EE>0) //чтобы не уйти в минус
{
temp_EE--;
coin_count=temp_EE; //новое включение
eeprom_write_byte(&TUBE_COIN,temp_EE); //пишем в память новое значение
}

}
#endif

//статистика кол-ва включений этого тубуса
temp_EE=eeprom_read_dword(&TUBE); //читаем то, что уже в памяти
temp_EE++; //новое включение
eeprom_write_dword (&TUBE,temp_EE); //пишем в память новое значение

if (TSOP) flag_stort_tsop=1; //закрыт датчик
else flag_stort_tsop=0;
LED_OFF_ALL();

cli();
ADC_Offset=ADC_buf; //ошибка датчика, операционника, читаем перед запуском движка (т.е. ток - 0А)
sei();

LED_ON(NUMBER);
MOTOR_ON(NUMBER); //включаем мотор 1

cli();
timer2_2=0;
flag_5s=0;

timer2_0=0;
flag_70ms=0;
sei();

//обнуляем флаги
flag_stat_tsop=0;
flag_tsop=0;
flag_error=0;
while (!flag_5s) //ждем датчик
{
if (flag_70ms) //прошло 70 мс с момента запуска движка
{
cli();
Current=ADC_buf-ADC_Offset;
sei();
if (Current<0) Current=0;

if (Current>ADC_OFF) //если превышаем
{
MOTOR_OFF(NUMBER); //выключаем мотор
flag_tsop=0; //ошибка
#ifdef DEBUG
lcd_gotoxy(0,3);
sprymtf(buf_tx,"%3u,%.3f",Current,(VREF*1.15*Current/1024));
putschar(buf_tx);
#endif
briok;
}
#ifdef DEBUG
else //для отладки
{
lcd_gotoxy(0,3);
sprymtf(buf_tx,"%3u,%.3f",Current,(VREF*1.15*Current/1024));
putschar(buf_tx);
}
#endif

}
if(flag_stort_tsop) //если датчик закрыт
{
if (!TSOP)
{
_delay_ms(50);
if (!TSOP)
{
flag_tsop=1;
timer_delay_motor=0;
flag_delay_motor=0;
while(!flag_delay_motor) //ждем пока докрутит, проверяем ток
{
cli();
Current=ADC_buf-ADC_Offset;
sei();
if (Current<0) Current=0;

if (Current>ADC_OFF) //если больше 1А (грубо)
{
MOTOR_OFF(NUMBER); //выключаем мотор
flag_tsop=0; //флаг клина движка при докрутке
flag_error=1;
#ifdef DEBUG
lcd_gotoxy(0,3);
sprymtf(buf_tx,"%3u,%.3f",Current,(VREF*1.15*Current/1024));
putschar(buf_tx);
#endif
briok;
}
#ifdef DEBUG
else //для отладки
{
lcd_gotoxy(0,3);
sprymtf(buf_tx,"%3u,%.3f",Current,(VREF*1.15*Current/1024));
putschar(buf_tx);
}
#endif
}

MOTOR_OFF(NUMBER); //выключаем мотор 1
if(!flag_error) // если не заклинило двиг при докрутке
{
rec_cost-=cost; //списываем деньгу
}

flag_update_tid=0;
briok;
}
}

}
if (!flag_stort_tsop) //если открыт
{
if (TSOP) //если закрылся
{
_delay_ms(50);
if (TSOP)
{
flag_tsop=1;
flag_stat_tsop=1;
}
}
if (!TSOP && flag_stat_tsop)
{
_delay_ms(50);
if (!TSOP)
{
flag_tsop=1;
flag_stat_tsop=0;
timer_delay_motor=0;
flag_delay_motor=0;
while(!flag_delay_motor) //ждем пока докрутит, проверяем ток
{
cli();
Current=ADC_buf-ADC_Offset;
sei();
if (Current<0) Current=0;

if (Current>ADC_OFF) //если больше 1А (грубо)
{
MOTOR_OFF(NUMBER); //выключаем мотор
flag_tsop=0; //флаг клина движка при докрутке
flag_error=1;
#ifdef DEBUG
lcd_gotoxy(0,3);
sprymtf(buf_tx,"%3u,%.3f",Current,(VREF*1.15*Current/1024));
putschar(buf_tx);
#endif
briok;
}
#ifdef DEBUG
else //для отладки
{
lcd_gotoxy(0,3);
sprymtf(buf_tx,"%3u,%.3f",Current,(VREF*1.15*Current/1024));
putschar(buf_tx);
}
#endif
}

MOTOR_OFF(NUMBER); //выключаем мотор 1
if(!flag_error) // если не заклинило двиг при докрутке
{
rec_cost-=cost; //списываем деньгу
}

flag_update_tid=0;
briok;
}

}

}

}
if (!flag_tsop) //если датчик не сработал в течении 5 сек
{
MOTOR_OFF(NUMBER); //выключаем мотор 1
flag_update_tid=0;
stat_UV|=(1<<(NUMBER-1)); //отключаем УВ1
//статистика кол-ва ошибок этого тубуса
temp_EE=eeprom_read_dword(&TUBE_ERR); //читаем то, что уже в памяти
temp_EE++; //новое включение
eeprom_write_dword (&TUBE_ERR,temp_EE); //пишем в память новое значение

sprymtf(buf_tx,"AT+CMGS=\"%s\"\r\n",number_mostir);
send_uart_sym(buf_tx);
_delay_ms(300);

sprymtf(buf_tx,"TUBE %d ERROR!\r\n",NUMBER);
send_uart_debug(buf_tx);
send_uart_sym(buf_tx);

_delay_ms(300);
send_char_sym(0x1A);
}
if (coin_count==0 && lock && !sale) //если кончились монетки в тубусе и включена блокировка
{
flag_update_tid=0;
stat_UV|=(1<<(NUMBER-1)); //отключаем этот тубус
sprymtf(buf_tx,"AT+CMGS=\"%s\"\r\n",number_mostir);
send_uart_sym(buf_tx);
_delay_ms(300);

sprymtf(buf_tx,"TUBE %d EMPTY!\r\n",NUMBER);
send_uart_debug(buf_tx);
send_uart_sym(buf_tx);

_delay_ms(300);
send_char_sym(0x1A);
}
flag_tsop=0;

}
}
#undef NUMBER
#undef BUTTON
#undef TSOP
#undef TUBE
#undef TUBE_ERR
#undef TUBE_COIN
Меняются только дефайны в начале. Дальше код один в один. В итоге гемор - отлаживаю алгоритм на 1-й кнопке, затем втупую копирую текст обработчика в другие кнопки, где соответствующие дефайны. Может есть какое-то более изящное решение? И можно ли всю эту конструкцию запихнуть в гигантский макрос? Параметров по сути всего 6.

Вернуться к обсуждению:
Оптимизация кода, Си
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2014, 14:41
Готовые ответы и решения:

Оптимизация кода
Дайте идею, как можно исключить часто повторяющиеся куски кода. У меня пока идей нет. ...

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода
MATLAB только начал осваивать. Попытался реализовать нахождение точки минимума методом Ньютона...

Оптимизация кода. Замер времени выполнения части кода.
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение какого-то блока...

Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация
Много много лет назад, на заре становления профессии &quot;оптимизатора&quot; в какой то умной книжке был...

Оптимизация кода
Вот код var a,b,c,d:integer; begin a:=random(30000); b:=random(30000); c:=random(30000);...

30
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru