Ahojky Peťulko, nedej se zviklat a znechutit. Článek je pro myslící bastlíře a pokud si chce někdo léčit mindráky typu widle či cokoliv jiného, tak pláče sice dobře, ale na špatném hrobě a ať si čmárá třebas na papír a programuje třebas přes tlačítka. I pro mne docela zajímavý článek o něčem jiném než o placení něčeho co nevyužiju. Zrovna u termostatu nepotřebuju časy v pikosekundách, takže wocogo?
Pikosekundám ne, ale mikrosekundám již ano.
Právě kvůli pocitu, že u teploměru o mikrosekundy nejde, se mi nepodařilo odladit parazitní napájení teplotního čidla DS1820. Pomalá a špatně napsaná volání Arduino IDE nestačila poslat do čidla včas energii pro měření. Viz diskuse k článku Internetový termostat: stavba sítě teplotních čidel na 1-Wire sběrnici.
To ovšem nebyla výtka ke článku, ale výtka směrem k Arduino IDE: http://www.root.cz//clanky/internetovy-termostat-stavba-site-teplotnich-cidel-na-1-wire-sbernici/nazory/544961/
V tomto konkrétním případě nešlo ani tak o přerušení, ale o pomalost funkcí Arduino IDE.
Projekt Fast digitalRead existuje. To je ale jen malý střípek do mozaiky.
Problém celého Arduino IDE je nejen v tom, že programátory nevede ke správnému programování pomocí přerušení, ale i v tom, že knihovny jsou k takovému programování nepřátelské. Aniž by to nějak bylo dokumentováno, resetují čítače časovačů. A jsou psány tak, že nepředpokládají, že by jejich uživatel chtěl aktivně používat přerušení.
Dokonce i ukázkový příklad přerušení v dokumentaci je napsán tak, jak se to nemá dělat. (Blikač lze za pomoci přerušení napsat zcela bez potřeby čehokoliv v loop().)
Tím pádem máte jen dvě možnosti:
1) Můžete v daném okamžiku použít jen jednu takovou funkci.
2) Musíte si to přepsat.
Proč? Protože funkce použitelné paralelně se musí psát úplně jinak. Není to lineární sekvence čekání na určitou událost, ale sada funkcí, které si můžete zaregistrovat pro obsluhu určité události. Funkce pro paralelní programování musí mít úplně jiné API:
základ API pro programování ve smyčkách:
čekej_na_událost_a_pak_vrať_hodnotu()
základ API pro paralelní programování:
registruj_funkci_pro_obsluhu_události()
obsluž_událost()
Zatímco pomocí API pro paralelní programování lze napsat API pro programování ve smyčkách poměrně snadno, obráceně to nejde. Arduino IDE ovšem nabízí jen API pro programování ve smyčkách.
Pokud chcete používat časovače, musíte si ověřit, že vaše funkce nevolá např delay(). Což vylučuje většinu knihoven. (A nejhorší je na tom to, že delay() nepoužívá časovač na to, aby na chvíli uspalo CPU, ale na to, aby ho v nekonečné smyčce neustále dokola testovalo na správnou hodnotu.)
Nevím o jiné podobně komplexní sadě knihoven pro jednočipy, která by byla rychlá a přátelská k programování přerušení a obsluhy událostí.