Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> DS18s20 + atmega8 + linux avr-gcc проблема, ds1820 не отвечает на команды 
:(
    Опции темы
bend
Дата 5.3.2009, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 2.3.2009

Репутация: нет
Всего: нет



Работаю в Linux. Собрал stk200, все работает отлично, прошивает. Собрал из сырцов avr-gcc. Пытаюсь сделать термометр с 1-wire шиной.
Прикрутил дисплэй от 3310 для вывода информации. Почитал про ds18s20, навоял некоторый код на с++, проблема в том что после "сброса" датчик отвечает "что мол я есть" smile но при попытке потом послать команду, ответа от датчика нет. Датчик подключен по 3 проводам с резистором 4.7к.
я не силен в с++, в инете много примеров но они не всегда совместимы с gcc компилятором как я понял... Подскажите в чем может быть проблема?

Тактовая частота CPU 1Мгерц
процедура сброса. датчик висит на порту С  на 2 пине.

void wire_reset (void){
LcdGotoXY ( 1, 1);
DDRC|=(1<<2);
PORTC &= ~_BV(PD2);
_delay_ms(0.480);
DDRC&=~(1<<2);
_delay_ms(0.06);
if(bit_is_clear(PINC,2)){
LcdStr(1,"DS1820 found");
} else {
LcdStr(1,"Bus ERROR");
}
LcdUpdate();
DDRC&=~(1<<2);
_delay_ms(0.500); // процедура нормально работает, видно что датчик живой и отвечает.
}

=================================запись байта==================
void OneWireWriteByte(unsigned char data)
{
unsigned char i;

for (i=0;i<=7;i++)
   {
DDRC |= (1<<2); //set port to output
   if (data & 0x01)
       {
        PORTC &= ~_BV(PD2); // send 1
        _delay_ms(0.007); // начало таймслота
        DDRC &= ~(1<<2); //set port to input
        _delay_ms(0.120);
       }
   else
      {
      PORTC &=~ _BV(PD2);  // send 0
      _delay_ms(0.125);
      DDRC &= ~(1<<2); //set port to input      
      _delay_ms(0.01);
      }
   data>>=1;

   }
DDRC &= ~(1<<2); //set port to input
_delay_ms(1);
}

=================================================чтение байта===================
void OneWireReadByte(void)
{
unsigned char data =  0;
unsigned char i;
for (i=0;i<=7;i++)
   {
    DDRC |= (1<<2);     //set port to out
    PORTC &= ~_BV(PD2); // out 0 start timeslot
    _delay_ms(0.006);        // начало таймслота
    DDRC &=~(1<<2);     //set port to input
    _delay_ms(0.008);    // чтение бита через 14-16 мкс от начала таймслота
        data>>=1;
        if(bit_is_clear(PINC,2)){
        data &=  0x7f;
        LcdStr(1,"0");
        } else {
        data |= 0x80;
        LcdStr(1,"1");
        }
    _delay_ms(0.120);
    }
return data;
DDRC&=~(1<<2);
LcdUpdate();
}

В результате после 
OneWireWriteByte(0xCC);
OneWireWriteByte(0x44); //тут пробовал разные команды
OneWireReadByte();

Читаються одни 11111111
Подскажите где ошибки?



Это сообщение отредактировал(а) bend - 5.3.2009, 05:37
PM MAIL   Вверх
Mazzi
Дата 5.3.2009, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Цитата(bend @ 5.3.2009,  05:04)
В результате после 
OneWireWriteByte(0xCC);
OneWireWriteByte(0x44); //тут пробовал разные команды
OneWireReadByte();

Читаються одни 11111111
Подскажите где ошибки?

нужно сделать вот так

Код

// запускаем процедуру измерения температуры
OneWireReset();
OneWireWriteByte(0xCC);
OneWireWriteByte(0x44); 

// здесь пауза не менее 750 миллисекунд для того, чтобы термометр успел измерить
.....................

// а теперь читаем содержимое термометра
OneWireReset();
OneWireWriteByte(0xCC);
OneWireWriteByte(0xBE); 
for (k=0;k<9;k++)           get[k]=OneWireReadByte();


Удачи!


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
bend
Дата 5.3.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 2.3.2009

Репутация: нет
Всего: нет



Да, большое спасибо за подсказку, но в итоге сам доковырял. smile Недокурил даташит, там действительно долгая задержка нужна, но все заработало. Возник другой вопрос - вот я получаю 2 байта температуры, ну для положительной температуры (выше ноля) старший байт нулевой. Самый младший бит как я понял отвечает за 0.5 градуса. Вобщем я взял спичкой нагрел датчик и снял 3 показания по мере его остывания (ну чтобы убедиться что датчик рабочий)
получились десятичные числа 118, 62, 55, 51, раз младший бит это 0.5 градуса то я просто поделил значение попалам, в итоге получилось после нагрева спичкой
59, 31, 27.5, 25.5, ну думаю что 25.5 градусов это моя комнатная температура что вполне соотвествует реальности... Правельно ли я сделал пересчет?
PM MAIL   Вверх
Mazzi
Дата 5.3.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Расчёт сделал правИльно. smile 


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
bend
Дата 5.3.2009, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 2.3.2009

Репутация: нет
Всего: нет



Вот теперь очередной стопор, не получаеться переделать char или int в string :(
В линуксе походу типа string нету... А переделать с помощью sprintf не получаеться вот такой код:

unsigned int TL=285; //(ну типа 28.5 градусов)
unsigned  char al_s[6]; //тут непонятно какая длина поидее int 0..65535 т.е. 5 символов всего + #0 вконце? Эх как же было хорошо в PERL все можно smile
sprintf(al_s, "%d", TL);


avrledtest.c:138: warning: implicit declaration of function 'sprintf'
avrledtest.c:138: warning: incompatible implicit declaration of built-in function 'sprintf'
avrledtest.c:138: warning: pointer targets in passing argument 1 of 'sprintf' differ in signedness

Может есть какой-нить простой и универсальный способ перевести int в string?

PM MAIL   Вверх
Mazzi
Дата 5.3.2009, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Я пользуюсь этим:
Код

    n = sprintf (buf, "%f\n", 3.141592);



--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
bend
Дата 6.3.2009, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 2.3.2009

Репутация: нет
Всего: нет



sprintf не заработал, зато заработал atoi. smile Температура показываеться, все хорошо, но естественно хочеццо большего, например подключить на шину 2 и более датчиков и снимать с каждого показания. Впринципе как я понял алгоритм следующий
                                                                                                                                                              + +++++++++       +++++++++++
======DS18S20=========DS18S20=========DS18S20=========DS18S20=====+ Atmega8  +=== + LCD3310   +
                                                                                                                                                               ++++++++++        +++++++++++

Нужно дать RESET, получить ответ, дать 0xCC, 0x44, подождать... (все датчики сформируют температуру), и потом поочереди считать каждый датчег.
Выборка должна видимо быть такой -Команда RESET, потом MATCH ROM (0x55), потом передать 8 байт, адреса конкретного устройства(датчега)
8 байт это 1байт класс устройства, 6 байт номер, 1 байт CRC, Веселые ребята писали это протокол  smile 
Затем дать команду на считывание температуры 0x44 и принять данные.
Вобщем подключил я 1 датчик, дал команду 0x33,( READ ROM), и узнал тем самым серийный номер из 8 байт. Впринципе можно сделать так для каждого датчика, но наверняка есть какой-то способ "опрашивать"  шину на предмет всех устройств? smile Еще бы процедурку для подсчета CRC готовую былоб вообще шоколадна smile 
PM MAIL   Вверх
Mazzi
Дата 6.3.2009, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

Репутация: 9
Всего: 21



Давай адрес в личку, укажи по поводу чего пишешь, пришлю тебе исходник с реализацией всего.


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
AntonGr
Дата 8.6.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.6.2009

Репутация: нет
Всего: нет



Возможно вопрос немного не в тему, но около того, поэтому решил не открывать новую тему. Разбираюсь с работой датчиков DS18S20 через преобразователь интерфейсов 1-Wire/RS232 U9097. Код программы пишу на C++ (под Windows). Приложение у меня многопоточнои, и вот я заметил, что при одновременной работе трех потоков одни из датчиков (второй) считывает температуру -43. Находятся датчики всегда правильно и по количеству и по номеру, а вот ошибка в температуре проскакивает. Я понимаю, что где-то проблема с задержками, вызванная квазипараллелизмомо работы потоков, но пока не хватает тяму сообразить самому, может подскажите, в какую сторону лучше копать...
PM MAIL   Вверх
cardinal
Дата 8.6.2009, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 8
Всего: 99



AntonGr, код выложи...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
AntonGr
Дата 9.6.2009, 05:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.6.2009

Репутация: нет
Всего: нет



Вот код. За основу взят пример создания компьютерного термометра. Уже не помню где нашел.
thread_temp - файлы определяющие основную функцию потока
temp - функции поиска устройств и чтения температур
ownet - сами функции работы с 1-wire

Присоединённый файл ( Кол-во скачиваний: 34 )
Присоединённый файл  station.rar 11,43 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.0765 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.