Страница 12 из 16

Добавлено: Пн сен 07, 2009 19:33:56
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

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

Добавлено: Пн сен 07, 2009 20:26:48
urry
rcall wait210mks
ну ис хуя там 210 микросекнд ? 70 микросекунл, если мне склероз не изменяет...

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

Добавлено: Пн сен 07, 2009 20:35:31
dymon
urry писал(а):rcall wait210mks
ну ис хуя там 210 микросекнд ? 70 микросекунл, если мне склероз не изменяет...
Да, косяк мой. Но дело все равно не в тайминге, а в самом алгоритме

Добавлено: Пн сен 07, 2009 20:35:45
GP1
тогда изучайте AN :wink:

Добавлено: Пн сен 07, 2009 20:48:12
ARV
вот эта статьяесть и на сайте у Кота - что же вы не прочитали, что ли?

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

Добавлено: Пн сен 07, 2009 21:30:31
urry
гы. самый лучший алгоритм - это без библиотечных функций, собой выстраданный..

Добавлено: Пн сен 07, 2009 21:49:38
sheva_s
ARV писал(а):это функция CVAVR чего-то там возвращает...
Да вы как всегда правы неправильно написал. Функция возвращяет значение -9999. :))

Добавлено: Пн сен 07, 2009 22:12:36
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
И не забывайте про запрет прерываний.

Добавлено: Пн сен 07, 2009 22:23:51
urry
; теперь можно считать состояние пина -----------------------
сказал а - говори а - в смысле - возвращает или 0, если есть ответ дачтика - или 1 - если его нет... Ох уж эти гуру... прикольные ребята...
Хоршо, что я не программист...

Добавлено: Ср сен 09, 2009 13:15:39
sheva_s
Подскажите как мерять отрицательную температу датчиком 18B20 как ее правильно считать ?
С положительной разобрался, а вот с отрицательной невыходит.

Добавлено: Ср сен 09, 2009 13:42:09
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++;
				}


Добавлено: Ср сен 09, 2009 14:26:43
sheva_s
Немогу в твоем коде понять как это делаеться, вот мой код программы , данные с датчика получаю в переменную temp как дальше узнать и разложить число если оно отрицательное ?
форум коверкает код , прекрепил.

Добавлено: Ср сен 09, 2009 15:18:13
urry
Где-то так

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

 temp=ds18b20_temperature(&ds18b20_rom_codes[0][0]); 
        minus=0;
 if (temp & 0x8000)
	{
        minus=1;
        temp^=0xFFFF;
        temp++;
	}
Присоедини весь проект, тогда скажу точно - влом рисовать.

Добавлено: Ср сен 09, 2009 15:34:22
ARV
ё-мое, какой дополнительный код, если датчик уже в дополнительном выдает температуру?

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

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

Добавлено: Ср сен 09, 2009 18:44:56
sheva_s
urry писал(а): Присоедини весь проект, тогда скажу точно - влом рисовать.
Вот проэкт протеуса и проект КОД ВИЖЕН.

ARV немогли бы вы обьяснить как узнать что с датчика пришла минусовая температура и как из этого ответа потом еще выделить эту температуру , для положительной я уже разобрался, получаю и вывожу её на индикаторы вплоть до 128 градусов по протеусу и в железе работает, а вот немогу с отрицательной, нехочу просто скопировать чьё-то, а хочу понять и научиться почитал бы даташит да несилен в английском языке . :))

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

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

Добавлено: Ср сен 09, 2009 20:34:24
urry
у меня кодевижин поновее.. Разбирайтесь :)

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