| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Проблем с DS18B20 http://mcu-bg.com/mcu_site/viewtopic.php?f=2&t=10319 |
Страница 1 от 2 |
| Автор: | eddiesoft [ Нед Юли 15, 2012 11:26 am ] |
| Заглавие: | Проблем с 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 } Има няколко забележки които са сложени за препоръчителни времена и това с какви работи. Това съм го правил някога и нямах проблеми със същия този код си работеше... Благодаря предварително |
|
| Автор: | Nikola Kirov [ Нед Юли 15, 2012 11:32 am ] |
| Заглавие: | Re: Проблем с DS18B20 |
Вероятного го храниш паразитно от линията. Само че обърни внимание че тогава управлението на линията е по особенно. След като подадеш команда за старт на преобразуването трябва да включиш така наречения strong pull up. За да може да се захрани през време на преобразуването. Предполагам в хардуера не си предвидил такава екстра. Пусни му трета жица със захранаване и ще тръгне. |
|
| Автор: | eddiesoft [ Нед Юли 15, 2012 11:35 am ] |
| Заглавие: | Re: Проблем с DS18B20 |
Забравих да напиша, че и това пробвах... |
|
| Автор: | Nikola Kirov [ Нед Юли 15, 2012 11:49 am ] |
| Заглавие: | Re: Проблем с DS18B20 |
Просто получаваш стойноста по подразбиране. Тоест не е направена конверсия или резултата се ресетва преди да я прочетеш, |
|
| Автор: | eddiesoft [ Нед Юли 15, 2012 12:06 pm ] |
| Заглавие: | Re: Проблем с DS18B20 |
Да де, аз написах, че все едно не я прави, ама не мога да разбера защо.... |
|
| Автор: | Nikola Kirov [ Нед Юли 15, 2012 12:15 pm ] |
| Заглавие: | Re: Проблем с DS18B20 |
Гледам че не проверяваш контролната сума. Така не можеш да хванеш ако имаш проблем с самата комуникация. |
|
| Автор: | eddiesoft [ Нед Юли 15, 2012 2:10 pm ] |
| Заглавие: | Re: Проблем с DS18B20 |
наистина не сам я проверявал. Сега и това ще пусна, но предположих, че комуникацията е приемлово истинска щом командите минават верни... Уффф, много ме няма в изразяването... Сега ще пусна и проверка на контролата да видя какво ще върне |
|
| Автор: | eddiesoft [ Нед Юли 15, 2012 3:23 pm ] |
| Заглавие: | Re: Проблем с DS18B20 |
чек сумата си е на ред... някакви други идеи ? |
|
| Автор: | Nikola Kirov [ Нед Юли 15, 2012 3:46 pm ] |
| Заглавие: | Re: Проблем с DS18B20 |
Кода прилича да е наред. Абе я виж с мултимера дали му подаваш наистина захранване на пина. Да не си объркал нещо. Много изглежда като да се ресетва. Ако не е това можеш да пробваш да измериш дали колко време след комадата за старт на конверсията имаш резултат. Да не би изобщо да не тръгва конверсия по някаква причина. |
|
| Автор: | eddiesoft [ Нед Юли 15, 2012 4:35 pm ] |
| Заглавие: | Re: Проблем с DS18B20 |
Ами захранване си има. сега ще пусна един таймер да видя колко се бави, но за мен лично не тръгва конверсията и е нещо съвсем дребно което не съм доогледал, но не знам за кой път вече го разглобих и сглобих като хардуер. Изтрих и пренаписах цялата програма и крайния ефект си остава същия.... |
|
| Автор: | eddiesoft [ Нед Юли 15, 2012 4:47 pm ] |
| Заглавие: | Re: Проблем с DS18B20 |
хммм, изобщо не не чака след командата за конверсията. директно вдига.... Явно не я прави, но защо.... |
|
| Автор: | Nikola Kirov [ Нед Юли 15, 2012 5:07 pm ] |
| Заглавие: | Re: Проблем с DS18B20 |
За такива случаи е добре да се запише със скоп какво става по линията. |
|
| Автор: | ToHu [ Нед Юли 15, 2012 7:10 pm ] |
| Заглавие: | 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% я бях преправял непомня вече дали защото не работеше или не работеше както на мен ми се искаше. |
|
| Автор: | palavrov [ Нед Юли 22, 2012 1:18 am ] |
| Заглавие: | Re: Проблем с DS18B20 |
Скоро се тормозих с тоя сензор - прочети хубаво документацията колко време трябва да изчакаш според прецизноста за да стане измерването. Виж в на ТоНи примера как чака една секунда - може и по бързо ако не ти трябват 12 бита. Ако имаш няколко сензора може да им пратиш команда до всички да започнат измерването, и после да ги прочетеш един по един - ще спестиш малко време |
|
| Автор: | Noobster [ Пет Сеп 07, 2012 1:55 am ] |
| Заглавие: | Re: Проблем с DS18B20 |
Има едно пулл-ъпче, което е доста важно, аз май го бях забравил и не тръгваше (ако ползваш варианта с 3 кабела, което аз лично бих ти препоръчал) Захранването през кабела за данните си е малко висш пилотаж. Имам работещ код за атмега. Кода не е писан от мене, ползвал съм чужди библиотеки и съм си го напасвал, но работи безотказно. Ако имаш желание бих могъл да го изровя. |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|