 |

|
|
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 25, 00:54. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Mikrovaldikliai » Atmega16 ir DS18B20
|
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 |
Parašytas: 2012 03 03, 09:37 |
|
|
|
|
To JonuiK.
CRC tikrai reikalingas. Pas mane 11 davuklių . Kontroleris Arduino pagrindu padarytas namo šildymo valdymui. Laikas nuo laiko išmeta temperatūrą -127 laipsnius ir suknisa programos valdymą. Gal kas nors gali įmesti kodą CRC tikrinimui. Pagal mane turėtų ignoruoti -127 ir laukti sekančio nuskaitymo. Būsiu dėkingas.
Vytautas |
|
|
|
|
|
 |
 |
Re: DS18b20 |
Parašytas: 2012 03 03, 11:05 |
|
|
|
|
| Vytautasskr rašo: |
Gal kas nors gali įmesti kodą CRC tikrinimui. Pagal mane turėtų ignoruoti -127 ir laukti sekančio nuskaitymo. Būsiu dėkingas.
Vytautas |
1 var. išbandytas
| Kodas: |
#define CRC8INIT 0x00
#define CRC8POLY 0x18 //0X18 = X^8+X^5+X^4+X^0
uint8_t crc8 ( uint8_t *data_in, uint16_t number_of_bytes_to_read )
{
uint8_t crc;
uint16_t loop_count;
uint8_t bit_counter;
uint8_t data;
uint8_t feedback_bit;
crc = CRC8INIT;
for (loop_count = 0; loop_count != number_of_bytes_to_read; loop_count++)
{
data = data_in[loop_count];
bit_counter = 8;
do {
feedback_bit = (crc ^ data) & 0x01;
if ( feedback_bit == 0x01 ) {
crc = crc ^ CRC8POLY;
}
crc = (crc >> 1) & 0x7F;
if ( feedback_bit == 0x01 ) {
crc = crc | 0x80;
}
data = data >> 1;
bit_counter--;
} while (bit_counter > 0);
}
return crc;
} |
2 var. nebandytas
| Kodas: |
byte calc_crc(byte buff[], byte num_vals)
{
byte shift_reg=0, data_bit, sr_lsb, fb_bit, i, j;
for (i=0; i<num_vals; i++) /* for each byte */
{
for(j=0; j<8; j++) /* for each bit */
{
data_bit = (buff[i]>>j)&0x01;
sr_lsb = shift_reg & 0x01;
fb_bit = (data_bit ^ sr_lsb) & 0x01;
shift_reg = shift_reg >> 1;
if (fb_bit)
{
shift_reg = shift_reg ^ 0x8c;
}
}
}
return(shift_reg);
} |
|
|
Paskutinį kartą redagavo Dovydas, 2012 03 04, 10:34. Redaguota 1 kartą _________________ --- |
|
|
|
 |
 |
Atmega16 ir DS18B20 |
Parašytas: 2012 03 04, 10:27 |
|
|
|
|
Dėkui Dovydui už kodą. Bandysim pritaikyti. Mano su sūnumi projektas http://suvis.wu.lt/
Iki galo neišbaigtas ir yra klaidų. Tobulumui ribų nėra, bet veikia jau nuo rudens ir esu patenkintas.
Vytautas |
|
|
|
|
|
 |
Atmega16 ir DS18B20 |
Parašytas: 2012 06 27, 11:32 |
|
|
|
|
| JOnis rašo: |
Pasiknaisiosiu po favoritus darbe, bet jauciu nebebus islike.
Siaip korektiskiausia daryt taip kaip priklauso - atlikt davikliu paieska ir tik tada juos klausinet. Neik paciu lengviausiu keliu, eik teisingu keliu |
Gal gali uzvesti ant kelio su kuo braizai grafikus savo puslapyje jonis.eu? Turiu mysql su duomenimis, noriu kazka panasaus nusibraizyti, kad vaizdas patogus butu. |
|
|
|
|
|
 |
Atmega16 ir DS18B20 |
Parašytas: 2012 06 27, 20:49 |
|
|
|
|
| Paisau su php gd2 bibliotekos pagalba. GD2 paprasciausias rinkinys primityvu paisymo funkciju. Gatavi grafikai nepatiko neivienas isvaizda, teko savo rasytis. O jei nera rasytis - zmones naudoja rdtoolsus |
|
|
|
|
|
 |
 |
Atmega16 ir DS18B20 |
Parašytas: 2012 07 24, 14:38 |
|
|
|
|
Sveiki, kaip teisingai apskaiciuoti ir isvesti i LCD temperaturos dali po kablelio?
Dirbu su mikro C for AVR, Atmega16, simuliuoju su Proteus. Vienas DS18B20 daviklis.
Noriu temperatura isvedineti 0,1 laipsnio tikslumu i LCD. Su teigiamom temperaturum viskas gerai, t.y tiek ir ant daviklio tiek ir LCD reiksmes sutampa, pvz.: - +1,1 laips; +1,2 laips; +1,3 laips ir t.t. Taciau neigiamos nesutampa:
Daviklis: -1,1 Proteus: -1,61
-1,2 ....................... -1,18
-1,3 ...................... -1,31
Kodo dalis atsakinga uz temperaturos dali po kablelio (neigiamai temp.):
Temp_fract = Temp_bytes [0] << 4;
Temp_fract = Temp_fract >> 4;
Temp_fract = ~Temp_fract+1;
Temp_fract = (Temp_fract &= 0xF)*625;
Temp_fract = Temp_fract/100;
ByteToStr(Temp_fract, Bufflcd);
LCD_Out_CP (Ltrim(Bufflcd));
Teigiamai temperaturai kodo dalis ta pati, tik be atitinkamos eilutes su inversija.
Taigi, kaip pataisyti/parasyti is naujo koda, kad viskas veiktu su neigiama temperatura? |
|
|
|
|
|
 |
 |
Atmega16 ir DS18B20 |
Parašytas: 2012 07 24, 15:05 |
|
|
|
|
Kazkaip sudetingai ten skaiciuoji
deklaruoji signed short tipo kintamaji result
Nuskaitai pirmus du baitus is daviklio ir is ju susiskaiciuoji reiksme bilekokiu budu. As skaiciuoju taip:
result = buf[0];
result = result&0x00FF;
result = result|((unsigned short)buf[1]<< ;
Tada persiskaiciuoji rezultata i temperatura su visom simtosiom dalim:
result = ((result>>4)*100 + (result&0xF)100/16 - 25)/10;
Gauni tiek teigiama, tiek neigiama temperatura simtosiomis, norint gaut laipssnius reikia result/100 . |
|
|
|
|
|
 |
Atmega16 ir DS18B20 |
Parašytas: 2012 07 24, 15:19 |
|
|
|
|
tiesiog panaudok float tipo kintamaji arba bent jau signed int,
ir viskas gausis savaime be jokiu sudetingu manipuliaciju bitais.
viskas butu mazdaug taip:
float temp= Temp_bytes [0]+ (int)Temp_bytes [1] << 8
if (temp > 0x8000) temp= 0xFFFF - temp;
temp= temp / 16;
sprintf (Bufflcd, "%f" , temp); |
|
|
|
|
|
 |
Atmega16 ir DS18B20 |
Parašytas: 2012 07 24, 15:24 |
|
|
|
|
| JOnis rašo: |
Tada persiskaiciuoji rezultata i temperatura su visom simtosiom dalim:
result = ((result>>4)*100 + (result&0xF)100/16 - 25)/10;
Gauni tiek teigiama, tiek neigiama temperatura simtosiomis, norint gaut laipsnius reikia result/100 . |
Kaip ta tavo kasiciavima suprasti?
kam tu atimi tuos 25
tavo eilute turetu buti tiesiog tokia:
result = result * 100 / 16 |
|
|
|
|
|
 |
Atmega16 ir DS18B20 |
Parašytas: 2012 07 24, 15:46 |
|
|
|
|
| Geras klausimas, taip senai naudosu sita biblioteka kad dabar net pats nesuprantu kam atimu ta 0.25. Objektyviu priezasciu nepamenu. Teoriskai nereikia atimt, gal kur kokiam apnote nuziurejes buvau |
|
|
|
|
|
 |
Atmega16 ir DS18B20 |
Parašytas: 2012 07 24, 16:22 |
|
|
|
|
o ko ne
float temp=(float)((int)buf[1]<<8 | buf[0])/16; |
|
|
|
|
|
 |
Atmega16 ir DS18B20 |
Parašytas: 2012 07 24, 19:56 |
|
|
|
|
| Apskaičiuojant temperatūrą 0.25 formulėje naudojamas tada kai reikia 0.1C tikslumo. Šiaip matuojama 0.5C tikslumu. |
|
|
|
|
|
 |
Atmega16 ir DS18B20 |
Parašytas: 2012 07 24, 21:35 |
|
|
|
|
0.5C yra daviklio kalibruote, o matuoja 18b20 1/16C rezoliucija.
float nepatinka, labai jau daug uzima vietos, kai 64 davikliai - shortas gerokai taupo resursus. O pries tai darau resulta, nes priklausomai nuo daviklio tipo skirtinga matematika. |
|
|
|
|
|
 |
Atmega16 ir DS18B20 |
Parašytas: 2012 07 24, 22:54 |
|
|
|
|
| saugot niek ir nevercia float tipe, cia tik isvedimui zmogui patogia forma. |
|
|
|
|
|
 |
Atmega16 ir DS18B20 |
Parašytas: 2012 07 24, 23:03 |
|
|
|
|
| pas atmega resursu pakanka kad nerieitetu taupyti ant float. |
|
|
|
|
|
|
 |
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 |
|

|
 |