Отговори на тема  [ 20 мнения ]  Отиди на страница 1, 2  Следваща
Проблем с DS18B20 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение Проблем с DS18B20
Здравейте колеги,
Имам малко странен проблем който след доста четене в нета се оказа, че и други са се сблъсквали с него...
Та за какво иде реч.
Всяко едно четене от датчика получавам само 85 градуса. Т.е. сякаш не е направил температурно измерване.
кода който ползвам е следния:

signed int Read_Temperature(void)
{
char get[9];
int i;

ow_reset();
write_byte(0xCC); //Skip ROM
write_byte(0x44); // Start Conversion
while( !read_bit() );
//DelayUs(750);
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
for(i=0; i<9; i++){
get[i] = read_byte();
}
if(get[1]) return(0xFF-get[0]);
else return(get[0]);
}

Да кажа и какво съм правил.
Съпротивлението което го дават 4.7К го сменях от 1 до 10.
Играх си с всичките времена и в четенето и в писането на командите. Първо бяха номиналните по пдф, после съм си играл с всичките да намалявам и увеличавам времената докато започне да не възприема командите.
слагах изчакване (с червеното маркирания ред) ... и винаги връща 85...
Сменях и датчика - същия ефект...
ето и командите за четене и писане.
unsigned char read_bit(void)
{
unsigned char rezult;

DQ_TRIS = OUT;
DQ = 0; // pull DQ low to start timeslot
DelayUs(6); // recomendet 6us work 7
DQ = 1; // then return high
DQ_TRIS = IN;
DelayUs(9); // recomendet 9us work 10
rezult = DQ;
DelayUs(55); // recomendet 55us work 60

return(rezult); // return value of DQ line
}

void write_bit(char bitval)
{
DQ_TRIS = OUT;
DQ = 0; // pull DQ low to start timeslot
DelayUs(6); // recomendet 6us work 7
if(bitval) DQ = 1; // return DQ high if write 1
DelayUs(54); // hold value for remainder of timeslot recomendet 54us work 57
DQ = 1;
DQ_TRIS = IN;
DelayUs(10); // recomendet 10us work 13
}

unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;

for(i=0; i<8; i++){
value >>= 1;
if( read_bit() ) value|=0x80;
}
return(value);
}

void write_byte(unsigned char value)
{
unsigned char i;

for(i=0; i<8; i++){ // writes byte, one bit at a time
write_bit(value&0x01); // write bit in temp into
value >>= 1; // shifts val right 'i' spaces
}
}


unsigned char ow_reset(void) // 0=presence, 1 = no part
{
unsigned char presence;

DQ_TRIS = OUT;
DQ = 0; // pull DQ line low
DelayUs(250); DelayUs(230); // leave it low for 480us
DQ = 1; // allow line to return high
DQ_TRIS = IN;
DelayUs(72); // wait for presence 70us
presence = DQ; // get presence signal
DelayUs(250); DelayUs(180); // wait for end of timeslot 410us

return(presence); // presence signal returned
}


Има няколко забележки които са сложени за препоръчителни времена и това с какви работи. Това съм го правил някога и нямах проблеми със същия този код си работеше...
Благодаря предварително


Нед Юли 15, 2012 11:26 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Re: Проблем с DS18B20
Вероятного го храниш паразитно от линията. Само че обърни внимание че тогава управлението на линията е по особенно. След като подадеш команда за старт на преобразуването трябва да включиш така наречения strong pull up. За да може да се захрани през време на преобразуването.
Предполагам в хардуера не си предвидил такава екстра. Пусни му трета жица със захранаване и ще тръгне.


Нед Юли 15, 2012 11:32 am
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение Re: Проблем с DS18B20
Забравих да напиша, че и това пробвах...


Нед Юли 15, 2012 11:35 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Re: Проблем с DS18B20
Просто получаваш стойноста по подразбиране. Тоест не е направена конверсия или резултата се ресетва преди да я прочетеш,


Нед Юли 15, 2012 11:49 am
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение Re: Проблем с DS18B20
Да де, аз написах, че все едно не я прави, ама не мога да разбера защо....


Нед Юли 15, 2012 12:06 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Re: Проблем с DS18B20
Гледам че не проверяваш контролната сума. Така не можеш да хванеш ако имаш проблем с самата комуникация.


Нед Юли 15, 2012 12:15 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение Re: Проблем с DS18B20
наистина не сам я проверявал. Сега и това ще пусна, но предположих, че комуникацията е приемлово истинска щом командите минават верни... Уффф, много ме няма в изразяването...
Сега ще пусна и проверка на контролата да видя какво ще върне


Нед Юли 15, 2012 2:10 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение Re: Проблем с DS18B20
чек сумата си е на ред...
някакви други идеи ?


Нед Юли 15, 2012 3:23 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Re: Проблем с DS18B20
Кода прилича да е наред. Абе я виж с мултимера дали му подаваш наистина захранване на пина. Да не си объркал нещо. Много изглежда като да се ресетва. Ако не е това можеш да пробваш да измериш дали колко време след комадата за старт на конверсията имаш резултат. Да не би изобщо да не тръгва конверсия по някаква причина.


Нед Юли 15, 2012 3:46 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение Re: Проблем с DS18B20
Ами захранване си има. сега ще пусна един таймер да видя колко се бави, но за мен лично не тръгва конверсията и е нещо съвсем дребно което не съм доогледал, но не знам за кой път вече го разглобих и сглобих като хардуер. Изтрих и пренаписах цялата програма и крайния ефект си остава същия....


Нед Юли 15, 2012 4:35 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Нед Фев 04, 2007 5:44 pm
Мнения: 90
Мнение Re: Проблем с DS18B20
хммм, изобщо не не чака след командата за конверсията. директно вдига.... Явно не я прави, но защо....


Нед Юли 15, 2012 4:47 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение Re: Проблем с DS18B20
За такива случаи е добре да се запише със скоп какво става по линията.


Нед Юли 15, 2012 5:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: Проблем с DS18B20
Нямам вече точен спомен но имах някакви грижи навремето, навръзвах 10-на сензора, сега си търсих кода, но тов акоето намирам не знам дали изобщо е това което е работило, във всеки случай не намирам библиотеката с write / read функциите, но ето как съм чел датчика :

Read ()
{
for(j=0;j<8;j++)
{
ds_tris=ds_port+0x80;
ds_bit=j;
buffer[0]=0;
buffer[1]=0;
if(touch_present())
{
touch_write_byte(0xCC);
touch_write_byte (0x44);
touch_present();
touch_write_byte(0xCC);
touch_write_byte (0xBE);
buffer[2*j] = touch_read_byte();
buffer[2*j+1] = touch_read_byte();
}
delay_ms(1);
}
delay_ms (1000);
}

това ми е инициализацията на сензора
//------------------------------------- set sensor in 9 bit mode
init_sensor()
{
for(j=0;j<8;j++)
{
ds_tris=ds_port+0x80;
ds_bit=j;
if(touch_present())
{
touch_write_byte(0xCC);
touch_write_byte (0x4E);
touch_write_byte(0x00);
touch_write_byte (0x00);
touch_write_byte (0x9F);
}
delay_ms(1);
}
}

п.с. тук чета всъщност 8 датчика закачени на отделни пинове на един порт. Тия функции които ползвам бяха от стандартна библиотека на CCS, обаче 100% я бях преправял непомня вече дали защото не работеше или не работеше както на мен ми се искаше.


Нед Юли 15, 2012 7:10 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Проблем с DS18B20
Скоро се тормозих с тоя сензор - прочети хубаво документацията колко време трябва да изчакаш според прецизноста за да стане измерването. Виж в на ТоНи примера как чака една секунда - може и по бързо ако не ти трябват 12 бита. Ако имаш няколко сензора може да им пратиш команда до всички да започнат измерването, и после да ги прочетеш един по един - ще спестиш малко време :) Ако измерваш само един сензор, след командата за измерване може да четеш по един бит за да видиш кога е готов и може да четеш регистрите. Също така нямаш гаранция, че сензора е приел командата за започване на измерване, така че ако все пак прочетеш 85 градуса повтори няколко пъти измерването.

_________________
Мразя да мразя ...


Нед Юли 22, 2012 1:18 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Сеп 07, 2012 1:18 am
Мнения: 3
Мнение Re: Проблем с DS18B20
Има едно пулл-ъпче, което е доста важно, аз май го бях забравил и не тръгваше (ако ползваш варианта с 3 кабела, което аз лично бих ти препоръчал) Захранването през кабела за данните си е малко висш пилотаж. Имам работещ код за атмега. Кода не е писан от мене, ползвал съм чужди библиотеки и съм си го напасвал, но работи безотказно. Ако имаш желание бих могъл да го изровя.


Пет Сеп 07, 2012 1:55 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 20 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни