Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
És az miért ne lenne "korrektül elkészített" az a kód, ami egy ismert jelenséget (változó túlcsordulás) lekezel, és amúgy jól működik?
Így van! Ráadásul nem is bonyolult. Ha eltároljuk a millis() korábbi értékét (uint32 változóba), a millis() aktuális értékét szintén, majd a korábbi értéket levonjuk az aktuálisból, akkor túlcsordulás esetén is helyes különbség értéket kapunk.
Többször kellet már olyan programot készítenem, amiben sok időzített feladat volt, mindegyik elmentette a futásakor aktuális időt. A fő ciklus nagyon gyorsan tudott futni, mert mindegyik részfeladat csak megnézte, hogy elérkezett-e a futásának az ideje, és ha még nem, akkor azonnal kilépett. Ez afféle kooperatív multitaskinghoz hasonló működést tud eredményezni, csak arra kell figyelni, hogy egy-egy részfeladat ne foglalja nagyon hosszú ideig a processzort, tehát az összetett feladatokat érdems több kisebb részfeladatra szétszedni. Amelyik feladatnak pedig pontos időzítés kell, akkor arra ott van pl. a timer megszakítás. Ez pedig kombinálható is a fentiekkel. Pl. a megszakítás beállít egy flag-et (is), amelyet valamelyik időzített részfeladat figyel, és töröl amikor lefutott. Pl. a forrasztóállomásomban is használtam hasonló megoldást, a mérés, PID számolás, pwm beállítás ment a timer megszakításban (40ms időközzel), ehhez "szinkronizálva" négy külön ágon a többi részfeladat, pl. kijelző frissítés (160ms), eeprom kezelés, hibadetektálás-kezelés, stb...
Mert a túlcsordulás "lekezelése" valójában egy hibajavítás, egy felesleges dolog, ami növeli a kód hosszúságát és a loop idejét. Ezért a millis() működik, de korrektebb, ha timer-el van megoldva az időzítés.
A kód hosszúságát a timer kezelés is növeli, a loop futásideje pedig az esetek túlnyomó többségében nem kritikus. Pl. ebben az esetben az a feladat, hogy X esetben történjen Y riasztás, majd ha 12 óra múlva még mindig fennáll az X eset, akkor ismét történjen Y riasztás, és stb. Valahogy nem érzem annyira időkritikusnak ezt a dolgot, ide a timer ágyúval verébre téma, pláne egy kezdőnél, aki eredetileg delay()-t akar használni.
Azt pedig már csak halkan mondom, hogy ha tényleg csak ennyi a feladat (amit senki se tud), akkor a delay()-es megoldás se elvetendő. Csak nem 12 órás várakozással, hanem mondjuk ciklusban percenkénti vizsgálattal, a kilépési feltétel pedig vagy a szakadás megszűnése, vagy 12*60 elvégzett vizsgálat. Ezzel lekezeljük azt is, ha az első riasztás követő 12 órában javítják a hibát, majd ismét megszakad a kábel.
Ez az én véleményem, kerülöm a millis()-t 1s-nél hosszabb időzítéstől. A timerek remekül használható dolgok és biztosak, nem kell odafigyelni rájuk. És ha már delay(), arra kb. ugyanez vonatkozik, nem ördögtől való, csak hosszabb időre nem szabad megakasztani a loop-ot (vagy a kvázi loop-ot). De te vagy bárki más úgy használja, ahogy akarja.
Azt tudod-e, hogy ha a timer-eket saját szájíz szerint állítgatod, akkor bizonyos függvények nem fognak működni? Pl. a timer0 a millis() fv. menedzseli... Szerintem te nem is Arduinoról beszélsz, hanem sima Atmel Studios programozásról! Vagy fogalmam sincs, mire gondolsz, de Arduino alatt Timer-t állítgatni csak akkor lehet, ha tényleg tudod mit csinálsz, mit befolyásolsz a későbbiekben. A kérdező, aki pedig 12 óráig akarta a delay-t használni, biztosan nincs tisztában ezzel (ami egyáltalán nem baj, senki sem születik mindentudónak), szóval ha neki szeretnél segíteni, figyelembe kell venni, hogy kb. milyen szinten áll a kérdező.
A hozzászólás módosítva: Szept 29, 2021
Igen, tudom. Ennek ellenére a hosszú távú idők mérésére következetesen a timerek valamelyikét kell használni. Ez az én véleményem, nem kell vele egyetérteni. Mindenki olyan kódot ír, amilyet tud. Nem gondolom, hogy a timerek használata annyira nehéz lenne, főleg úgy, hogy létezik több féle library is a használatukhoz.
A programozói szinthez pedig megint csak szerintem, fontos, hogy már a tanulás elején tisztában legyenek a kezdők legalább az alapvető működésével a rendszernek. Pl. hogy a millis() függvény számlálója túlcsordul egy idő után. Tehát úgy használom, hogy ez a tulajdonsága ne okozzon problémát.
Melyik timer-t használod? A timer0-t? Mert akkor a delay-nek annyi, és mindennek, amit timer0-t/delay-t használ. A másik kettő timer pedig a PWM kimenetekért felel, plusz a szervó könyvtár, meg egyéb spéci könyvtárak.
"hogy a millis() függvény számlálója túlcsordul egy idő után." - ez eléggé köztudott probléma, de ha nem, akkor 50 nap folyamatos működés után kiderül a hiba... Amit pedig fent Skori írt, még az átfordulásnál is helyes eredményt szolgáltat. Miért kellene pont a timer-ekbe belenyúlni, az Arduino lelkében turkálni, ami jól működik? Ezzel előre nem látható hibákat generálni? Ezt pedig egy kezdőnek tanácsolni?
Elmondtam a véleményem, szerintem érthetően. Azt meg, hogy nem érted, ne rajtam kérd számon. Mindenki úgy csinálja, ahogy akarja, miért kell ezt ismételnem? Hadd gondoljam már úgy, ahogy akarom!
Én azt látom, hogy Kovi is elmondta a véleményét, ill. kérdezett tőled. Szerintem neki is ugyanúgy joga van a véleményéhez, és neki sem kötelező egyetértenie veled. Mellesleg szerintem sincs igazad, de attól még valóban úgy csinálod ahogy akarod.
Szerintem a nagyon hosszú időzítések esetében (több óra, vagy akár több nap) pont mindegy, hogyha néhány ms-ot elcsúszik, erre felesleges a timer-t elhasználni, az csak akkor kell ha szükséges a nagy pontosságú időzítés.
Csakhogy én nem erősködtem a véleményem mellett! És még csak nem is utaltam arra, hogy ne lehessen eltérő véleménye, sőt, ellenkezőleg. Erre most te is kifogásolod, hogy nekem is van, a tiétektől eltérő véleményem, ugyanis felhozol egy szubjektív példát. Ha nem lenne bajod a véleményemmel, akkor nem próbálnál meg ellentmondani neki egy fals példával. Mi az isten van már ezen a fórumon is, hogy ne mondhatná el az ember érthetően a véleményét, hogy ne ugornának rá páran! Meg sem próbáltátok értelmezni a mondanivalómat!
Ilyen hosszú időzítésekhez inkább olyan HW-t ajánlanák amin van beépített RTC. Azzal kel az ilyen feladatot megoldani!
Pl.: Bővebben: NUCLEO F103 Arduino alól is programozható, és kap hozzá sok támogatást a neten. Bővebben: Link A hozzászólás módosítva: Szept 29, 2021
Vagy Arduinos lib: Bővebben: STM32 RTC
Én arduino-nál, hosszú időzítésnél azt a megoldást használom, hogy a timer0 előosztóját 64-ről 1024-re állítom. Így a millis() és a delay() függvények ideje 8-szorosára megnyúlik. A cirka 50 napos túlcsordulás megnő cirka 400 napra. 400 nap alatt vagy megtanulok programozni, vagy egy áramszünet ad még kis haladékot.
Emlékszem, amikor kezdőként Arduinoztam, olvastam egy ugyanilyen ajánlást, hogy "hát az Arduino alatt a timer a király, azt kell mindenre használni!!!". Gondoltam hajrá, legyen timer-es LED-villogtatás! El is kezdtem, megértettem a timer működését, a regisztereket, megtanultam, hogyan kell a regiszter értékét megváltoztatni, példaprogramokat kerestem. Beírtam Arduino alatt egy egyszerű kódot, amit előtte leellenőriztem adatlappal. Aztán teszt, és: Nem működik... De miért nem? Ezután jött a kód ellenőrzése, a LED próbája csak a port írásával, stb, stb. Minden jónak tűnik, mégsem megy! Ekkor (több óra próbálkozás után) visszaírtam soros porton a regiszterek tartalmát (ehhez persze előtte le kellett programoznom, hogy az 1-2 byte-ot bitenként lássam soros porton), és csodálkozva láttam, hogy a timer már az Arduino lap bekapcsolásának legelső pillanatába sem az adatlapi 0x00-t tartalmazza. Na ettől a szívástól szerettem volna mindenkit megkímélni, aki a te tanácsodat olvassa. Szóval nem a véleményeddel van a baj, hanem hogy nem írod oda, az mivel jár!
Az adott fejlesztői keretrendszer keretein belül maradva kevésbé ér meglepetés bárkit is.
Persze lehet tekergetni és "alányúlni" , de akkor mindenről tudnod kell : mit, miért teszel, ezért hol és mit kell beállítani ? Akkor már másik fejlesztői keretrendszerben kellene dolgozni. (pl.:ASM).
Sziasztok.
Hagyományos 16x2 LCD háttérvilágítását akarom szabályozni arduino kóddal. Úgy gondoltam , hogy van 2 nyomógomb az egyik + (emeli a fényerőt) a másik - (ez meg csökkenti a fényerőt) pwm jellel. Tudtok ebbe segíteni? régebben valahol már láttam ilyen kódot megírva de most nincs meg
Bármilyen PWM kimenetet ráköthetsz az LCD LED bemenetére és azt szabályozhatod. Keress egy motorvezérlö vagy szervovezérlö kodot, vagy csak PWM alapok is elegek.
Csinálsz számlálot az egyik gombbal növeled az értéket a másikkal meg csökkented, az eredmény egy változo, amit kiküldesz a PWM portra,
Inkább a kódot vagy linket légyszi. Köszi
Ezt találtam
Ezt a kódot tudom használni ha be van kapcsolva a belső felhúzó ellenállás (INPUT_PULLUP) vagy nem azt csinálja amit kéne?
Most is be vannak kapcsolva a belső felhúzó ellenállások, azok hajtják meg a gombokat a pin2 és pin3 bemeneteken. A led ellenállását akarod bekapcsolni, vagy melyiket? A példa amúgy szerintem pont jó arra amit kérdeztél.
szerk.: esetedben a Serial-sorokat ki is lehet szedni, az csak a soros monitorhoz kellenek. A hozzászólás módosítva: Okt 1, 2021
A nyomógombhoz nekem hardveresen nincs felhúzó ellenállás kötve és azt olvastam hogy azt a setup pinMode-ba kell.
Nem igy van bekapcsolva? pinMode(pinIncrease, INPUT_PULLUP);
A fenti kód teljesen jó. Inkább ezt az oldalt nézd meg, jobban le van írva. Ha még nem tetted volna meg, akkor a TAVIR féle tanfolyamot érdemes lenne végigolvasnod, abban minden felmerült, és majd felmerülő kérdésedre választ kapsz.
Idézet: „nekem hardveresen nincs felhúzó ellenállás kötve” Miért, milyen hardvered van? Az atmega csipek a tokon belül tartalmazzák a felhúzó ellenállást, azért tudod ki-be kapcsolgatni őket. Vannak helyzetek amik indokolttá tehetik a külső ellenállás használatát, de a tiéd nem az az eset.
Hagyományos Arduino nano-t használok. Amit belinkeltél ott tényleg elég részletes a leírás.
Van 1 sorom
Azt hogy lehet megoldani, hogy a relációs jel utáni 590 érték ne csak 590 legyen hanem 590-től egészen 1023-ig minden szám ?
Ez a sor pontosan azt teszi amit mondasz. Ha a reading értéke kevesebb mint 590, vagy 591, vagy 1000, akkor a bright értéke 255 lesz.
szerk.: vagy pedig nem értem mire gondolsz szerk2.: nem azt szeretnéd, hogy ha reading értéke _nagyobb_ mint 590 akkor maximálja a bright értékét 255-ben? Mert akkor csak annyi, hogy a relációs jelet megfordítod. A hozzászólás módosítva: Okt 3, 2021
Én is erre gondoltam. Pedig valmi hiba van valahol. Akkor tovább keresem
|
Bejelentkezés
Hirdetés |