Микроконтролери и електроника
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 бита. Ако имаш няколко сензора може да им пратиш команда до всички да започнат измерването, и после да ги прочетеш един по един - ще спестиш малко време :) Ако измерваш само един сензор, след командата за измерване може да четеш по един бит за да видиш кога е готов и може да четеш регистрите. Също така нямаш гаранция, че сензора е приел командата за започване на измерване, така че ако все пак прочетеш 85 градуса повтори няколко пъти измерването.

Автор:  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/