No viem ze cidlo je tu uz 100krat preberane… ale zaujimalo by ma ako riesite a potrebujete mat casovac na prerusenie a obsluhovat cidlo.
Ide o to ze mam pripojene 3 cidla a zaroven mam od prerusenia 10ms riadene casovanie… samozrejme ked pracujem s cidlom tak musim zakazat prerusenie tym padom niekedy nenapocitam 500ms ale viac… cidla sa nacitavaju v hlavnej slucek postupne, este tam je prerusiene od portu pre encoder.
Tak že ako to riesite vy obsluga DS cidla nieco trva. dakujem
administrator: přejmenováno z "prerusenie a čidlo DS18b20"
pouzivam 1ms prerušenie casovej zaklade. V kazdej ms robim jeden bit. Ty to mozes robit v kroku 10ms. No a toto je prakticky jediny pripad ked pouzivam funkciu delay na pracu s hw. Je to sice hnus, ale vidim to ako optimum. Vzhladom na dlzku trvania prevodu v DS18xxx nevidim zpomalenie komunikacie nijako kriticke.
Ak mas cidla na roznych pinoch, mozes funcke “vlozit” do seba a tak usetris trochu strojoveho casu na riadnu pracu a nie na poflakovanie sa
Celkovo robit sw synchronne komunikacie systemom jedno prerusenie/jeden bit celkom spriechodnuje system. Po preruseni testujem ci niekto nechce cez nejake piny komunikovat, respektive ci nebol prijaty bajt cez HW I2C, UART, … a vo vsetkych rutinach ktore to umoznuju vykonam jeden krok. No a potom robim ostatne. Takto sa na nic zbytocne necaka (okrem tej nestastnej 1-wire) a sw ide ako po masle.
V najnovsich systemoch pouzivam na zakladne prerusenie miesto 1ms casovu zakladnu 100us pre 18.432MHz Xtal. Otestovanie “vsetkeho” asynchronneho trva cca 20% casu procesora, 25-35% trva nejaka “uzitocna” robota a do tych 55-40% sa procesor flaka. Viem to velmi presne lebo tieto casy priebezne dost exaktne meriam. V nameranom case je samozrejme zahrnuty cas na vyssie uvedenu diagnostiku.
1-wire potom robim v rutinach pracujucich pod desatnasobkom casu prerusenia, cize stale pod tou 1ms. Pod 100us mozes kludne vycitavat i komunikaciu do 57600Bd. Netreba si veci za kazdych okolnosti komplikovat prerusenim od kazdej periferie. To sice nie je zle, ale tazsie sa diagnostikuje a kontroluje pretecenie stacku pri roznych subehoch cinnosti.
Ahojte je to jedina moznost rozdrobit obsluhu cidla do preruseni? Pouzivam 2ms prerusenie na pracu s tlacidlami ked si dam do hlavnej slucky funkciu na meranie teploty tak tie tlacidla blbnu t.j. reaguju az na tretie stvrte stlacenie.
Staci mi meriat raz za 30s alebo minutu.
Neda sa spravit aby mi niekde na pozadi meralo teplotu a nemalo to vplyv na tlacidla?
Ale klusne si sprav zakladne prerusenie 1ms a v ramci jednej ms prijmy/vysli prave jeden bit. Do sekundy tak mozes presunut 1000bitov a za 30sekund 3,7kB. To by Ti malo satacit na hafo cidiel. Ci?
1-wire je synchrónna zbernica, tak ako I2C a SPI. Nič nenúti mastra celú komunikaciu vykonať naraz a zakázať prerušenie od tlačidiel.
Pod 1ms sa tých 60us pre generovanie log.0, prípadne oneskorenia na odčítanie stavu zbernice pri príjmu ľahko vstrebe. Tu by som sa neokúňal použiť aj pause(60us). Aj keď mne je bližší nasledovný postup - generovanie log.1.
na začiatku prerušenia vygenerovať zostupnú hranu.
načítať stačítka - statická činnosť viac menej zaberajúca rovnaké kvantum času - do 10us času pod napr.18.432MHz habadej.
čakať, či už neprešlo 10us - testom hodnoty obsahu počítadla, ktoré zároveň generuje 1ms prerušenie. Na presnosti až tak striktne nezáleží, či to bude 10us alebo 12us.
Ak áno, potom sprav nábežnú hranu a ak už v prerušení niet čo robiť, tak prerušenie ukonči.
Úvodný reset nemusí trevať 500us, ale môže byť aj dlhší. Napríklad 1ms. Ďalej je to len o tom, spraviť si stavový automat obsahjúci info, ktorý bit ktorého bajtu vysielaš respektíve ktorý bit ktorého bajtu prijímaš.
Používám Dallas čidla a čtu je v hlavní smyčce. Přerušení zakazuju POUZE v sekcích, které nesmí trvat déle - tedy :
Zápis “1” do čidla :
Zakázat přerušení
stahnout pin k nule
počkat 1 us
uvolnit pin
povolit přerušení
před zápisem dalšího bitu počkat alespoň 120us, ale to už není časově kritická sekce, tudíž tady už přerušení smí přijít
Zápis “0” do čidla :
Zakázat přerušení
stahnout pin k nule
počkat 30 us
uvolnit pin
povolit přerušení
před zápisem dalšího bitu počkat alespoň 60us, ale to už není časově kritická sekce, tudíž tady už přerušení smí přijít
Čtení z čidla :
Zakázat přerušení
stahnout pin k nule
počkat 1 us
uvolnit pin
počkat 14 us
navzorkovat pin
povolit přerušení
Zpracovat načtený bit z pinu
před čtením dalšího bitu počkat alespoň 60us, ale to už není časově kritická sekce, tudíž tady už přerušení smí přijít
Nejdéle je tedy přerušení zakázané při zápisu log. 0 do čidla. Tedy cca 30us.
No tak, ze ked skoncim komunikaciu v rytme jeden bit na 1ms, tak do jednej premennej typu uint16_t zacnem inkrementovat kazdou 1ms pod prerusenim hodnotu, a ked dosiahne napriklad 1000, tak viem ze ubehlo 1000ms. A potom zacne stavovy automat robit svoju cinnost od zaciatku.