Вопросы по работе с термометрами DS18B20
Пытаюсь получить от 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
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
- Откуда: Новочеркасск
- Контактная информация:
посмотрите, как сделано управление портом в настоящих либах... вы делаете не то... PORTC всегда должен содержать 0 в разряде 1-wire, а при помощи DDRC вы должны либо переключать пин на ВЫВОД (тогда в нем формируется жесткий 0), либо переводить его на ВВОД (тогда его тянет внешний резистор к 1).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
ARV писал(а):посмотрите, как сделано управление портом в настоящих либах... вы делаете не то... PORTC всегда должен содержать 0 в разряде 1-wire, а при помощи DDRC вы должны либо переключать пин на ВЫВОД (тогда в нем формируется жесткий 0), либо переводить его на ВВОД (тогда его тянет внешний резистор к 1).
В чужих кодах не особо то разберешься.
urry писал(а):rcall wait210mks
ну ис хуя там 210 микросекнд ? 70 микросекунл, если мне склероз не изменяет...
Да, косяк мой. Но дело все равно не в тайминге, а в самом алгоритме
Последний раз редактировалось dymon Пн сен 07, 2009 20:40:31, всего редактировалось 1 раз.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
вот эта статьяесть и на сайте у Кота - что же вы не прочитали, что ли?
P.S. я, кстати, довожу до ума библиотечку поддержки slave-девайсов 1-wire... WinAVR... скоро буду выкладывать
P.S. я, кстати, довожу до ума библиотечку поддержки slave-девайсов 1-wire... WinAVR... скоро буду выкладывать
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Pooher
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Вс янв 07, 2007 01:45:48
- Откуда: Российская Федерация, будь она неладна...
Код: Выделить всё
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
- Откуда: Винница
- Контактная информация:
Перевести в дополнительный код - проинвертировать результат и добавить единицу.
Код: Выделить всё
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
- Откуда: Украина Кривой Рог
- Контактная информация:
Немогу в твоем коде понять как это делаеться, вот мой код программы , данные с датчика получаю в переменную temp как дальше узнать и разложить число если оно отрицательное ?
форум коверкает код , прекрепил.
форум коверкает код , прекрепил.
- Вложения
-
- .0,1.c
- (2.69 КБ) 283 скачивания
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Где-то так
Присоедини весь проект, тогда скажу точно - влом рисовать.
Код: Выделить всё
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
- Откуда: Новочеркасск
- Контактная информация:
ё-мое, какой дополнительный код, если датчик уже в дополнительном выдает температуру?
надо только поделить на 16 *temp чтобы получить в целых градусах (если датчик DS18B20)
Код: Выделить всё
uint8_t result[9]; // массив, который вернул датчик
int *temp = (void*)result; // это уже готовая температура хоть + хоть -надо только поделить на 16 *temp чтобы получить в целых градусах (если датчик DS18B20)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- sheva_s
- Грызет канифоль
- Сообщения: 256
- Зарегистрирован: Пт апр 27, 2007 14:32:48
- Откуда: Украина Кривой Рог
- Контактная информация:
urry писал(а):Присоедини весь проект, тогда скажу точно - влом рисовать.
Вот проэкт протеуса и проект КОД ВИЖЕН.
ARV немогли бы вы обьяснить как узнать что с датчика пришла минусовая температура и как из этого ответа потом еще выделить эту температуру , для положительной я уже разобрался, получаю и вывожу её на индикаторы вплоть до 128 градусов по протеусу и в железе работает, а вот немогу с отрицательной, нехочу просто скопировать чьё-то, а хочу понять и научиться почитал бы даташит да несилен в английском языке .
- Вложения
-
- termometer.rar
- (74.05 КБ) 254 скачивания
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
я же только что вам сказал: с датчика приходит 9 байт ответа: последний - это CRC, а первые 2 байта - это и есть температура в дополнительном коде, только умноженная на 16 (если датчик DS18B20). вам ничего делать не надо, кроме как объявить указатель на первые 2 байта ответа, как на число int - и поделить это число на 16! все. автоматически получится или положетельное или отрицательное число - все как и положено для int
выводить его точно так же, как любюое число - printf или самодельными функциями, о которых я уже писал статью и не раз рекомендовал ее для ознакомления всем "выводящим"
выводить его точно так же, как любюое число - printf или самодельными функциями, о которых я уже писал статью и не раз рекомендовал ее для ознакомления всем "выводящим"
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- sheva_s
- Грызет канифоль
- Сообщения: 256
- Зарегистрирован: Пт апр 27, 2007 14:32:48
- Откуда: Украина Кривой Рог
- Контактная информация:
Спасибо разобрался с отрицательными числами сначало немог понять ваш код, а потом вычитал в книге по ПИКам описание работы датчика температуры где написано что когда приходит отрицательная температура с датчика её нужно проинвертировать и прибавить 1 получим число для вывода. Вот тогда и разобрался с вашим кодом. 
