|
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 25 2009, 09:49
|
Участник

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

|
Значит так, в пятницу вечером мне, как я уже писал, удалось прочитать серийник припаянного и единственного на шине датчика. Но вот дальше что-то дело не пошло... Естественно первое, что я попытался сделать, это прочитать температуру. Для этого в соответствии с даташитом я выбрал следующую последовательность действий: 1) Посылаю импульс сброса и принимаю ответ термометра. 2) Т.к. датчик на шине единственный, то посылаю сразу команду Skip ROM [CCh]. 3) Посылаю команду Convert T [44h]. 4) Формирую задержку 750мс (для уверенности даже попытался формировать 1 с). 5) Опять импульс сброса и ответ термометра. 6) Опять команда Skip ROM [CCh]. 7) Команда Read Scratchpad [BEh].... И вот после этого при попытке принять данные по температуре он мне шлёт сплошные единицы.... Сейчас я пишу не со своего компа, где прога плата, поэтому может быть, что я впопыхах в пятницу где-то ошибся, поэтому поставим вопрос так: 1) Правильную ли я делаю последовательность? 2) Можно ли считать данные и забить на CRC? Просто на сколько я понял, сами данные это вообще всего два байта... При этом в даташите в примерах написано, что присылается 9 байт, включая данные для проверки CRC... Какие данные являются непосредственно температурой?
Заранее спасибо за советы...
|
|
|
|
|
Jan 25 2009, 09:56
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(NikitoS-86 @ Jan 25 2009, 11:49)  2) Можно ли считать данные и забить на CRC? Можно, если вас не интересует результат. Цитата(NikitoS-86 @ Jan 25 2009, 11:49)  При этом в даташите в примерах написано, что присылается 9 байт, включая данные для проверки CRC... Какие данные являются непосредственно температурой? Там же в даташите и написано. Просьба прочитать за вас даташит выглядит несколько, хм...странной. И вы надеетесь, что кто-то захочет помогать человеку, которому лень почесть даташит?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
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 NikitoS-86 На счёт оптимизации - можно тогда узнать, что это ... Jan 23 2009, 14:52 aesok Цитата(NikitoS-86 @ Jan 23 2009, 17... Jan 23 2009, 15:08 haker_fox Цитата(NikitoS-86 @ Jan 23 2009, 22... Jan 23 2009, 15:11  aesok Цитата(haker_fox @ Jan 23 2009, 18:11) Ув... Jan 23 2009, 15:22   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 777777 Цитата(NikitoS-86 @ Jan 23 2009, 15... Jan 26 2009, 07:35 NikitoS-86 Да, в оптимизации судя по всему действительно нет ... Jan 26 2009, 16:31
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|