Страница 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=-)
//ув модераторы-ничего не понимаю-вставляю в свое сообщение кусок кода(см файл), а само сообщение после добавления вместо этого кода содержит какуюто кашу, на него не похожую...

Добавлено: Чт фев 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
А вот кто скажет что на самих датчиках лазером написано? Что название (модель) понятно, а что дальше? На считанный адрес устройства не похоже. Может кто знает? Просто интересно.
