DS1820 - dlouhé vedení

Prosím o radu stímto problémem:
Zapojení ATTINY2313+D1820+3vodič vedení+ 4k7 odpor

Je-li vedení cca 3 metry odečítání teploty funguje OK
Je-li délkyy cca 10m dochází k chybě zvl při záporných teplotách - např. při -20 st.C je chyba 50%.
Nevím je-li to vina dlouhého vedení či programu. Kod je zde:

void mereni()
{ asm WDR
Ow_Reset(&PORTd, 2); // Onewire reset signal
Ow_Write(&PORTd, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTd, 2, 0x44); // Issue command CONVERT_T
delay_us(200);
Ow_Reset(&PORTd, 2);
Ow_Write(&PORTd, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTd, 2, 0xBE); // Issue command READ_SCRATCHPAD
delay_ms(100);
TI=Ow_Read(&PORTd, 2);
delay_ms(100);
TI=(Ow_Read(&PORTd, 2) << 8) + TI; //mereni vnitrni teploty
delay_ms(100);
if (TI & 0x8000) // check if temperature is negative
{tin[0] = ‘-’; TI = ~TI + 1;} else tin[0]=’+’;
TI=TI>>4;
tin[1] = (TI/10)%10 + 48; // Extract tens digit
tin[2] = TI%10 + 48; // Extract ones digit
asm WDR
Ow_Reset(&PORTd, 3); // Onewire reset signal
Ow_Write(&PORTd, 3, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTd, 3, 0x44); // Issue command CONVERT_T
delay_us(200);
Ow_Reset(&PORTd, 3);
Ow_Write(&PORTd, 3, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTd, 3, 0xBE); // Issue command READ_SCRATCHPAD
delay_ms(100);
TO= Ow_Read(&PORTd, 3);
delay_ms(100);
TO = (Ow_Read(&PORTd, 3) << 8) + TO; //mereni venkovni teploty
delay_ms(100);
if (TO & 0x8000) //TOUTje TOPOM ve znacich
{tout[0] = ‘-’; TO = ~TO + 1; } else tout[0]=’+’;
TO=TO>>4;
tout[1] = (TO/10)%10 + 48; // Extract tens digit
tout[2] = TO%10 + 48; // Extract ones digit
acit=0;
asm WDR
return;

Zkusil jsem hodnotu zvedacího odporu snížit na 3k9, ale moc to nepomohlo. Nevím na jakou hodnotu až můžu jít.

Díky za rady.

Hodnotu rezistoru môžeš znížiť až na 2k7 (poprípade 2k2 som používal pri nejakom dlhšom vedení) a výpis programu skús dať do CODE … takto sa v tom blbo orientuje…

Bodol by logický analyzátor, aby si videl, ako dlho mu to trvá na zdvihnutie napätia, a v ktorej časti to zhruba čítaš …

void mereni() { asm WDR Ow_Reset(&PORTd, 2); // Onewire reset signal Ow_Write(&PORTd, 2, 0xCC); // Issue command SKIP_ROM Ow_Write(&PORTd, 2, 0x44); // Issue command CONVERT_T delay_us(200); Ow_Reset(&PORTd, 2); Ow_Write(&PORTd, 2, 0xCC); // Issue command SKIP_ROM Ow_Write(&PORTd, 2, 0xBE); // Issue command READ_SCRATCHPAD delay_ms(100); TI=Ow_Read(&PORTd, 2); delay_ms(100); TI=(Ow_Read(&PORTd, 2) << 8) + TI; //mereni vnitrni teploty delay_ms(100); if (TI & 0x8000) // check if temperature is negative {tin[0] = '-'; TI = ~TI + 1;} else tin[0]='+'; TI=TI>>4; tin[1] = (TI/10)%10 + 48; // Extract tens digit tin[2] = TI%10 + 48; // Extract ones digit asm WDR Ow_Reset(&PORTd, 3); // Onewire reset signal Ow_Write(&PORTd, 3, 0xCC); // Issue command SKIP_ROM Ow_Write(&PORTd, 3, 0x44); // Issue command CONVERT_T delay_us(200); Ow_Reset(&PORTd, 3); Ow_Write(&PORTd, 3, 0xCC); // Issue command SKIP_ROM Ow_Write(&PORTd, 3, 0xBE); // Issue command READ_SCRATCHPAD delay_ms(100); TO= Ow_Read(&PORTd, 3); delay_ms(100); TO = (Ow_Read(&PORTd, 3) << 8) + TO; //mereni venkovni teploty delay_ms(100); if (TO & 0x8000) //TOUTje TOPOM ve znacich {tout[0] = '-'; TO = ~TO + 1; } else tout[0]='+'; TO=TO>>4; tout[1] = (TO/10)%10 + 48; // Extract tens digit tout[2] = TO%10 + 48; // Extract ones digit acit=0; asm WDR return;

Analazátor je v tomto čase a místě nedosažitelný. Znovu jsem odečítal teploty a začínám mít zlé tušení, že chyba bude spíše v programu neboť naměřená hodnota je vždy poloviční než skutečná!! Chybu v kódu ale odhalit nejsem zaím shopen. Když vás, pánové, něco napadne - sem s tím.
Díky

Napadá ma ešte jedna vec, ak používaš 1820 (nie18B20) tak tá ma v MSB pri zápornom znamienku samé 1, a používa iba jeden bit v LSB na desatinné miesto. V tomto prípade treba rotovať ako TI tak aj TO iba raz do prava, takže treba zameniť riadky
TI=TI>>4; za TI=TI>>1;
a
TO=TO>>4; za TO=TO>>1;

Ak používaš 18B20, tak tá je defaultne nastavená na 4bity pre desatinné miesto, takže tam by to bolo v poriedku.

Nemám teraz možnosť to hodiť do simulátora, ale čo som skúšal na kalkulačke vo WINDOWSe, tak tam mi to vcelku sedí, s tým, že uvažujem o 1820 (bez B), takže robím iba rotáciu o 1 bit…večer, až sa zobudím po nočnej (a bude sa mi chcieť aj rozmýšľať, hodím to do simulátora a skúsim, ako sa to správa…

podobný problém sa riešil aj tu:
forum.mcontrollers.com/viewtopic.php?t=508&start=0&postdays=0&postorder=asc&highlight=

Je to tak, Stanleyv!
Používám sice DS18S20, ale čumím do datasheetu pro DS18B20. V noci jsem sice došel k závěru, že je chyba je právě někde v posunech bitů a kód jsem několikrát kontroloval, ale právě oproti datasheetu DS18B20. Nejhorší na tom je, že datasheet pro DS1820 mi leží ve vedlejších deskách.

Takže ještě jednou díky.

Ak som to správne pochopil, už ti to beží v pohode?

Bohužel, zatím jen na papíře. MCU je v zařízení, které je na chalupě na horách. Byl jsem tam víceméně jen na “návtěvě” nemaje potřebné nádobíčko. Dnes se snad dostanu k fyzické nápravě škod a k výměně MCU se dostanu až začátkem příštího roku. Dám Ti vědět jak to dopadlo.
Přeji Ti a všem ostatním do dalšího roku jen samé nej nej.

Tak dúfam, že to už pôjde… A všetko naj aj tebe aj všetkým tuto…