Nefunkcny casovac pri citani 1wire

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:

[code]'Hardverova konfiguracia
$regfile = “m8adef.dat”
$crystal = 1000000
$hwstack = 32
$swstack = 8
$framesize = 16

'Konfiguracia vystupnych portov
Config Portc.5 = Output

'Pomenovanie I/O portov
Vystup Alias Portc.5

'Konfiguracia casovaca T1 do funkcie casovaca
Config Timer1 = Timer , Prescale = 1
Enable Timer1
Enable Interrupts
On Ovf1 Casovac

'Deklaracia pomocnych premennych
Dim Teplota_1 As Integer
Dim Teplota_2 As Integer
Dim Cas As Integer

'Nastavenie I/O portov a pomocnych premennych na startovacie hodnoty
Cas = 0
Teplota_1 = 0
Teplota_2 = 0

'Hlavny program v ktorom meram teplotu a ovladam zariadenie
Hlavny_program:
Do

If Cas >= 50 Then
Toggle Vystup
Cas = 0
End If

'Citanie a konverzia teploty 1
Config 1wire = Portb.3
1wreset
1wwrite &HCC
1wwrite &H44
1wreset
1wwrite &HCC
1wwrite &HBE
Teplota_1 = 1wread(9)
Teplota_1 = Teplota_1 / 16

'Citanie a konverzia teploty 2
Config 1wire = Portb.4
1wreset
1wwrite &HCC
1wwrite &H44
1wreset
1wwrite &HCC
1wwrite &HBE
Teplota_2 = 1wread(9)
Teplota_2 = Teplota_2 / 16
Loop

End

'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 aj mna napadlo, ci funkcia sama o sebe nevyuziva T1 no skusal som pouzit aj T0, T2 no vysledok je stale rovnaky

Jak vypadá funkce uvnitř asi netušíš, co ?

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

Tak si zkus před zavoláním funkce 1wread uložit hodnotu SREG a po návratu jí obnovit. Pokud funkce nekorektně zakazuje přerušení, mohlo by to pomoci.

okej idem to skusit, mam to pred sebou

Ještě mě napadá, jestli je dostatečně velký zásobník. Nevím totiž, co znamená

   $hwstack = 32
   $swstack = 8
   $framesize = 16

Skusil som a nic, to iste. Radsej pridavam aj kod aby som si bol isty ze som to spravne zapisal. Datovy typ je word

Hodnota_casovaca1 = Tcnt1h Hodnota_casovaca2 = Tcnt1l Teplota_1 = 1wread(9) Tcnt1h = Hodnota_casovaca1 Tcnt1l = Hodnota_casovaca2
PS: nepomohlo ani zvacsenie stackov
PS2: zistil som zmenu, pokial pouzijem prikaz 1wread(), tzn neurcim mu odkial ma citat tak casovac funguje, akurat samozrejme nemam teplotu

Počkej, to jsi mě asi špatně pochopil. Nepsal jsem uložit hodnotu čítače, ale SREG - stavového registru.

Aha - tak jinak - co znamená 1wread() a 1wread(9) ?

Jasne, teraz som si to poriadne precital ja som hned logicky ulozil hodnotu na ktorej skoncil casovac ci to nahodou nerobi problem :slight_smile:
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

A co tedy znamená 1wread() a 1wread(9) ?

Já jen, že je mi divný, že kvůli teplotě čteš byte 9.

DS18B20 MEMORY MAP Figure 7
SCRATCHPAD (Power-up State)
byte 0 Temperature LSB (50h)
byte 1 Temperature MSB (05h) EEPROM
byte 2 TH Register or User Byte 1* TH Register or User Byte 1
byte 3 TL Register or User Byte 2* TL Register or User Byte 2
byte 4 Configuration Register* Configuration Register
byte 5 Reserved (FFh)
byte 6 Reserved (0Ch)
byte 7 Reserved (10h)
byte 8 CRC

Není to náhodou jenom počet bytů, který má číst ?
Pak by stačilo 1wread(2). Tím načteš byte 0 a byte 1 a máš teplotu.

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.

Viz. avrhelp.mcselec.com/index.html?1wread.htm

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!

Rádo se stalo.

Do buducna by si si mal dat skor pozor, aby sa ti udaj vosiel do premenej, ako presuvat jednu premenu pred druhu a pod.