Zdravim Vas pani, mam jeden problem s ktorym sa uz par dni trapim. Navrhol som si jeden termostat no mam problem pri citani z 1wire zbernice. Ako cidla som pouzil DS18B20 a kedze som mal volne vstupy a nechcel riesit adresovanie tak som pouzil pre kazde cidlo vlastny vstup. Ide o to ze vsetko funguje ako ma, teplota meram, nastavujem a podla nastavenej spinam rele no nechcem v programe pouzivat wait funkcie tak som sa rozhodol spravit to s casovacom no pokial pouzijem prikaz 1wread(9) tak casovac prestane fungovat. Pokial prikaz nepouzijem tak casovac bezi ako ma. Prikladam cast kodu:
'Podprogram pre casovac
Casovac:
Incr Cas
Return[/code]
Samozrejme nerieste meranie teploty, nieje tam cakanie na to aby cidlo hodnotu spravne skonvertovalo a odoslalo. Hodil som si na LCD hodnotu z TCNT1 a ta sa nejakym sposobom meni no v obsluhe prerusenia sa nevykonava nic. Potom som si na LCD nechal zobrazit hodnotu ktoru pri kazdom preruseni od pretecenia inkrementujem no ta sa meni v rozsahu od -1 do 0 pricom toto plati ak je hodnota Cas deklarovana ako integer. Pokial pouzijem datovy typ byte, pripadne word tak casovac funguje no vystup mi kmita na frekvencii cca 1Hz, pricom je uplne jedno co mam nastavene v premennej Cas a takisto je ignorovane aj to co nastavim do preddelicky casovaca. Skusal som pouzit iba 1wire vstup zeby nahodou mal problem s tym ze su dva no bez uspechu. Z tohoto som vazne mimo a netusim co a preco sa to deje a trapim sa s tym uz asi dva dni. Skusal som aj iny procesor, konkretne M168, no vysledok rovnaky. Neviete niekto kde moze byt problem? Dakujem
A jak vypadá funkce 1wread ? Vypadá to, že není korektně napsaná a přenastavuje si časovač 1 pro svoje použití. Zkus na test použít jiný časovač pro proměnnou Čas. Druhá varianta je, že je chybný parametr funkce a ona si s tím neporadí.
To netusim ako to maju spravene, no nechapem preco mi to odstavi komplet vsetky casovace. Uz som skusal robit aj to ze som si priamo v hlavnom programe rucne nastavil casovac podla potreby a do podmienky som dal ze pri kazdom preteceni mi inkrementuje moju premennu no bez vysledku ale pritom ked som mal obsah registra s aktualnou hodnotou na displeji tak bola nenulova a menila sa. Skusal som aj pred prikazom citania zastavit a po jej vykonani znova rozbehnut casovac no znova bez vysledku a najviac ma na tom zaraza ze ak zmenim datovy typ na iny ako integer tak je to uplne v haji a kmita to bezohladu na nastavenu hodnotu a dokonca aj na nastavenu preddelicku, jediny vplyv na to ma zmena frekvencie jadra
Jasne, teraz som si to poriadne precital ja som hned logicky ulozil hodnotu na ktorej skoncil casovac ci to nahodou nerobi problem
PS: to iste aj ked som ulozil cely obsah a po vykonani znova nacital
PS2: to cislo je adresa, alebo inak povedane bajt v pamati cidla kde je ulozena teplota len teraz ako ti to tu tak pisem tak som si vsimol ze po dlhsom case to rele spina, no nie v case v akom by malo ale v omnoho dlhsom, co vyzera akoby sa zmenila frekvencia alebo preddelicka. Ak pouzijem ulozenie a znovu nacitanie registra SREG tak ten cas je kratsi, bez pouzitia je omnoho dlhsi, odhadom 15sek s ulozenim k 150sek bez ulozenia SREG
Alebo je to tak ako pises? Fu teraz si ma zarazil lebo nemal som pred sebou datasheet a to citanie teploty je z nejakeho prikladu a nikdy som to neriesil a bol v tom ze je to adresa registra kde je teplota. No idem to hned aj pozriet, nikdy som sa o to nezaujimal ked to chodilo
Tak už asi vím - 1wread(9) zapíše 9 bytů na adresu proměnné, tudíž Ti přepíše proměnnou Teplota_1 nebo Teplota_2, ale i to, co je v paměti za ní.
Musíš použít buď 1wread(2) nebo to pomocí 1wread() číst po částech.
Takze ak citam len prve dva bajty tak vsetko chodi ako ma, meram teplotu a casovac bezi. A teraz preco sa to stalo? Mala velkost pamati pre zapis premennych? Lebo teraz ked rozmyslam tak je pravda ze mam tam dva potenciometre + nejake pomocne premenne s typom integer takze asi som to prepiskol
Tohle asi nebude souviset s velikostí paměti pro proměnné, ale s tím, že čteš do proměnné o délce 2 byty, ale funkci řekneš, aby přečetla 9 bytů. Funkce tedy přečte 9 bytů, jenže tím pádem přepíše i proměnné, které jsou uložené v paměti za proměnnou, kterou jsi chtěl načíst.
Pokud tedy proměnné byly uloženy takto :
Dim Teplota_1 As Integer
Dim Teplota_2 As Integer
Dim Cas As Integer
tedy :
Teplota_1 - 2 byty
Teplota_2 - 2 byty
Čas - 2 byty
pak čtením 9 bytů na adresu Teplota_1 jsi přepsal i Teplota_2, Čas a další 3 byty volné paměti.
Možná by stačilo, abys měl proměnné deklarované v pořadí
Dim Cas As Integer
Dim Teplota_1 As Integer
Dim Teplota_2 As Integer
a časovač by chodil dál. Chyba by se tím ale neodstranila pořád bys přepisoval i paměť za 2-bytovou proměnnou.
Teraz tomu rozumiem a je to presne tak ako si pisal, stacilo presunut premennu cas na zaciatok a tym padom ju neprepisujem ale prepisujem len premennu s teplotou a zvysne volne. Tak toto by ma ani vo sne nenapadlo riesit a pozerat. Dakujem Ti velmi pekne za ochotu a cas, velmi si mi pomohol a konecne sa mozem odrazit dalej lebo uz som bol bezradny. Este raz velka vdaka!