prave se trapim (cely den) se zprovoznenim 1-wire na MCU PIC16f628a s dig. sensorem teploty 18S20. Problem je v tom, ze nemuzu nejak prijit na to jak nastavovat pullup rezistory. Procetl jsem dokumentaci k MCU, ale moc tam doho neni. Jedine co jsem vycetl bylo, ze se musi nastavit 7. bit v registruOPTION_REG, abych povolil nastavovani pullup rezistoru na PORTB. A jestli jsem to dobre pochopil, tak zapinani a vypinani pullup rezistoru se dela pomoci TRISB, je to tak? A predpokladam, ze cteni hodnoty na portu budu cist pres PORTB repr. RB6.
no dasa spravit nieco take… na porte B povolis pullup. RB6 nastavis na log0.
Vysledkom bude: ak tris RB6 nastavis na log1 port je v vstupnom rezime na vystupe je +5V koli zapnutim pullup odporom, daju sa nacitavat data z DS cidla.
Ak tris RB6 nastavis na 0… zbernica je stiahnuta na log0 … prepinanim medzi Tris RB6 rovne 0 a tris rb6 rovne 1 vies vysielat 0 a jednotky.
Tak jsem nejak asi predpokladam dobre rozchodil 1-wire, ale, je tu preci jen jeden problem. Na sbernici mam zapojene jen jedno zarizeni a kdyz provedu sekvenci prikazu pro nacteni teploty tak mi to vzdy vraci jednu a tu samou hodnotu FFFF, coz je podle meho uplna hloupost. Mohl by mi nekdo zkotrolovat kod pls? Ja si myslim, ze je to v poradku, ale clovek nikdy nevi … New Text Document.txt (1.73 KB)
Na 1W sběrnici se interní pullup nepoužívá. Předepsaný je externí upínací odpor 4k7, jak píše správně Atlan. Proto se na této sběrnici s výhodou používají pouze dva stavy. Horní úroveň, která je držena externím upínacím odporem a dolní úroveň, která je aktivním stavem. Tento aktivní stav je pak poměrně zajímavě řízen časovými závislostmi, kdy synchronizace je tvořena sestupnou hranou a info o 1/0 délkou pulzu. Provoz sběrnice je vždy zahájen masterem (slave vždy pouze čeká na pokyny mastera, sám nikdy nic nevyvolá), tvořeným procesorem, který stáhne sběrnici do nuly na dobu minimálně 480 us (Reset pulz), pak jí na minimálně 70 us uvolní a zároveň přejde do čtení a čeká na Presence pulz. Pokud tento pulz přijde, je to správně a slave očekává povel, v opačném případě master vyhodí chybu, že na sběrně nic nevysí. Při správném vyhodnocení Presence pulzu se dokončí čekací stavy a na sběrnu se pošle některý z pokynů pro čtení ROM (tj. vyčte se family kód - 8b, sériové číslo 48b a CRC 8b). Důležité je, že se hodnoty čtou vždy od nejméně významného bitu a rotací se seskládají do hodnot bajtů. Pokud na sběrně vysí pouze jedno zařízení DS, jako předpokládám u Tebe jeden teploměr, tak nemusíš identifikovat zařízení a dáš jen povel k převodu hodnoty v teploměru a pak ke čtení hodnoty z teploměru.
Tak jsem to nakonec vyresil. Problem byl v tom, ze jsem u funkce oneWireReadByte() a oneWireWriteBit() pouzil nazacatku misto registru TRISB, registr TRISA Je to usmevne, ale je zvlastni, ze si toho nikdo nevsiml, kdo prochazel muj zdrojak ale nevadi o to vic me tesi, ze jsem na to prisel sam
Tak kdyz toto zkompiluji tak mi to vyhodi nekolik chyb 1347. Hledal jsem na netu co to muze znamenat a nasel jsem, ze se jedna o nedostatek pameti RAM. Je to mozne? Kdyz zkompiluji kod bez poslednich dvou prikazu tak mi to zabira 22% datove pameti. Taky jsem nekde vycetl, ze se mozna jedna o chybu prekladace. Mate s timto nekdo zkusenosti nebo nevite jak to vyresit?
No toto je jen priklad, ktery taky hlasi uplne stejnou chybu. Merim teplotu pomoci DS18B20 po 1-wire a ten dava presnost na 4 desetina mista, ale ve finale bych chtel pouzit jen jedno desitinne misto, coz bohate staci. Ale abych mohl merit teplotu na jednu desetinu stupne v rozsahu 0.0 - 0.9 tak musim mit vypocet na 4 desetinna mista viz. datasheet ds18b20 (nasobek 0.0625).
Pomoci float to proste nefunguje a nechapu proc, zkousel jsem stejny kod pro ruzne MCU a vysledek je stejny. Mam takovy pocit ze je to nejaky bug kompilatoru … mam Hi-tech C verzi 9.83
At to jeste upresnim, ten senzor mi vraci teplotu ve dvou bytech. Horni byte obsahuje:
byteH = [S S S S S X X X]
kde S je znamenko (1 - minus, 0 - plus), X jsou bity teploty pred desetinou carkou.
V dolni byte obsahuje:
byteL = [X X X X Y Y Y Y]
kde X jsou bity teploty pred desetinou carkou (celociselna hodnota) a Y jsou bity teploty za desetinnou carkou.
Takze kdyz chci zjistit celociselnou hodnotu teploty musim provest toto:
Ano, vystup je na lcd a merim tim jen teplotu vzduchu nic vic. Vetsina teplomeru tak meri. Nevim jak jinak zmerit teplotu na jedno desetinne misto reps. jak to urcit z tech 2 bajtu
Není lepší si v ASM oddělit ty 4 bity bokem, prohodit je úplně nejjednodušší vyhledávací tabulkou a pak pokračovat v C? Není to sice kdovíjak přesný, ale je to rychlý a zabírá to málo místa. Do C to v pohodě dopíšeš.