|
Atmega48, DS18S20 и пресловутая оптимизация AVRStudio |
|
|
|
Jan 23 2009, 12:19
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 22-09-08
Пользователь №: 40 380

|
Доброго всем времени суток. Появилась задачка мерить температуру на нескольких датчиках. В качестве управляющего МК дана ATmega48, в качестве датчика решил использовать DS18S20, поскольку работа через 1-wire показалась очень удобной штукой. Проштудировал переведённую статью про интерфейс 1-wire и вперёд. Вооружившись осциллографом стал пытаться что-нибудь отиравить и принять. Отправка РЕСЕТ и приём ПРЕСЕНС прошли замечательно, отправка команды SEARCH ROM тоже, а вот попытка получить ответ на последнюю команду как-то не прошла... Точнее так, судя по осциллографу датчик мне отвечает, а вот если пытаться посмотреть на экране монитора через Watch, то он говорит, что одни нули... Вот тут я добрался до самого неприятного момента и пока малопонятного для меня. Дело в том, что я себе не очень хорошо представляю, что есть пресловутая оптимизация в АВРСтудии. Да, я знаю, что она выкидывает ненужный по её мнению код, куда она ессно отправляет функции, которые ничего не получают и не возвращают, переменные, которые по ЕЁ мнению не несут смысловой нагрузки и что её вроде как можно отучить от этого через написание магического слова volatile перед объявлением переменных. Всё, более точно я про неё ничего не знаю, а в настройках проекта помимо этого, можно выбрать аж 4 режима этой оптимизации... Так вот, дабы она не компостировала мне мозги, я её всегда вырубал и не испытывал никаких угрызений совести, а тут вот проблема - на шине 1-wire необходимо строго выдерживать временные интервалы, естественно я сразу желаю использовать функции "_delay_us/ms" (просто другого я не знаю способа), но тут как обычно всё обламывается, т.к. они без оптимизации не работают... Что делать дальше - хз... Можно конечно использовать таймер, но почему-то не очень хочется=), хотя если это единственный выход как обойти проблема - куда деваеться... Просто проект будет дальше разрастаться, а как-то мучатся в нём с этой оптимизацией не хочется=/ Вот этот простой код, с которым у меня ничего пока не вышло сегодня. Заранее спасибо за ответы CODE #include <avr/io.h> #include <avr/sfr_defs.h> #include <avr/interrupt.h>
#define F_CPU 20000000UL #include <util/delay.h>
#define READ_ROM 0x33
void init_ports(void) { DDRB = (1<<DD0); PORTB = (1<<PB0);
PORTD = (1<<PD6) | (0<<PD5) | (0<<PD4) | (0<<PD3) | (0<<PD2); DDRD = (1<<DDD6) | (1<<DDD5) | (1<<DDD4) | (1<<DDD3) | (1<<DDD2); asm("nop"); return; }
volatile void write1() { DDRB = (1<<DDB0); PORTB &= ~(1<<PB0); _delay_us(2); PORTB = (1<<PB0); _delay_us(28); DDRB = (0<<DDB0); _delay_us(10); }
volatile void write0() { DDRB = (1<<DDB0); PORTB &= ~(1<<PB0); _delay_us(30); DDRB = (0<<DDB0); _delay_us(10); }
void main () { volatile char help_byte = 0xFF; volatile char help_byte_2 = 0; init_ports();
//---отсылка импульса RESET----- PORTB &= ~(1<<PB0); _delay_us(500);
//---приём импульса PRESENSE----- DDRB = (0<<DDB0); _delay_us(61); help_byte = PIN0;
help_byte_2 = help_byte; _delay_us(500);
//---отправка команды чтения адреса устройства----- volatile char command = READ_ROM;
for (int i=0;i<8;i++) { if((command & 1) == 1) write1(); else write0(); command = command >> 1; } _delay_ms(1);
//---попытка получить от устройства его серийник--- volatile char serial_number[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; volatile char help_byte_3 = 0x00;
for (int i=0;i<8;i++) { for (int k=0;k<8;k++) { serial_number[i] = serial_number[i]<<1; DDRB = (1<<DDB0); PORTB &= ~(1<<PB0); _delay_us(5); DDRB = (0<<DDB0); _delay_us(8); help_byte_3 = PINB0; serial_number[i] = serial_number[i] + (help_byte_3<<k); _delay_us(45); _delay_us(10); } } }
|
|
|
|
|
 |
Ответов
|
Jan 23 2009, 14:52
|
Участник

Группа: Новичок
Сообщений: 28
Регистрация: 22-09-08
Пользователь №: 40 380

|
На счёт оптимизации - можно тогда узнать, что это такое? Почему несколько вариантов? Что именно оптимизируется и как?
|
|
|
|
|
Jan 23 2009, 15:11
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(NikitoS-86 @ Jan 23 2009, 22:52)  На счёт оптимизации - можно тогда узнать, что это такое? Ну например вот это код никогда не выполнится: Код if(10 > 15) { // something here } Есть ли смысл переводить его в машинный код и формировать с ним hex? Нет такого смысла! Оптимизатор спокойно выкинит этот фрагмент, ну а программист получит предупреждение (зависит от опций компилятора). Вообще оптимизация может быть выключена. Тогда все, что Вы написали будет переведено в машинный код именно в том виде, в которым программа написана. Оптимизация по объему дасти минимальный объем машинного кода, но не обязательно он будет быстро выполняться. Оптимизация по скорости наоборот даст минимальный по времени машинный код, но не обязательно его размер будет малым. Вообще все что я показал, это довольно примитивно. Уважаемый aesok лучше расскажет! Он, как я понял, gcc лучше многих знает!
--------------------
Выбор.
|
|
|
|
|
Jan 23 2009, 15:22
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(haker_fox @ Jan 23 2009, 18:11)  Уважаемый aesok лучше расскажет! Он, как я понял, gcc лучше многих знает! Пожалуйста избавьте меня от этого, в GCC над программой выполняться порядка 200 проходов, основная масса из них оптимизирующие. Я не знаю их все. И зачем Вам процесс, Вас же интересует результат. А результат это -Os (оптимизация по размеру) плюс, иногда отключение проходов которые вредны для AVR платформы. В очень редких случаях оптимизация по скорости -O3. Анатолий.
Сообщение отредактировал aesok - Jan 23 2009, 15:23
|
|
|
|
Сообщений в этой теме
NikitoS-86 Atmega48, DS18S20 и пресловутая оптимизация AVRStudio Jan 23 2009, 12:19 aesok Вы читали описание функции _delay_us(..)?
Анатоли... Jan 23 2009, 12:54 NikitoS-86 Да, читал соответственно в доке WinAVR/// Всё что ... Jan 23 2009, 13:06 aesok Цитата(NikitoS-86 @ Jan 23 2009, 16... Jan 23 2009, 13:17 NikitoS-86 Попробую, хотя на мой взгляд это не поможет... Ибо... Jan 23 2009, 13:20 aesok Цитата(NikitoS-86 @ Jan 23 2009, 16... Jan 23 2009, 14:47 GDI В исходниках программ и библиотек поройтесь, там е... Jan 23 2009, 14:08 aesok Цитата(NikitoS-86 @ Jan 23 2009, 17... Jan 23 2009, 15:08   haker_fox Цитата(aesok @ Jan 23 2009, 23:22) Пожалу... Jan 23 2009, 15:26 Qwertty Битовый интервал в 40мкс это очень мало. Должно бы... Jan 23 2009, 14:56 haker_fox Уж на Си-то исходников для работы с DS18B20 хватае... Jan 23 2009, 15:05 NikitoS-86 Итак, спасибо всем откликнувшимся=)
1) Вроде бы по... Jan 23 2009, 15:47 haker_fox Цитата(NikitoS-86 @ Jan 23 2009, 23... Jan 23 2009, 16:23 aesok Цитата(NikitoS-86 @ Jan 23 2009, 18... Jan 23 2009, 16:35 NikitoS-86 Значит так, в пятницу вечером мне, как я уже писал... Jan 25 2009, 09:49 Сергей Борщ Цитата(NikitoS-86 @ Jan 25 2009, 11... Jan 25 2009, 09:56 777777 Цитата(NikitoS-86 @ Jan 23 2009, 15... Jan 26 2009, 07:35 NikitoS-86 Да, в оптимизации судя по всему действительно нет ... Jan 26 2009, 16:31
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|