DS1820 - dlouhé vedení

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
epes
Příspěvky: 111
Registrován: 05 srp 2008, 02:00
Bydliště: Praha 5

DS1820 - dlouhé vedení

#1 Příspěvek od epes »

Zapojení: ATTINY2313 + DS1820 4k7 upl.odpor, 3 vodičové připojení.
Při délce vedení cca 4m funguje odečítání teploty správně. Při délce vedení cca 10m dochází zvl. při záporné teplotě k chybě až 50%. Potřeboval bych poradit jeli chyba v délce vedení, či spíše v SW.
Zde je použitá rutina

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;

Uživatelský avatar
ross4435897
Příspěvky: 426
Registrován: 10 lis 2009, 01:00
Bydliště: Brno

#2 Příspěvek od ross4435897 »

// onewire
OneWireReset();
OneWireOutByte(0xcc);
OneWireOutByte(0x44);

PORTB |= _BV(DS_BIT);
DDRB |= _BV(DS_BIT);
_delay_ms(1000);
DDRB &= ~_BV(DS_BIT);
PORTB &= ~_BV(DS_BIT);

OneWireReset();
OneWireOutByte(0xcc);
OneWireOutByte(0xbe);

DSdata[0] = OneWireInByte();
DSdata[1] = OneWireInByte();

int16_t TReading = (int)(DSdata[1] << 8) + DSdata[0];

SignBit = TReading & 0x8000;
if (SignBit) TReading = (TReading ^ 0xffff) + 1;

// vypocet teploty
TReading = (((6 * TReading) + TReading / 4)); // 2345 = 23.45 stupnu Celsia


... melo by tam byt minimalne 750ms
Přílohy
ATTINY13_termostat.c.txt
(5.68 KiB) Staženo 116 x

Uživatelský avatar
jasin
Příspěvky: 1440
Registrován: 22 úno 2005, 01:00
Bydliště: Kunratice u Prahy

#3 Příspěvek od jasin »

Při té délce to asi chce stíněný kabel.
Svět vypadá dobře jen při pohledu přes koňské uši.

Uživatelský avatar
ST78
Příspěvky: 113
Registrován: 16 lis 2009, 01:00

#4 Příspěvek od ST78 »

Doporučil bych začínat třeba zde:
http://www.ebastlirna.cz/modules.php?na ... ht=ds18b20

Uživatelský avatar
nekmil
Příspěvky: 780
Registrován: 06 bře 2005, 01:00
Bydliště: Havířov

#5 Příspěvek od nekmil »

A co tak zkusit místo dlouhého kabelu, "krátkou anténu" ? :D
Zrovna jsem zkoušel ATmega + DS18B20 + RFM12B. A ono to i funguje. Ale se "závorkově" orientovaným jazykem skutečně neporadím. :D

Uživatelský avatar
epes
Příspěvky: 111
Registrován: 05 srp 2008, 02:00
Bydliště: Praha 5

#6 Příspěvek od epes »

Pánové,
děkuji všem za rady a tipy.
I v tomto případě platilo staré programátorské pravidlo: při odstranění jedné chyby se do programu zanesou nejméně tři další!! Při úpravě programu a při změně DS18B20 za DS18S20 jsem zapoměl změnit posun o 4bity na posun poze 1 bitu. Chyba se při kladnývh teplotách neprojevuje, ale při záporných je to katastrofa.

Uživatelský avatar
dracekvo
Příspěvky: 402
Registrován: 10 úno 2009, 01:00

#7 Příspěvek od dracekvo »

Zdravím,

mám dotaz. Mám PIC a u něj čidlo DS18B20 parazitně napájené a nějak mi přestalo fungovat. Tak jsem laboroval a povedlo se mi to znovu zprovoznit až po snížení pullup odporu 4k7 pomocí paraelně připojenému 10k tj výsledný odpor cca 3k2.
Setkal jste se s tím někdo?

termit256
Příspěvky: 10071
Registrován: 06 pro 2007, 01:00

#8 Příspěvek od termit256 »

Ja tam dal dal tusim 1k, trochu to pomohlo, ale vyrazne se chybovost snizila az namotanim par zavitu privodnihu dratu na feritovy krouzek.
Mam vedeni cca 30m nestinenym kabelem vedenym vedle silovych (jina moznost nebyla) a uz neni problem. Obcas se jeste chybka vyskytne, ale ta se odfiltruje kontrolou CRC.

Uživatelský avatar
dracekvo
Příspěvky: 402
Registrován: 10 úno 2009, 01:00

#9 Příspěvek od dracekvo »

ferit si dal na přívodní drát napájení, nebo na ten drát co vedek od čidel?

Mě se nechtělo laborovat s kontrolou crc, tak sem udělal, že dám konvert a pak vyčtu z čidla hodnotu 3x zasebou a porovnám jestli jsou stejné. Pokud ne, tak začítám znovu a pracuju s hodnotou z minilého měření.
Dříve mi občas na lcd problikla nesmyslná hodnota, ale od téhle úpravy už nikdy.

termit256
Příspěvky: 10071
Registrován: 06 pro 2007, 01:00

#10 Příspěvek od termit256 »

Ferit jsem dal na datove vedeni, dival jsem se na to osciloskopem, bylo tam naindukovano hodne vf bordelu.
Mi se s tim crc taky nechtelo drbat, ale ty cidla jsou dost proflakle a tak nebyl problem najit na internetu kod kde to jiz nekdo napsal. Proste jsem jen rychle zkopcil kus kodu, fungovalo to a tak jsem to dal nekoumal. Bylo to tusim pro nejakou x51, jestli ti to bude k necemu, muzu ti ho najit.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“