Страница 1 из 1

Нужна помощь по DS1820

Добавлено: Ср фев 18, 2009 06:56:12
MOHOXPOM
Здравствуйте Все.
Надоело пользоваться сторонними драйверами для работы с 1-wire девайсами. Написал собственные и уперся в проблемку. Мозг порвал на пересчете температуры по формуле из даташа на DS1820. Ни чего не получается. Может кто делал такую обработку САМ на Си под WinAVR (хотя адаптировать не проблема) и может поделиться? Главное только не астму... Мозг не выдержит :)

Добавлено: Ср фев 18, 2009 08:31:28
ARV
а в чем проблема? там все просто, как колумбово яйцо...

Добавлено: Ср фев 18, 2009 09:01:41
MOHOXPOM
А вот у меня мозг не переваривает. t = temper - 0.25 + ([7]-[6])/[7]
Причем temper = [1]+([0]+1) Методом научного тыканья в небо получилось, что значение [0] надо потом на 16 делить (а написано на 2). Считает до положительную температуру более или менее нормально, а с отрицательными значениями лажа полная. Где то косяк...

Добавлено: Ср фев 18, 2009 09:22:14
ARV
я так понимаю, [7] - это вы так обозначили 7-й принятый байт буффера? так вот, во-первых, [7] = 16 всегда, во-вторых, temper (в ваших обозначениях) нужно округлить до целых, отбросив младший бит.

Добавлено: Ср фев 18, 2009 10:02:08
MOHOXPOM
Давайте так:
SCARTCHPAD[0..7]+1(CRC)
[0]- показания температуры 0xFA-0-0x92 (+0-)
[1]- преамбула знак температуры
..
..
..
[6]- REMINE
[7]- PER
[8]-CRC

Как будет формула выглядеть? Если есть - дай глянуть.

Добавлено: Ср фев 18, 2009 11:10:12
ARV
мда... плохо дело...
формула в даташите есть, словесное описание я дал - этого не достаточно?! вот вам код:

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

 temperature = ((int)SCRATCHPAD[0]>>1) - 0.25 + (SCRATCHPAD[7]-SCRATCHPAD[6])/SCRATCHPAD[7];
не забывайте, что температура передается не одним байтом, а двумя - тип int!

Добавлено: Ср фев 18, 2009 17:47:39
MOHOXPOM
Тут-то и вся свистопляска начинается. Делал так:

volatile float temperature;
volatile int TempH, TempL;

int _Temp=0x0000;
...
...
..
if (SCRATCHPAD[1] != 0x00)
_Temp=0xFF00+SCRATCHPAD[0];
else
_Temp+=SCRATCHPAD[0];

temperature = (float)((_Temp>>1) - 0.25) + (float)((SCRATCHPAD[7]-SCRATCHPAD[6])/SCRATCHPAD[7]);

TempH = (int)temperature/2;
TempL = abs((int)(temperature/2-TempH)*10);


И хочу заметить, дело не так плохо как кажется. Все драйвера для работы с переферией написаны вручную и работают на 5. Ну не выехал. Бывает. Ну коробит меня от кодвижн. Не могу пользовать его библиотеки по некоторым причинам, в следствии чего делаю сам.

Добавлено: Ср фев 18, 2009 19:03:49
ARV
MOHOXPOM писал(а):Тут-то и вся свистопляска начинается. Делал так:
я ничего не имею против самостоятельности, сам не пользую кодвижные либы, сам пишу. но то, что вы творите - это меня удивляет... вроде я вам написал формулу правильную, вы float-ы поприлепили... ничего не понимаю...

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

unsigned char SCRATCHPAD[8];
float temp;
int *t;
read_scratchpad(SCRATCHPAD); // считываем регистры термометра
// и вычисляем температуру
t = (int*)SCRATCHPAD;
temp = (*t >> 1) - 0.25 + (SCRATCHPAD[7]-SCRATCHPAD[6])/SCRATCHPAD[7];
я извиняюсь, конечно - раньше поторопился с советом... надо через указатель первых 2 байта обрабатывать...
по-моему, никакой свистопляски! никаких иных манипуляций...

Добавлено: Чт фев 19, 2009 00:30:11
РадиоЛоматель
у меня на сях реализовано так(наверное коряво, но работает!):
перед всем этим в переменную t записываем данные с датчика. minus индикатор знака (0=+,1=-)

//ув модераторы-ничего не понимаю-вставляю в свое сообщение кусок кода(см файл), а само сообщение после добавления вместо этого кода содержит какуюто кашу, на него не похожую... :oops:

Добавлено: Чт фев 19, 2009 05:32:07
MOHOXPOM
Подвела математика… Привык, что при делении в 50 % случаев получаются значения с запятой. Теперь догнал и усвоил. Вроде работает. Код(т) работает :)
СПАСИБО за помощь.

Добавлено: Чт фев 19, 2009 07:07:01
MOHOXPOM
Еще вопросик. Маленький такой. Как определить устройство DS1820(18B20) или DS19S20? У них классификатор одинаковый ведь 10h, а работают маленько по разному.

Добавлено: Чт фев 19, 2009 07:18:25
MOHOXPOM
РадиоЛоматель писал(а):у меня на сях реализовано так(наверное коряво, но работает!):
перед всем этим в переменную t записываем данные с датчика. minus индикатор знака (0=+,1=-)
Так я делал, но меня интересовала сама формула из даташа.

Можно и так

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

int zhak = 1, temperature = 0x0000;
int TempL, TempH; 

if (SCRATCHPAD[1]!=0x00){
          SCRATCHPAD[0]=0xFF-(SCRATCHPAD[0]-0x01);
          znak = (-1);
}

temperature = (zhak)*(SCRATCHPAD[0]);
TempH = (int)temperature / 2;
TempL = abs((int)(temperature / 2-TempH)*10); 

Добавлено: Чт фев 19, 2009 08:05:55
ARV
MOHOXPOM писал(а):Еще вопросик. Маленький такой. Как определить устройство DS1820(18B20) или DS19S20? У них классификатор одинаковый ведь 10h, а работают маленько по разному.
отличить можно довольно легко: если внимательно прочитать даташит, то можно заметить, что SCRATCHPAD[4] у DS1820 всегда считывается как 0xFF (это зарезервированный байт), а у DS18B20 - это конфигурационный регистр, в котором старший бит всегда 0.

Добавлено: Ср фев 25, 2009 12:51:54
MOHOXPOM
А вот кто скажет что на самих датчиках лазером написано? Что название (модель) понятно, а что дальше? На считанный адрес устройства не похоже. Может кто знает? Просто интересно. :)