Nazdar.
Prosím o radu. Skúšam prácu s ds18b20 ale mám problém zo zobrazením záporných (-) hodnotách. Meranie teploty do 0.00°C je to OK ale hneď potom skočí na -127°C.
Kód používam z tejto stránky SVET ELEKTRO
Atmega8 + DS18B20 chyba merania.
Moderátori: psichac, Moderátori
Re: Atmega8 + DS18B20 chyba merania.
pohraj sa s tymto
po mensej uprave ti to pojde ja to pouzivam v bezdrotovom teplomery
je to tam urobene ze ked mas teplotu 9,5°C zhasne druhy segmet. displej aby nezobrazilo 09,5°C a prvy segmet je bud vypnuty to je +
alebo zobrazi -
takto nejak:
Kód: Vybrať všetko
http://radioparty.ru/prog-avr/program-c/378-lesson2-ds18b20
Kód: Vybrať všetko
display1 = tempint1; // znamienko
display2 = tempint2; // 1. cifra
display3 = tempint3; // 2. s bodkou
display4 = temppoint1;// 3. cifra
Kód: Vybrať všetko
char buff[16];
sprintf(buff,"%u%u%u.%u",tempint1,tempint2,tempint3,temppoint1);
alebo zobrazi -
takto nejak:
Kód: Vybrať všetko
if(temp_flag == 0)
tempint1 = '-';
if(tempint1 < 1)
tempint1 = ' ';
if(tempint1 == 12 && tempint2 < 1)
tempint2 = ' ';
if(tempint2 < 1 && temp_flag == 0)
tempint2 = ' ';
0
ho
Re: Atmega8 + DS18B20 chyba merania.
Nieje číslo, ktoré vypisuješ ako unsigned? Skús sem dať tvoj kód.
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: Atmega8 + DS18B20 chyba merania.
Nie je to chyba merania ale chyba programátora, ktorý nevie ako sú kódované záporné čísla. Tu je ten kód čo to má na svedomí.
Riešení je viacero:
1 Urobiť prevod z druhého doplnku v prípade že je to záporné. To ale nie je moc Cckové, tí sa na také low level funkcie nehrajú ak nemusia.
2 použiť signed premenné ako to je na tej ruskej stránke.
V každom prípade ale treba rozumieť tomu ako sú kódované celé čísla so znamienkom aj bez znamienka.
Kód: Vybrať všetko
unsigned char low_byte;
unsigned char high_byte;
unsigned char sign;
unsigned int decimal;
unsigned int integer;
if (high_byte & (0xF0)) sign = 1;
else sign = 0;
decimal = (low_byte & 0x0F)*625;
high_byte &= 0x07;
high_byte <<= 4;
low_byte >>= 4;
low_byte &= 0x0F;
integer = low_byte | high_byte;
if(sign == 0) sprintf(buff,"%u.%04u",integer,decimal);
else if(sign == 1) sprintf(buff,"-%u.%04u",integer,decimal); //tu vypisuje zápornú hodnotu ale tá je v druhom doplnku takže miesto 1 je 127.
1 Urobiť prevod z druhého doplnku v prípade že je to záporné. To ale nie je moc Cckové, tí sa na také low level funkcie nehrajú ak nemusia.
2 použiť signed premenné ako to je na tej ruskej stránke.
V každom prípade ale treba rozumieť tomu ako sú kódované celé čísla so znamienkom aj bez znamienka.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
Re: Atmega8 + DS18B20 chyba merania.
v prilohe som prerobil na rychlo toho rusáka na lcd
v projekte si zmen z mega88 na megu8, lcd a DSko
v proteuse to funguje nechcelo sa mi behat na balkon stale
v projekte si zmen z mega88 na megu8, lcd a DSko
v proteuse to funguje nechcelo sa mi behat na balkon stale
- Prílohy
-
- thermometer.rar
- (97.14 KiB) 55 stiahnutí
0
ho