Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Beszólás helyett!
Inkább legyél tisztába az alapokkal! Ha nem érted a Bináris számokkal végzendő alapműveleteket? Gyorsan pótoljad a lemaradást! Bővebben: Link Binary Numbers Tutorial Bővebben: Link Binary Arithmetic A hozzászólás módosítva: Dec 13, 2016
Pardon, nem tudom mit vettél annak, de semmit nem annak szántam.
Ha mégis úgy érezted, akkor biztos rosszul fogalmaztam...
Sziasztok
Hogy lehet összeállítani byte-ot bemenetekből és jelzőbitekből. Köszi
Legyen pl B 7. bitje a 11. port állásának függvénye:
byte B; if( digitalRead(11) ) B = B | b1000000; else B=B & b01111111; A hozzászólás módosítva: Dec 15, 2016
Ez így ok de ha több bemenetet akarok akkor mindnek új függvényt kell írnom?
pl ha van 3 bemenetem + a millis-nél eltelt 10 sec / ez ad egy jelzőbitet/ ezt kellene egy byte-ba berakni és aztán csak ezt figyeljem és ha változás van akkor vizsgáljam meg hogy hol.
A függvényt nem mint C programozási fogalmat értettem
![]() Elég egy-egy új feltételt (és 2-2 új bitmaszkot) írni az egyes bitek kiértékeléséhez.
Minden egyes jelzőbithez hozzárendelni a kettő egyik hatványát, majd összeadni őket. (max 8-at) Igy kijön egy byte, ha jól értelmezem a problémát.
Azt szeretném hogy a byte első értéke legyen a bemenet értéke (1 vagy 0) a második a bemenet 2 stb plussz a 4 5 6 a jelzőbitek értéke
Így nem lehet hogy
byte=portb1,portb2,portb3,jezbit1,jelzbit2,jelzbit3 Vagy valami hasonló módon?
Ha van a polcon egy C/C++ programozási könyved, lapozd fel a struktúrák, unionok és bitmezők témakörnél.
Létrehozhatsz olyan adattípust, aminek minden bitjéhez egyszerű értékadással közvetlenül hozzáférhetsz, de az egészet is módosíthatod egyben.
Nem biztos, hogy jól értem, de így:?
...és így a többire is.
A hozzászólás módosítva: Dec 16, 2016
Azt hiszem eltévedtem a hozzászólások között!
A választ jany1966-nak szántam: Bővebben: Link kérdésére.
Igazából én is arra válaszoltam. De úgylátszik nem nagyon érdekli a kérdezőt a segítség.
De érdekel a dolog és köszönöm a segítséget. Nem tudom ti hogy vagytok vele de nekem néha dolgozni is kell a /hobbim fedezése miatt is/
Napi 10-12 órát:A bitmezős megoldás jónak tűnik. struct bitmezo { int mezo_1 : 1, mezo_2 : 2; unsigned mezo_3 : 8, mezo_4 : 8; int : 0, mezo_5 : 2; } bm; Egy szóba kerülnek a mezo_1, a mezo_2 és a mezo_3. A mezo_4 már nem fér itt el, ezért új szóban helyezkedik el. A mezo_5 is elférne még ugyanitt, de a 0 szélességû bitmezõ használatával azt egy harmadik szóba kényszerítettük. Példák bitmezõk használatára: bm.mezo_3 = 'X'; bm.mezo_5 = bm.mezo_2; bm.mezo_4 = bm.mezo_1 ? 0 : bm.mezo_3; Ha így össze rakok egy byte-ot akkor azt hogy tudom figyelni? Tehát az lenne a lényeg, hogy a bemenetekből és a jelzőbitekből csinálok egy byte-ot és csak ezt figyelném és ha változás van akkor megvizsgálnám hogy melyik bemeneten vagy jelzőbitnél ha nincs akkor csinálna mást az arduino.
Igazából bármelyik eddig adott megoldás jó. Valakinek vagy valaminek az egyes állapotok függvényében be kell állítani az állapotbyte bitjeit.
Kétféle bitmaszkolgatós megoldás:
Ugyanazt az eredményt adó bitmezős-unionos:
Köszönöm a második megoldás jobban tetszik, vagy számomra érthetőbb.
Azt viszont nem tudtam, hogy így is lehet arduinot programozni, mert minden hol azt írják, hogy egy C-hez hasonlító saját nyelvezete van.
Az más kérdés, hogy melyik megoldás gyorsabb.
Valószínűleg a gyári bitSet/bitClear/bitWrite a leglassabb, mivel univerzális függvény, feltételvizsgálatokkal, ciklusokkal, érvénytelen paraméterek kiszűrésével, a mezei bitmaszkolás pedig a leggyorsabb. Az olvashatóságon lehet javítani a 0x04 és B00000100-félemágikus számok helyett szöveges konstansok használatával. Pl:
A két példaprogram eredménye mégis eltér, mivel fölcseréltem a bitek sorrendjét.
Ez ugyanazt az eredményt adja, csak egyszerűbb:
Egyébként a bitSET, bitClear függvény sem lassú, lemértem, 12millisec ahogy a fenti kódban van használva 4-szer. Ha kihagyom őket, és sima értékadással (allapot=1; ) helyettesítem, akkor is ugyan ennyit mértem. Amúgy nem tudom milyen projekthez kell ez, de gondolom nem egy atomórát fog vezérelni, szóval belefér az a pár nanosec, amíg a függvény lefut.
Ez nem frankó:
Idézet: „lemértem, 12millisec ahogy a fenti kódban van használva 4-szer. Ha kihagyom őket, és sima értékadással (allapot=1; ) helyettesítem, akkor is ugyan ennyit mértem.” Gondolom serial.print-et használtál. A bitclear fv. többszörösen lassabb, mint a sima értékadás, vagy egy bitművelet. 12mS alatt 192000 órajel van 16MHz-en...
Hát igen, lassabb mert több utasítás van a függvényben, de még így sincs egy microsec az ideje. Gondolom azért mértem ugyanannyit.
Egyébként hol találhatóak ezek a bitmanipulálós függvények? Megnézném mit csinálnak.
Köszönöm mindenkinek.
Valóban nincs jelentősége a pontos időnek. Egyébként csatorna mosók vezérlésére kellene, kompresszor, vízszivattyú, hidraulika. Pl ha a vízszivattyút bekapcsolom akkor a víznyomást csak bizonyos idő után lehessen kapcsolni. Viszont ha a tiszta víz tartályban (3-4 ezer liter) a vízszint egy bizonyos szint alá csökken akkor a programban beállított idő után kapcsolja le a vízszivattyút (100-150liter/perc 150-200bar) a szárazon futás elkerülése miatt.
Linuxon: /usr/share/arduino/hardware/arduino/cores/arduino/Arduino.h
Visszavonom a lassúság vádját, ez egészen puritán kódot ad.
7584us alatt fut le. A hozzászólás módosítva: Dec 17, 2016
Én is így mértem a micros(); függvénnyel, csak a hozzászólásomban rosszul írtam. 12 microsec-et akatram írni, nem millisec-et. Akkor viszont nálad nagyon lassan futott le valamiért, a 7584us az sok, nem?
Az a 10000-es for ciklus egészére vonatkozik, unsigned long ciklusváltozó esetén.
Most egy kicsit jobban tisztelem a rendszert, mint előtte
Lemértem megint, most csak a bitClear függvényt. Előbb benne volt a mérésben a digitalRead() is. Úgy volt 12.
Most csak a bitClear, és 4microsec. De a micros fügvénnyel nem lehet lemérni. Így:
és így is:
Mindkét esetben 4 microsec az eredmény. |
Bejelentkezés
Hirdetés |






Napi 10-12 órát: