zbytečně jsem plašil už jsem to vyřešil je tam pár překlepu, ale teď řeším že z toho lezou divný hodnoty… při cca 20C mi to ukazuje 165,5C :-/ ta 1 je pevná a nemění se…
LCD_HD44780_DS18S20.c (6.12 KB)
No poprve doporucujem rozdelit program na hlavny a kniznice LCD.c, DS1820.C … aby sa vtom dalo vyznat.
pouzivanie / * by som sa vyhol ak to nieje nutne.
temp = (teplota & 0x01) * 5;
text[4] = temp + 48;
Toto sa da urobit cez IF (teplota & 0x01) text[4] = ‘5’; else text[4] = ‘0’;
Ak sa na to nikto nepozriem tak vecer sa na to este pozriem.
popravde se my nechce hledat kde mas chybu, ale muzem skusit najit kede je , pokud ti vycteni teploty funguje tak si na displej vypisuj cisty data z cidla,prevod si udelej na papir, poznas kde je problem , prevod / cidlo…
Hledat chybu od displeje pozpátku - tj. ověřit zda funguje správně zobrazení znaků (textů), pak ověřit správné zobrazení napevno přednastaveného údaje atd. A teprve až je ověřená zobrazovací a přepočtová část tak teprve řešit měření. … a přidat mazání displeje (mohou zůstat znaky z předešlého výpisu)
Este nieco nainstaluj si PROTEUS a tam si mozes simulovat …ako ti to ochodi
vím že se v tom nikomu nechce babrat a taky je nejlepší když si na to přijdu sám… rozdělil jsem to do souboru… simulátor je třeba?? mám to postavené na nepájivém poli a přes Pickit2 to posílám z mplabu hned do PICe (rovnou to napájím z programátoru)
ještě jsem měl problém se znaménkem stupňů ale podle datasheetu jsem to našel displej je 4x20 s ST7066
DS.rar (3.04 KB)
KEd simulujes v MPlabe a do premenej teplota das rozumnu hodnotu teploty premene v displeji su ok ?
Este ta poprosim taj tu komplet zbaleny projekt…
Pouzivas 18S20 alebo 18B20 lenbo je tam maly rozdiel ako su data v registri usporiadane.
temp = teplota >> 1;pred toto daj teplota=0x0032; potm na displeji by si mal mat zobrazenu teplotu 25st
používám 18B20 a pokud tam zadám ručně teplotu (teplota=0x0032) na displeji je 25,0C takže displej oki, čidla jsem zkoušel přehodit, ale je to to samé
pokus.X.rar (281 KB)
[code] text[0] = ‘-’;
teplota = ~teplota + 1;
}
teplota=teplota>>3; //tot doplnene
temp = teplota >> 1;
Lcd_Gotoxy(1,0);
[/code]
skus t otakto
tak za
- teplota je teď blízko realu ale asi o 6C více
- co se teď vlastně stalo
jinak samozřejmě děkuji za snahu jinak je mím cílem doplnit více čidel najednou i s tím by si mi uměl poradit??
předem děkuji za kladnou odpověď 
ZAladny prevod je 12bitovy vid datasheet, po starte prevodu musis cakat 750ms, cakas len 500 ci kolko. TAk ze mrkni datasheet a potm sa spytaj ak by ti nebolo jasne.
Viac cidiel sa da ale nesmu byt daleko od uP, stym ze si najprv nacitas ich adresy a potom uz budes mat napevno v programe… co bude problem ak by si menil cidlo…
vzhledem k tomu že mi stačí přesnost ± 0,5C tak staci když budu cekat 100ms (DS - 93,75ms) je to tak ne?
ked zapises do eeprom cidla prevod 9bit tak hej
ještě jsem prohlížel DS a to hledání kodu mi přijde složitý a hlavně na dlouho… a navíc radši si dám čidla na správný místo a budu vědět kod čidla pokud se s čidlem nedejbože neco stane budu vědět co v programu přepsat pro nové… a abych se vyhnul hledání použiju PC a převodník com/1wire vyčtu si čidla a nahazim do programu jen jejich kody… je to tak ne??
Adresy cidiel by si vedel nacitat aj v programe co mas samozrejme po jednom, a adresy ulozit do eeprom… Ale kludne aj tvoje riesenie je ok. P.S. spim uz
Tak jsem si postavil převodník 1-Wire a vyčetl seriová čísla…
chtěl bych se zeptat jak oslovit jednotlivá čidla??
while(1)
{
Error = Ow_Reset();
if (Error == 1)
{
Ow_Write(0xCC);
//Přeskočení čtení ROM
Ow_Write(0x44);
//Zahájení převodu
//__delay_ms(750); //Doba převodu
}
Error = Ow_Reset();
if (Error == 1)
{
Ow_Write(0xCC);
//Přeskočení čtení ROM
Ow_Write(0xBE);
//čtení scratchpadu
//Načtení a uložení obsahu scratchpadu
scratchpad[0]=Ow_Read();
scratchpad[1]=Ow_Read();
teplota = (scratchpad[1]<<8)|scratchpad[0];
text[0] = ' ';
základem bude změnit hodnotu Ow_Write(0xCC); na 0x55
ale nevím co dál… odeslat číslo čidla, ale jak??
číslo co mi dalo čidlo je: FA000001B452C328
a pak by to mělo byt stejný ne? pokud připojím dvě čidla po vypsání na displej to zopakuju s jiným čidlem je to tak?
tak jsem mrknul po netu a koukam mám to i crc
FA - crc
000001B452C3 - seriové číslo
28 - family kod
teď jak mu to povědět 
[code]void cidlo2 (void)
{
therm_write_byte(0x10); //adresa je 10h ty mas 28h
therm_write_byte(0x72);
therm_write_byte(0x61);
therm_write_byte(0x7b);
therm_write_byte(0x01);
therm_write_byte(0x08);
therm_write_byte(0x00);
therm_write_byte(0x30);
}
void startprevodu (adresa) // len cislo 1 alebo 2 pre vyber adresy cidla
{
therm_reset();
//therm_write_byte(THERM_CMD_SKIPROM);
therm_write_byte(THERM_CMD_MATCHROM); vyber cidla
if (adresa==1) cidlo1();
if (adresa==2) cidlo2();
therm_write_byte(THERM_CMD_CONVERTTEMP);
}
void vysledokprevodu(void){
unsigned char temperature,i;
//Wait until conversion is complete
while(!therm_read_bit());
//Reset, skip ROM and send command to read Scratchpad
i=therm_reset();
//therm_write_byte(THERM_CMD_SKIPROM);
therm_write_byte(THERM_CMD_MATCHROM);
if (adresa==1) cidlo1();
if (adresa==2) cidlo2();
therm_write_byte(THERM_CMD_RSCRATCHPAD);
//Read Scratchpad (only 2 first bytes)
temperature=therm_read_byte();
…
.
.
.
[/code]
tak teď si připadám jako blb
nevím proč v tom hledám něco složitýho…
to že se odesílá adresa po 8bitech na to bych přišel… šlo mi o to jestli se nemusí nějak čekat mezi odesílaním a jestli se nemusí potvrzovat přijetí… kodem si mi paradně odpověděl děkuji!! no a mám myšlenku přečíst čidlo uložit do eeprom bez převodu a až budu chtít zobrazit na displeji tak teprve pak převedu jinak při porovnávání teplot budu používat 12-bit hex to je myslí rozumný a možná taky jediný řešení nevím jak bych porovnával desetiný čísla… (pro spínání relé a potom i odeslání přes serii do nanoLAnu a tam převod až html) teploty pro porovnání (rekněme mezní hodnoty) taky v eeprom a v html převod na hex a následný zapsání do přislušné buňky… tím by byla asi rozebraná problematika komplexně… jsou moje úvahy dobré?? a pak (asi zase banální dotaz) jak porovnat dvě dvojice buněk v eeprom?? (např 0x00 a 0X01 porovnat s hodnotou v 0x02 a 0X03)
staci krapet nadzvednout oci nebo popremyslet
if (adresa==1) cidlo1();
if (adresa==2) cidlo2(); to upravis if(bunka0==bunka2)rozdil02=1;
else rozdil02=0;
.
.nebo si z toho udelas 2bytebunky01=make16(bunka0,bunka1);
bunky23=make16(bunka2,bunka3);
if(bunky01==bunky23)...