| Автор |
Съобщение |
|
eddiesoft
Ранг: Минаващ
Регистриран на: Нед Фев 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 |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
 Re: Проблем с DS18B20
Вероятного го храниш паразитно от линията. Само че обърни внимание че тогава управлението на линията е по особенно. След като подадеш команда за старт на преобразуването трябва да включиш така наречения strong pull up. За да може да се захрани през време на преобразуването. Предполагам в хардуера не си предвидил такава екстра. Пусни му трета жица със захранаване и ще тръгне.
|
| Нед Юли 15, 2012 11:32 am |
|
 |
|
eddiesoft
Ранг: Минаващ
Регистриран на: Нед Фев 04, 2007 5:44 pm Мнения: 90
|
 Re: Проблем с DS18B20
Забравих да напиша, че и това пробвах...
|
| Нед Юли 15, 2012 11:35 am |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
 Re: Проблем с DS18B20
Просто получаваш стойноста по подразбиране. Тоест не е направена конверсия или резултата се ресетва преди да я прочетеш,
|
| Нед Юли 15, 2012 11:49 am |
|
 |
|
eddiesoft
Ранг: Минаващ
Регистриран на: Нед Фев 04, 2007 5:44 pm Мнения: 90
|
 Re: Проблем с DS18B20
Да де, аз написах, че все едно не я прави, ама не мога да разбера защо....
|
| Нед Юли 15, 2012 12:06 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
 Re: Проблем с DS18B20
Гледам че не проверяваш контролната сума. Така не можеш да хванеш ако имаш проблем с самата комуникация.
|
| Нед Юли 15, 2012 12:15 pm |
|
 |
|
eddiesoft
Ранг: Минаващ
Регистриран на: Нед Фев 04, 2007 5:44 pm Мнения: 90
|
 Re: Проблем с DS18B20
наистина не сам я проверявал. Сега и това ще пусна, но предположих, че комуникацията е приемлово истинска щом командите минават верни... Уффф, много ме няма в изразяването... Сега ще пусна и проверка на контролата да видя какво ще върне
|
| Нед Юли 15, 2012 2:10 pm |
|
 |
|
eddiesoft
Ранг: Минаващ
Регистриран на: Нед Фев 04, 2007 5:44 pm Мнения: 90
|
 Re: Проблем с DS18B20
чек сумата си е на ред... някакви други идеи ?
|
| Нед Юли 15, 2012 3:23 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
 Re: Проблем с DS18B20
Кода прилича да е наред. Абе я виж с мултимера дали му подаваш наистина захранване на пина. Да не си объркал нещо. Много изглежда като да се ресетва. Ако не е това можеш да пробваш да измериш дали колко време след комадата за старт на конверсията имаш резултат. Да не би изобщо да не тръгва конверсия по някаква причина.
|
| Нед Юли 15, 2012 3:46 pm |
|
 |
|
eddiesoft
Ранг: Минаващ
Регистриран на: Нед Фев 04, 2007 5:44 pm Мнения: 90
|
 Re: Проблем с DS18B20
Ами захранване си има. сега ще пусна един таймер да видя колко се бави, но за мен лично не тръгва конверсията и е нещо съвсем дребно което не съм доогледал, но не знам за кой път вече го разглобих и сглобих като хардуер. Изтрих и пренаписах цялата програма и крайния ефект си остава същия....
|
| Нед Юли 15, 2012 4:35 pm |
|
 |
|
eddiesoft
Ранг: Минаващ
Регистриран на: Нед Фев 04, 2007 5:44 pm Мнения: 90
|
 Re: Проблем с DS18B20
хммм, изобщо не не чака след командата за конверсията. директно вдига.... Явно не я прави, но защо....
|
| Нед Юли 15, 2012 4:47 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
 Re: Проблем с DS18B20
За такива случаи е добре да се запише със скоп какво става по линията.
|
| Нед Юли 15, 2012 5:07 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30686 Местоположение: София
|
 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 |
|
 |
|
palavrov
Ранг: Форумен бог
Регистриран на: Вто Окт 11, 2011 11:53 pm Мнения: 4582 Местоположение: Brussels / Пловдив
|
 Re: Проблем с DS18B20
Скоро се тормозих с тоя сензор - прочети хубаво документацията колко време трябва да изчакаш според прецизноста за да стане измерването. Виж в на ТоНи примера как чака една секунда - може и по бързо ако не ти трябват 12 бита. Ако имаш няколко сензора може да им пратиш команда до всички да започнат измерването, и после да ги прочетеш един по един - ще спестиш малко време  Ако измерваш само един сензор, след командата за измерване може да четеш по един бит за да видиш кога е готов и може да четеш регистрите. Също така нямаш гаранция, че сензора е приел командата за започване на измерване, така че ако все пак прочетеш 85 градуса повтори няколко пъти измерването.
_________________ Мразя да мразя ...
|
| Нед Юли 22, 2012 1:18 am |
|
 |
|
Noobster
Ранг: Минаващ
Регистриран на: Пет Сеп 07, 2012 1:18 am Мнения: 3
|
 Re: Проблем с DS18B20
Има едно пулл-ъпче, което е доста важно, аз май го бях забравил и не тръгваше (ако ползваш варианта с 3 кабела, което аз лично бих ти препоръчал) Захранването през кабела за данните си е малко висш пилотаж. Имам работещ код за атмега. Кода не е писан от мене, ползвал съм чужди библиотеки и съм си го напасвал, но работи безотказно. Ако имаш желание бих могъл да го изровя.
|
| Пет Сеп 07, 2012 1:55 am |
|
|