Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/63: Рейтинг темы: голосов - 63, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 3

Помогите оптимизировать код в CodeVisionAVR

11.02.2012, 15:41. Показов 12426. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа для измерения температуры, влажности и давления.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
void temperature(void) // функция по работе с термо-датчиком
{
if (trigger)        //переключение показаний термометра
{
temp1 = ds18b20_temperature(&rom_code[0][0]);  // читаем температуру с выбранного датчика
if ((temp1 < 130) & (temp1 > -60))       // установим границу диапазон
temp1= temp1;
else { temp1 =0;  }             // если выходит за границу тогда 0
 
temp2 = ds18b20_temperature( &rom_code[1][0] );//читаем температуру с выбранного датчика
if ((temp2 < 130) & (temp2 > -60))        // установим границу диапазон
temp2= temp2;
else {  temp2 =0;  }}           // если выходит за границу тогда 0
else
{
temp2 = ds18b20_temperature(&rom_code[0][0]);  // читаем температуру с выбранного датчика
if ((temp2 < 130) & (temp2 > -60))       // установим границу диапазон
temp2= temp2;
else { temp2 =0;  }             // если выходит за границу тогда 0
 
temp1 = ds18b20_temperature( &rom_code[1][0] );//читаем температуру с выбранного датчика
if ((temp1 < 130) & (temp1 > -60))        // установим границу диапазон
temp1= temp1;
else {  temp2 =0;  }}           // если выходит за границу тогда 0
}
void main(void)
{
............................. //инициализация
divices=w1_seorsh(DS18B20_SEARCH_ROM_CMD,rom_code);  //определим сколько устройств   подключено к шине 1-Wire
ds18b20_init(0,-35,35,DS18B20_12BIT_RES);        // переключения термометра в 12 битный режим
while (1)
{
 
temperature(); // вызываем функцию температуры
vlazhnost=0;
dovtenie=0;
 
vlazhnost=read_adc(4);    //Влажность
dovtenie=read_adc(5);        //давление
 
vlazhnost = (vlazhnost * 5000) / 1023;   // Вычисляем напряжение  милливольт.
vlazhnost = (vlazhnost - 958)/307*10;           // Значение влажности в %
if (vlazhnost > 100) vlazhnost = 100;
dovtenie = (dovtenie * 5000) / 1023;   // Вычисляем напряжение  милливольт.
dovtenie= (dovtenie/5+95)/900000*750064;  // Значение в мм.рт.ст. //(мрс) K=7.50064
 
sprymtf(lcd_text ,"%.1f""%%", vlazhnost);
lcd_gotoxy(10,0);
lcd_putsf("      ");
lcd_gotoxy(10,0);
lcd_puts(lcd_text);    // выводим масив на LCD
 
sprymtf(lcd_text,"%.0fmm", dovtenie);
lcd_gotoxy(10,1);
lcd_puts(lcd_text);    // выводим масив на LCD
 
sprymtf(lcd_text,"t\x79=%.1fC",temp1);
lcd_gotoxy(0,0);                   // указали место на дисплее
lcd_putsf("          ");
lcd_gotoxy(0,0);
lcd_puts(lcd_text);                       // выводим масив на LCD
 
sprymtf(lcd_text,"t\xe3=%.1fC",temp2);
lcd_gotoxy(0,1);
lcd_putsf("          ");
lcd_gotoxy(0,1);
lcd_puts(lcd_text);                 // выводим масив на LCD
 
};
Для переключения отображения температуры дом-улица использую прерывание INT0, при нажатии на кнопку состояние trigger изменяется на противоположное.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
interrupt [EXT_INT0] void ExtInt0(void)
{
unsykned char i = 0;
unsykned char count = 0;
 
while(i < 16){
if (PIN_INT0 == 0) count++;
i++;
}
 
if (count > 10) trigger ^= 1;
 
}
Все работает, но код, по моему, получился приличный.
Как его можно оптимизировать? Знаний для этого у меня маловато!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.02.2012, 15:41
Ответы с готовыми решениями:

Помогите оценить и оптимизировать код до максимальной скорос
Добрый день! Очень нужно достичь максимальной скорости. Готов отдать процессору 100%. Почитал, что DMA все равно делает перекачку...

Помогите оптимизировать код
Здравствуйте! Помогите, пожалуйста, оптимизировать его: main.cpp #include &quot;main.h&quot; ...

Помогите оптимизировать код
Помогите пожалуйста оптимизировать код: $text = &quot;Наконец, самое важное, что должен учесть создатель сайта, — это сохранение...

12
0 / 0 / 0
Регистрация: 06.05.2011
Сообщений: 49
11.02.2012, 16:27
Code
1
if ((temp1 < 130) & (temp1 > -60))
Надо полагать имеется ввиду оператор &&?
Code
1
temp1= temp1;
Скорее всего компилятор опускает эту строчку, но такая писанина наводит на мысли.
0
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
11.02.2012, 19:18
Вот так не делай:
Code
1
2
3
4
5
6
7
8
9
10
11
void temperature(void) // функция по работе с термо-датчиком
{
if (trigger)        //переключение показаний термометра
{
...
else {  temp2 =0;  }}
else
{
...
else {  temp2 =0;  }}           // если выходит за границу тогда 0
}
Устанешь искать потом, где у тебя условие закончилось.
Невнятно:
Code
1
2
3
4
temp1 = ds18b20_temperature(&rom_code[0][0]);  // читаем температуру с выбранного датчика
if ((temp1 < 130) & (temp1 > -60))       // установим границу диапазон
temp1= temp1;
else { temp1 =0;  }             // если выходит за границу тогда 0
На мой взгляд, так будет понятнее:
Code
1
2
3
temp1 = ds18b20_temperature(&rom_code[0][0]);
if ((temp1 > 130) && (temp1 < -60))
{ temp1 = 0;  }
У тебя вот эти условия 4 раза повторяются. Можно убавить:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define TEMP_ERR_RANGE(temp)         ((temp > 130) && (temp < -60))
...
if (trigger)
{
temp1 = ds18b20_temperature(&rom_code[0][0]);
temp2 = ds18b20_temperature(&rom_code[1][0]);
}
else
{
...
}
 
if (TEMP_ERR_RANGE(temp1))
{ temp2 = 0;  }
if (TEMP_ERR_RANGE(temp2))
{ temp2 = 0;  }
Если всегда температура обнуляется, то можно переписать макрос, чтобы if не писать каждый раз.

Кучку строк в фоне (while(1)) объединить бы в функции. Например: какие-то вычисления отдельно, вывод на экран отдельно.

Для переключения отображения температуры дом-улица использую прерывание INT0, при нажатии на кнопку состояние trigger изменяется на противоположное.
Из области "Очевидное-невероятное" :) Зачем под кнопку переключения завел внешнее прерывание?
0
DZ HipB
12.02.2012, 00:21
В последней строке void temperature(void) обнуление переменной правильно? Похоже там должна быть другая переменная!!!
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 3
12.02.2012, 00:52
Цитата Сообщение от Oxydi
Кучку строк в фоне (while(1)) объединить бы в функции. Например: какие-то вычисления отдельно, вывод на экран отдельно.
Объединил в отдельные функции измерение влажности, давления и вывод на индикатор.
Переписал измерение температуры как рекомендовано.
Зачем под кнопку переключения завел внешнее прерывание?
Пробовал вывести кнопку на другой порт, тогда (у меня ) нужно держать ее нажатой до смены показаний, иначе не переключается.
Может, подскажете, как правильно сделать?
И еще вопрос: нужно ли при этих измерениях инициализировать таймер и ставить на него прерывания?
В примерах, что я находил, устанавливают прерывание по переполнению таймера0?
0
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 3
12.02.2012, 01:10
Цитата Сообщение от DZ HipB
В последней строке void temperature(void) обнуление переменной правильно? Похоже там должна быть другая переменная!!!
Может и другая, тем более, что переменные не обнуляются.
Поскольку я буду использовать измерение температуры дома и на улице, то пределы , я так думаю, устанавливать не обязательно, а вот как вставить, чтобы при отсутствии датчика вместо значения выводилось что то типа ERROR или NO?
0
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
12.02.2012, 06:40
Цитата Сообщение от tum
Может, подскажете, как правильно сделать?
Конкретизируй свои требования, чтобы не было потом вопросов :) Например: хочу, чтобы подержал секунду и волшебный ларчик открылся, отпустил, подержал еще секунду и ларчик закрылся :)
Цитата Сообщение от tum
И еще вопрос: нужно ли при этих измерениях инициализировать таймер и ставить на него прерывания?
В примерах, что я находил, устанавливают прерывание по переполнению таймера0?
В принципе можно и таймер завести, чтобы бешено в фоне не делать опрос, а снимать показания датчиков, скажем раз в минуту.

Цитата Сообщение от tum
а вот как вставить, чтобы при отсутствии датчика вместо значения выводилось что то типа ERROR или NO?
Для ответа на такой вопрос нужно как минимум взглянуть на то, что происходит в функции ds18b20_temperature(...).
0
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 3
12.02.2012, 21:58
Цитата Сообщение от Oxydi
Конкретизируй свои требования, чтобы не было потом вопросов :) Например: хочу, чтобы подержал секунду и волшебный ларчик открылся, отпустил, подержал еще секунду и ларчик закрылся :)
При каждом кратковременном нажатии на кнопку триггер изменяет свое состояние на противоположное.
0
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 3
15.02.2012, 00:57
"Oxydi" писал:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define TEMP_ERR_RANGE(temp)         ((temp > 50) && (temp < -50))
...
if (trigger)
{
temp1 = ds18b20_temperature(&rom_code[0][0]);
temp2 = ds18b20_temperature(&rom_code[1][0]);
}
else
{
...
}
 
if (TEMP_ERR_RANGE(temp1))
{ temp1 = 0;  }
if (TEMP_ERR_RANGE(temp2))
{ temp2 = 0;  }
Что-то так не хочет обнуляться при превышении показаний, а при условии:
Code
1
if ((temp1 < -50) && (temp1 > 50))   {temp1 = 0;}
обнуляется только при превышении положительного значения.
А как сделать, чтобы обнулялось и при < -50?
0
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
15.02.2012, 06:14
Цитата Сообщение от tum
При каждом кратковременном нажатии на кнопку триггер изменяет свое состояние на противоположное.
Тут ничего сложного нет. Как нажать кнопку на AVR информации много )
Цитата Сообщение от tum
Что-то так не хочет обнуляться при превышении показаний, а при условии:
Код:
if ((temp1 < -50) && (temp1 > 50)) {temp1 = 0;}
обнуляется только при превышении положительного значения.
А как сделать, чтобы обнулялось и при < -50?
Это я вот так написал? Ошибся конечно. Убирай амперсанд и в условии должно стоять "или".
Code
1
if ((temp1 < -50) || (temp1 > 50))
Так же нужно быть уверенным, что temp1 объявлен знаковым и с датчика приходят именно знаковые числа.
0
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 3
15.02.2012, 14:28
Цитата Сообщение от Oxydi
Убирай амперсанд и в условии должно стоять "или".
Спасибо, все заработало и с установкой диапазона #define TEMP_ERR_RANGE(temp) ((temp > 50) && (temp < -50)).
Я уже и сам подумал, что что-то не то с условием, только не пойму, почему работает этот код и в интернете везде пишут с одним &
Code
1
2
3
if ((temp1 < 50) & (temp1 > -50))
temp1= temp1;
else { temp1 =0;  }
А насчет кнопки, перепробовал несколько вариантов. Не понравилось, что нужно удерживать кнопку некоторое время, чтобы триггер переключился. А почему не желательно использовать INT0?
0
0 / 0 / 0
Регистрация: 04.05.2010
Сообщений: 115
15.02.2012, 19:35
Цитата Сообщение от tum
Я уже и сам подумал, что что-то не то с условием, только не пойму, почему работает этот код и в интернете везде пишут с одним &Код:
if ((temp1 < 50) & (temp1 > -50))
temp1= temp1;
else { temp1 =0; }

Один апмерсанд при проверке двух условий писать не советую. Это побитовое И. Получается так: сработало первое условие - 1, сработало второе условие - 1; 1 & 1 = 1 (trui).
Я так понимаю у тебя есть какой-то диапазон и если твоя переменная выходит за этот диапазон, то ошибка и переменную обнуляем. Тогда рассуждаем так: если меньше -50 или больше +50, то ошибка. Больше никаких условий здесь не нужно.
temp1= temp1; - лишняя запись.
Цитата Сообщение от tum
А насчет кнопки, перепробовал несколько вариантов. Не понравилось, что нужно удерживать кнопку некоторое время, чтобы триггер переключился. А почему не желательно использовать INT0?
Видимо так написал, что удерживать приходится.
Я рекомендую использовать прерывания только тогда, когда это действительно надо, например: UART, таймер. Лишнее прерывание отвлекает контроллер. Тем более если оно задействовано для кнопки, которая переключает какие-то показания. Внешнее прерывание заводить на кнопку в том случае, когда, скажем, у тебя энергосберегающая система и нужно выводить контроллер из спящего режима.
0
0 / 0 / 0
Регистрация: 28.03.2016
Сообщений: 3
15.02.2012, 23:01
Цитата Сообщение от Oxydi
Видимо так написал, что удерживать приходится.
Я так понимаю, что как бы я не писал, опрос кнопки произойдет только после завершения всех операций по чтению и вывода значений?
И если во время их выполнения нажать и отпустить кнопку, изменений не будет. Кнопку нужно удерживать некоторое время, а это не совсем удобно.
С диапазонами все нормально, спасибо!
И еще вопрос не по теме, можно ли вывести частоту кварца на какой-нибудь порт? Часовой кварц подключен к AVR в асинхронном режиме, при измерении частоты вносится емкость и частота немного уходит. Да и амплитуда на выводах мала, проблематично замерить.
Что-то в интернете я не нашел.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2012, 23:01
Помогаю со студенческими работами здесь

Помогите оптимизировать код
Помогите пожалуйста разобраться, хотелось бы чтобы это прграммка наконец-то заработала. Задача такая: Одномерный массив целых чисел,...

Помогите разобрать и оптимизировать код.
Достался в наследство код. Нет ни задания, ни автора. Нужно заставить работать и подлатать/почистить. Судя по всему, программа призвана в...

Помогите оптимизировать мой код
Реально уменьшить этот код где-то на 5 Кб (чем он меньше - тем лучше) но так чтобы все осталось примерно так...

работа со строчкой: помогите оптимизировать мой тупой код)
Что имеем: строчку в которой записан процесс разложения числа на множетели ,вида 512=2*2*2*2*2*2*2*2*2, а нужно что бы выводило 512=2^9 или...

Помогите с CodeVisionAVR 3.12 косяк в интерфейсе...
Подскажите кто нить сталкивался вот с таким чудом....а именно окно с кодом программы не как не увеличивается, все другие окна ведут себя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru