Obsluha 3 čidel DS18B20 spoločne s 10 ms prerušením časovača

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

:arrow_right: administrator: přejmenováno z "prerusenie a čidlo DS18b20"

len nevravte ze to niktoo neriesil…

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 :slight_smile:

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.

nie adresujem to podla IDkodu cidiel je to na jednom pine. Tak ze radis rozdrobit zdrojak pre cidla do prerusienia a cidla obsluhovat v prerusení ?

nemozes mi poskytnut obsluhu toho cidla v preruseni rozdrobene… dakujem

Bohuzial, nemozem. Mozem Ta iba ideovo nakopnut. To aby som nakoniec nebol nakopnuty sam :slight_smile:

Sprav si jednoduchy stavovy automat.

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? :slight_smile:

Ja mam vsade zakladne prerusenie 100us.

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.

  1. na začiatku prerušenia vygenerovať zostupnú hranu.
  2. načítať stačítka - statická činnosť viac menej zaberajúca rovnaké kvantum času - do 10us času pod napr.18.432MHz habadej.
  3. č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.
  4. 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š.

No nic ako vidim mam co robit. To som si zas vymyslel budu na seba.

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 :

  1. 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

  2. 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

  3. Č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.

Este sa chcem spytat ako vyriesit cakanie pri konverzii teploty. V datasheete pisu pri 12bit rozliseni konverzia trva 750mS.

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.

Ahaa uz je to jasne, ake jednoduche a efektivne :slight_smile: vdaka