 |

|
|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2025 12 24, 00:14. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Mikrovaldikliai » DS18B20 prie atskirų pin'ų.
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 02 01, 19:30 |
|
|
|
|
| vitukas1 rašo: |
| Edzma rašo: |
| vitukas1 rašo: |
Dar kartą noriu padėkoti JOnis, kad "užvedė ant kelio". Aš likau su 1-Wire protokolu. Turint kintamuosius (ds18b20) atlikti veiksmus su jais "juokų darbas".
. |
Gal gali kokia nuoroda....  |
Kokiu klausimu nuorodą? |
.....1-Wire |
|
|
|
|
|
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 02 01, 20:43 |
|
|
|
|
Gal kas galetu paaiskint?
Pasileidau per proteus ds18s20 temperatura rodo kaip priklauso
o ds18b20 i lcd isveda temperatura 4 laipsniais maziau.Isbandziau ir realiai,
paklaida ta pati.
Tai taip ir likau nesuprates kame reikalas  |
|
_________________ Kas yra virš drąsos? Bėgti prieš traukinį ir šaukti suvažinesiu...! |
|
|
|
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 02 01, 21:03 |
|
|
|
|
| A&V rašo: |
Gal kas galetu paaiskint?
Pasileidau per proteus ds18s20 temperatura rodo kaip priklauso
o ds18b20 i lcd isveda temperatura 4 laipsniais maziau.Isbandziau ir realiai,
paklaida ta pati.
Tai taip ir likau nesuprates kame reikalas  |
Skirtingi yra šie temperatūros davikliai, skiriasi bitų skaičius, gal dar kas nors. Paskaityk datasheetą. |
|
|
|
|
|
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 02 01, 21:27 |
|
|
|
|
| A&V rašo: |
Gal kas galetu paaiskint?
Pasileidau per proteus ds18s20 temperatura rodo kaip priklauso
o ds18b20 i lcd isveda temperatura 4 laipsniais maziau.Isbandziau ir realiai,
paklaida ta pati.
Tai taip ir likau nesuprates kame reikalas  |
DS18S20 9 bitų daviklis, DS18B20 rezoliuciją galima keisti nuo 9 iki 12 bitų. DS18B20 iš gamyklos "išeina" su 12 bitų rezoliucija. Jeigu dirbi su 12 bitų rezoliucija (DS18B20) tai gautą rezultatą dalini iš 16. Dirbant su 9 bitais dalinti reikia iš 2. |
|
|
|
|
|
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 02 01, 23:00 |
|
|
|
|
Su rusu draugauju labiau nei su anglu.
apie tuos bitu skirtumus skaiciau, tik su savo anglu ziniom
maniau kad ten kalba eina apie skaiciu po kablelio tiksluma
Bandysiu dalint. |
|
_________________ Kas yra virš drąsos? Bėgti prieš traukinį ir šaukti suvažinesiu...! |
|
|
|
 |
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 02 02, 20:21 |
|
|
|
|
Patikrini pirma daviklio ROM baita ir atitinkamai naudoji matematika:
DS1820_ReadScratchPad();
*result = ReadData1W(16);
unsigned char buf[9];
buf[0] = *result;
buf[1] = (*(unsigned short*)result)>>8;
buf[2] = ReadByte1W();
buf[3] = ReadByte1W();
buf[4] = ReadByte1W();
buf[5] = ReadByte1W();
buf[6] = COUNT_REMAIN = ReadByte1W();
buf[7] = COUNT_PER_C = ReadByte1W();
buf[8] = ReadByte1W();
if (*SensorAdress == 0x10)// jei DS18S20
{
*result = *result*50 - 25 + (COUNT_PER_C-COUNT_REMAIN)*100/COUNT_PER_C;;
}
else
{
*result = (*result>>4)*100 + (*result&0xF)*100/16 - 25;
}
buf naudoju del crc patikrinimo |
|
|
|
|
|
 |
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 02 14, 08:39 |
|
|
|
|
Iškilo dar vienas klausimas. Susitvarkiau su daviklių priskyrimu man reikalinga tvarka, bet truputį neaišku kaip reikėtų elgtis kurio nors daviklio gedimo atveju? Pakeitus sugedusį daviklį vėl iš naujo visus iki vieno perskirstyti perskaičius jų ROM adresus? Ir dėl temperatūrų skirtumų numačiau galimybę jį įsivesti mygtukų pagalba, kad būtų galimybė parinkti bandymo keliu. Bet vėl klausimas kolektoriaus siurbliukas turi dirbti cikliškai pvz. 2sek darbas 15sek pauzė, o gal geriau įvesti antrą temperatūrų diferencialą? Pvz. siurbliuko įjungimas skirtumas 10 laipsnių o išjungti kai temperatūrų skirtumas sumažėja iki tarkim 7 laipsnių, ar geriau darbas laiko ciklais? |
|
|
|
|
|
 |
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 02 14, 09:22 |
|
|
|
|
Operuok davikliu adresais ne fliashe, o eeprome. Pasidarai dvimati adresu masyva ir davikliu priskirimo procedura. Joje is pradziu surandi visus 1w buse pajungtus daviklius ir juadresus sukemsi i rama. Tada norima davikli (pav pasildes fenu matai kuris syla) priskiri prie norimo virtualaus numerio ir irasai i eeproma jau reikiama tvarka. Paieskos ir priskirimo proceduroi tikrini ar dabar pasirinkto davyklio numeris rame sutampa su eeprome esanciais. Jei nera - naujas. Taipogi tikrini kuriu virtualiu numeriu davikliai matomi linijoje. Ka tas duoda? Gali bet kada bet kokia tvarka bet kuri davikli prisiskirt prie norimo numerio. Jei nuemi viena ar jis sugenda, paieskos proceduroi matai kad fiziskai nera tokio daviklio bei matai kuris naujas ir ji priskiri i ta vieta
Apie procedura is vartotojo puses http://jonis.eu/images/PIDmanual.pdf
O siurblio valdymui naudotinas ir pulsinis rezimas ir temepraturu histerezise. Nemaiso turet viska |
|
|
|
|
|
 |
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 02 14, 20:40 |
|
|
|
|
Ačiū už išsamų atsakymą. Tai mano pirmi žingsniai programavime, todėl jeigu ne paslaptis norėčiau paklausti kaip tikrinti dvimatį masyvą RAM su esančiu EEPROM - po vieną baitą?  |
|
|
|
|
|
 |
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 02 14, 20:51 |
|
|
|
|
Ciklu prasuki astuonis baitus ir palyginta. Bet lygint reiks visu rastu davikliu adresus, kad nustatyt ar toks daviklis priskirtas jau kurioje atmintije. Siaip as darau taip: migtukais kairen desinen pasirenku daviklio numeri (numeri, kuriuo ir operuojau atety). Perjungiant numeri patikrinu ar tokiam numeriui yra gyvas veikiantis daviklis. Jei randamas - parodau koks priskirtas, jei nerandamas - rodau kad atmintis tuscia (net jei adresas i eeproma irasytas, nes gali but daviklis sugedes). Jei tuscia, klavisias aukstyn zemyn pasirenku suindeksuoto paieskos metu daviklio numeri. Pakeitus daviklio numeri kaskart prabegu eepromo masyva ir jei tokio serijinio nera - pazymiu raide N kad cia naujas daviklis
Cia pilna mano paieskos ir priskirimo funkcija, kai ka dabar galima bt daug optimaliau parasyt, nes tada dar buvau zaliasnis kai rasiau:
unsigned char SetTemper(unsigned char start) //davikliu paieska
{
static unsigned char * mass;
static unsigned char sensor_num, number;
unsigned char num, num1, num2;
unsigned char SensorAdress[8];
if (start)
{
blockmeasure = 1;
ClrScr();
::SetPos(0, 0); printf_P("Davikli\x05 paie\x04ka");
::SetPos(0, 1); printf_P(" RS485 linijoje");
::SetPos(0, 2); printf_P(" palaukite... ");
TermoCur = 33;
Input_select = 0;
num = DS1820_SerchDevices();
ClrScr();
::SetPos(0, 0); printf_P("Davikli\x05 paie\x04ka");
::SetPos(0, 1); printf_P("vienlaid\x02je linijoje");
::SetPos(0, 2); printf_P(" palaukite... ");
TermoCur = 33;
Input_select = 1;
num1 = DS1820_SerchDevices();
TermoCur = 33;
Input_select = 2;
num2 = DS1820_SerchDevices();
number = num + num1 + num2;
mass = new unsigned char[9 * number];
Input_select = 0;
for (TermoCur = 0; TermoCur < num; TermoCur++)
{
DS1820_SerchDevices();
for (unsigned i= 0; i<8; i++) *(mass+(TermoCur*9)+i) = AddrBuff[i];
*(mass+(TermoCur*9)+ = Input_select;
}
DS1820_StartConvertAll();
Input_select = 1;
for (TermoCur = 0; TermoCur < num1; TermoCur++)
{
DS1820_SerchDevices();
for (unsigned i= 0; i<8; i++) *(mass + (TermoCur*9) + (9*num) + i) = AddrBuff[i];
*(mass + (TermoCur*9) + (9*num) + = Input_select;
}
DS1820_StartConvertAll();
Input_select = 2;
for (TermoCur = 0; TermoCur < num2; TermoCur++)
{
DS1820_SerchDevices();
for (unsigned i= 0; i<8; i++) *(mass + (TermoCur*9) + (9*num) + (9*num1) + i) = AddrBuff[i];
*(mass + (TermoCur*9) + (9*num) + (9*num1) + = Input_select;
}
DS1820_StartConvertAll();
sensor_read_fin = 0;
key = KEY_YES;
}
if ((number) == 0 && key != KEY_YES)
{
delete [] mass;
ClrScr();
::SetPos(0, 0); printf_P("Davikli\x05 nerasta. ");
::SetPos(0, 1); printf_P("Patikrinkite, ar ");
::SetPos(0, 2); printf_P("davikliai teisingai ");
::SetPos(0, 3); printf_P("prijungti ");
blockmeasure = 0;
return OK;
}
if (key == KEY_ARR_UP) {if (TermoCur< number-1) TermoCur++;} // rasto daviklio numeris
if (key == KEY_ARR_DN) {if (TermoCur>0) TermoCur--;}
if (key == KEY_ARR_RT) {if ((++sensor_num) >= sizeof(temper_e)) sensor_num = 0;} // atminties lastele
if (key == KEY_ARR_LF) {if ((--sensor_num) == 255) sensor_num = sizeof(temper_e)-1;}
if (key == KEY_ENTER)
{
unsigned char res = 1;
__disable_interrupt();
for (unsigned char i = 0; i<8; i++)
{
if ((ee.sensors[sensor_num][i] != *(mass+(TermoCur*9)+i)) || (ee.sensor_select[sensor_num] != *(mass+(TermoCur*9)+ ))
{
ee.sensors[sensor_num][i] = *(mass+(TermoCur*9)+i);
res = 0;
}
}
if (res)
{
for (unsigned i = 0; i<8; i++)
ee.sensors[sensor_num][i] = 0;
} else ee.sensor_select[sensor_num] = *(mass+(TermoCur*9)+ ;
__enable_interrupt();
}
if (TermoCur >= number) TermoCur = 0; // îãðàíè÷èòåëü
if (key != KEY_NO)
{
for (unsigned char j = 0; j < number; j++)
{
unsigned char res = 1;
__disable_interrupt();
for (unsigned char i = 0; i<8; i++)
{
if(*(mass+(j*9)+i) != ee.sensors[sensor_num][i]) res = 0;
}
if (ee.sensor_select[sensor_num] != *(mass+(j*9)+ ) res = 0;
__enable_interrupt();
if (res)
{
if (key != KEY_ARR_RT || key != KEY_ARR_LF)
TermoCur = j;
j = number;
}
::SetPos(0, 0);
if ((number == 1) || (number == 21) || (number ==31)) printf_P(" Rastas %d daviklis", number);
else if (((number > 9) && (number < 21)) || (number == 30)) printf_P(" Rasti %d davikli\x05", number);
else printf_P(" Rasti %d davikliai", number);
::SetPos(0, 1);
if (!res) printf_P("%2d Nr. nepriskirta ", sensor_num+1); else printf_P("%2d Nr. priskirta: ", sensor_num+1);
}
}
signed short val;
if ((timeflag) || (key != KEY_NO))
{
Input_select = *(mass+(TermoCur*9)+ ;
::SetPos(0, 3);
printf_P("p#%d ", Input_select + 1);
for (unsigned i = 0; i<8; i++)
{
SensorAdress[i] = *(mass+(TermoCur*9)+i);
printf_P("%.2X", SensorAdress[i]);
}
::SetPos(0, 2);
printf_P("Daviklis %2d ", TermoCur+1);
if (sensor_read_fin > 2)
{
if (DS1820_GetTemperatureJ(&val, SensorAdress))
{
::printf_P("T=%5.1fC", ((float)val)/100.0);
} else ::printf_P(" ----- ");
sensor_read_fin = 0;
DS1820_StartConvertAll();
}
timeflag = 0;
}
if (key == KEY_MENU)
{
delete [] mass;
blockmeasure = 0;
return OK;
}
return KO;
} |
|
|
|
|
|
 |
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 02 21, 12:20 |
|
|
|
|
| Ačū už pavyzdį. Noriu išgirsti Jūsų (JOnis) nuomonę, kadangi pas mane tai tik saules kolektoriaus valdiklis, aš nedėjau laikrodžio nei išorinio (pvz. ds1307) nei naudojant kurį nors vidinį PIC'o taimerį. O jeigu prijungus dar vieną daviklį, kuris matuotų lauko temperatūrą ir priklausomai nuo jos keistų temperatūrų diferencialą. Kylant lauko temperatūrai jį mažintų ir atvirkščiai? Kokia Jūsų nuomonė? |
|
|
|
|
|
 |
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 02 21, 13:15 |
|
|
|
|
| Originaliuose nera diferencijavimo pagal lauko temperatura. Logiskai mastant siek tiek turet but priklausomybe, nors, jei gerai uzizoliuotas nuleidimo vamzdis, nelabai turet priklausyt diferencialas nuo aplinkos temperaturos. Per salcius vistiek kolektoriaus efektas nulinis, o kai silta - ne tiek daug temperatura skiriasi. AUsimas vamzdeliuose labjau priklauso nuo vamzdzio ilgio ir debito. Asmeniskai as nenaudoju saules kolekttoriaus, bet tie kurie naudoja su mano kontroleriu - nepageidavo tokio dalyko, matomai neaktualu |
|
|
|
|
|
 |
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 03 20, 19:18 |
|
|
|
|
Visdelto renkuosi varianta - davikliai ant atskiru pin"u. Kodel ? Taip tikiuosi isvengti man neiveikiamo (nei dabar, nei ateityje) priskyrimo...Manau daug paprasciau tiesiog uzklausti davikli ir pasiimti T is jo, nei juos ieskoti / nuskaityt kiekvieno koda / priskirti / issaukti....Mikrovaldiklio pinu gaila ? Sociai ju.
Manau 1wire principas geras, kai devaisu skaicius limituoja MC pinu skaiciu..
O dar prisiskaiciau apie pamiehus tarp davikliu, kai ant vienos synos ju galybes.. |
|
|
|
|
|
 |
 |
DS18B20 prie atskirų pin'ų. |
Parašytas: 2010 03 20, 20:31 |
|
|
|
|
O is kur tiems trukdziams atsirast? Jei daviklio neklausi, jis sinoj sedi pasyviai ir isvis nieko nesiuncia. Trukdziai atsiras jei klausinesi darydamas shipROM, kai nenurodai adreso, tada bardakas bus jei keli atsakys iskart
O davikliai ant atskiru pinu turi dar nepatoguma 0 kiekvienam davikliui atskiras kabelis, proce vistiek teks junginet prievada.
Pas mane kabeliu galybe name, jokiu bedu su davikliais, iki 32 ant vieno kontakto galima jungt |
|
|
|
|
|
|
 |
Google paieška forume |
|
|
 |
Naujos temos forume |
|
 |
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
 |
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
 |
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
 |
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
 |
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
 |
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
 |
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
 |
Must have farming mods
Farming simulator modhub,
Best farming simulator mods |
|

|
 |