Вопросы по работе с термометрами DS18B20

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
dymon
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн сен 07, 2009 18:49:16

Сообщение dymon »

Пытаюсь получить от DS18B20 сигнала присутствия, но не получается...Подтягивающий резистор подключен, использую все три вывода DS18B20, DS18B20 подключен к Mega8. Посмотрите плиз код инициализации...может кто подскажет, в чем проблема.

sbi DDRC,5 ;удерживаю единичку в течении
sbi PORTC,5 ;15 мс
rcall wait15

sbi DDRC,5 ;затем удерживаю нуль в течении 480 мкс
cbi PORTC,5
rcall wait480mks

cbi DDRC,5 ;далее перехожу в импедансное состояние,
sbi PORTC,5 ;"отпускаю шину" и жду 210 мкс.
rcall wait210mks

in temp, PINC ;далее читаю, что находится на порту
sbrs temp,5
rjmp next1
ldi temp,0b00000001
rjmp next2
next1:
ldi temp,0b0
next2:
mov data,temp
sbr data,0b00110000
ldi address,0x40
sbr address,0b10000000
rcall lcdout2
rcall cycle
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

посмотрите, как сделано управление портом в настоящих либах... вы делаете не то... PORTC всегда должен содержать 0 в разряде 1-wire, а при помощи DDRC вы должны либо переключать пин на ВЫВОД (тогда в нем формируется жесткий 0), либо переводить его на ВВОД (тогда его тянет внешний резистор к 1).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

rcall wait210mks
ну ис хуя там 210 микросекнд ? 70 микросекунл, если мне склероз не изменяет...
dymon
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн сен 07, 2009 18:49:16

Сообщение dymon »

ARV писал(а):посмотрите, как сделано управление портом в настоящих либах... вы делаете не то... PORTC всегда должен содержать 0 в разряде 1-wire, а при помощи DDRC вы должны либо переключать пин на ВЫВОД (тогда в нем формируется жесткий 0), либо переводить его на ВВОД (тогда его тянет внешний резистор к 1).

В чужих кодах не особо то разберешься.
dymon
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пн сен 07, 2009 18:49:16

Сообщение dymon »

urry писал(а):rcall wait210mks
ну ис хуя там 210 микросекнд ? 70 микросекунл, если мне склероз не изменяет...

Да, косяк мой. Но дело все равно не в тайминге, а в самом алгоритме
Последний раз редактировалось dymon Пн сен 07, 2009 20:40:31, всего редактировалось 1 раз.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

тогда изучайте AN :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

вот эта статьяесть и на сайте у Кота - что же вы не прочитали, что ли?

P.S. я, кстати, довожу до ума библиотечку поддержки slave-девайсов 1-wire... WinAVR... скоро буду выкладывать :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

гы. самый лучший алгоритм - это без библиотечных функций, собой выстраданный..
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

ARV писал(а):это функция CVAVR чего-то там возвращает...

Да вы как всегда правы неправильно написал. Функция возвращяет значение -9999. :))
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Код: Выделить всё

cbi PORTb, 4 ; линия в 0
sbi DDRb, 4
ldi tmp,    220 ; ждём >480 us         
rcall ds_delay
cbi DDRb, 4 ; отпускаем порт
ldi tmp, 20 ; ждём  >60 us          
rcall ds_delay
; теперь можно считать состояние пина
ret

И не забывайте про запрет прерываний.
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

; теперь можно считать состояние пина ----------
сказал а - говори а - в смысле - возвращает или 0, если есть ответ дачтика - или 1 - если его нет... Ох уж эти гуру... прикольные ребята...
Хоршо, что я не программист...
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

Подскажите как мерять отрицательную температу датчиком 18B20 как ее правильно считать ?
С положительной разобрался, а вот с отрицательной невыходит.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

Перевести в дополнительный код - проинвертировать результат и добавить единицу.

Код: Выделить всё

 union
{
   struct{
         unsigned char lo;
         unsigned char hi;
         }bt;
      unsigned int s;
      }un1;
bit minus;
бла бла бла
         if (calc_crc (mas) == mas[8]) // если вычисленная контрольная совпала
                 {
            minus=0;
            if(BITTST1(mas[1],7))// анализируем старший бит температуры, если число отрицательное
            {
            minus=1;
            mas[0]^=0XFF;
            mas[1]^=0XFF;
            un1.bt.lo=mas[0];
            un1.bt.hi=mas[1];
un1.s++;
            }

Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

Немогу в твоем коде понять как это делаеться, вот мой код программы , данные с датчика получаю в переменную temp как дальше узнать и разложить число если оно отрицательное ?
форум коверкает код , прекрепил.
Вложения
.0,1.c
(2.69 КБ) 283 скачивания
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

Где-то так

Код: Выделить всё

 temp=ds18b20_temperature(&ds18b20_rom_codes[0][0]); 
        minus=0;
 if (temp & 0x8000)
   {
        minus=1;
        temp^=0xFFFF;
        temp++;
   }

Присоедини весь проект, тогда скажу точно - влом рисовать.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ё-мое, какой дополнительный код, если датчик уже в дополнительном выдает температуру?

Код: Выделить всё

uint8_t result[9]; // массив, который вернул датчик
int *temp = (void*)result; // это уже готовая температура хоть + хоть -


надо только поделить на 16 *temp чтобы получить в целых градусах (если датчик DS18B20)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

urry писал(а):Присоедини весь проект, тогда скажу точно - влом рисовать.

Вот проэкт протеуса и проект КОД ВИЖЕН.

ARV немогли бы вы обьяснить как узнать что с датчика пришла минусовая температура и как из этого ответа потом еще выделить эту температуру , для положительной я уже разобрался, получаю и вывожу её на индикаторы вплоть до 128 градусов по протеусу и в железе работает, а вот немогу с отрицательной, нехочу просто скопировать чьё-то, а хочу понять и научиться почитал бы даташит да несилен в английском языке . :))
Вложения
termometer.rar
(74.05 КБ) 254 скачивания
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

я же только что вам сказал: с датчика приходит 9 байт ответа: последний - это CRC, а первые 2 байта - это и есть температура в дополнительном коде, только умноженная на 16 (если датчик DS18B20). вам ничего делать не надо, кроме как объявить указатель на первые 2 байта ответа, как на число int - и поделить это число на 16! все. автоматически получится или положетельное или отрицательное число - все как и положено для int

выводить его точно так же, как любюое число - printf или самодельными функциями, о которых я уже писал статью и не раз рекомендовал ее для ознакомления всем "выводящим" :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

у меня кодевижин поновее.. Разбирайтесь :)
Вложения
1trm.rar
(62.24 КБ) 310 скачиваний
Аватара пользователя
sheva_s
Грызет канифоль
Сообщения: 256
Зарегистрирован: Пт апр 27, 2007 14:32:48
Откуда: Украина Кривой Рог
Контактная информация:

Сообщение sheva_s »

Спасибо разобрался с отрицательными числами сначало немог понять ваш код, а потом вычитал в книге по ПИКам описание работы датчика температуры где написано что когда приходит отрицательная температура с датчика её нужно проинвертировать и прибавить 1 получим число для вывода. Вот тогда и разобрался с вашим кодом. :))
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»