Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Köszi, jövő héten megnézem (attól függ mikor, hogy mennyire lesznek fárasztó napjaim).
A polaritásváltáshoz sikerült megírnom valami kódfélét, bár szerintem ez elég igénytelen lett, de a célnak megfelel:
in_relay* az NC7SZ19 egyik bemenete, a reset_relay* a másik. Így az NC7SZ19 forgatja a polaritást amikor vált, amikor nyugalomban van akkor pedig nincs potenciálkülönbség a két kimenete közt. Ha nagyon nagy sületlenséget csináltam itt, akkor írjátok meg kérlek A hozzászólás módosítva: Jún 26, 2022
Üdv!
Az volna a kérdésem, hogy hogyan lehet az, a setup egymás után lefuttatja a kiadott digitalwrite-okat amiből arra következtettem, a mikrovezérlő sorról sorra haladva hajtja végre az utasításokat viszont van egy if, ami sehogy sem akar végrehajtódni időben?
Erről a részről van szó: if (vset != vset_in) {vset == vset_in;} Értéket a gombbal adok neki. Ha a vmod értéke mondjuk 0 és a vset értéke is 0, majd vmod értéke 2-nél vset értékét átírom 0-ról 1-re, akkor ha visszalépek a vmod-dal 0-ra, szeretném ha a vset visszaállna szintén 0-ra, azaz arra, amin akkor volt, mikor legutóbb a vmod 0 volt. A hozzászólás módosítva: Jún 30, 2022
Mert az értékadás (=) helyett értékvizsgálat van (==), ami végrehajtódik, de annak nincs látszatja itt.
Amúgy a vset értéke mikor lesz kiinduló null? A loop előtt nullázva van?
eeprom-ból fogja kiolvasni. Legelső alkalommal majd beállítom, aztán mindig az előző.
Köszi a tippet, nagyon sügér vagyok, még keverem a kettőt... Visszatérve, hogy mikor lesz nulla. Igazából nem kell, hogy nulla legyen kiinduláskor sem, mindig arra kell beállnia, amire legutóbb be volt állítva. Kivéve az első indulásakor a mikrovezérlő eeprom-ból nem tudom mit fog olvasni, mert abban nem lesz semmi, azaz nem definiált tatalom lesz. A hozzászólás módosítva: Jún 30, 2022
De most már talán kevésbé kutyulódik eztán.
Sajna így nem működik, valamiért nem a vset-et írja nullára (az előző példánál maradva) hanem a vset_in-t írja inkább át 1-re amit nem igazán értek miért. Már második napja ülök rajta és nem esik le.
A hozzászólás módosítva: Jún 30, 2022
Én a vset_in -re egy értékadást láttam, az jóval utána van, ahol nullázva lett (71.sor).
A problémás sorban az történik, ha különböző a vset és a vset_in, akkor a vset_in bemásolódik vset-be. De előtte lehet a vset_in 1 is és a vset 0,2,3...stb, tehát a vset 1 lesz, és nem a vset_in -be íródik 1, hanem abban már benne van. De hol is van előbb állítva? Van inicializálás, vagy csak memóriaszemét van benne? És mire van használva a vset_in? Sehol máshol nincs az értéke változtatva, csak a 71. sorban.
Bemásoltam a vonatkozó setup részeket. Tehát a 71-edik sorban ha vmod=0 és vset is 0 akkor vset_in is nulla ami lényegében a vmod 0-ban beállított vset értéket örökítené meg. Amikor vmod=2 és vset=1 akkor még nem kell örökíteni, mert majd ha vmod=0-ban működik, akkor ide is megcsinálom ezt. De vset =1(*). Aztán vmod=0 ismét (a loop elején a gombnyomásfigyelésnél ezt a gombnyomás és annak hatására a v++ okkozza) ekkor a switch belép a case 0-ba és végrehajtja ami ott van, digitalWrite-ok, meg az if feltétele ha teljesül, akkor azt. Mivel előzőleg vset már 1 volt, vset_in pedig 0, úgy gondolom le kéne futnia annak, hogy a vset_in értékét beírja a vset-be. Ekkor azt várnám, hogy a loop másik felében a vset-nél lévő switch a case 1(*) helyett a case 0-ba lép be, mivel azt a korábbi if (vset != vset_in) {vset == vset_in;} vezérlő struktúra a teljesült feltétel alapján átírta 0-ra. Ehelyett a vset_in íródik át 1-re. Bemásoljam egybe az egész programizét? Úgy egyszerűbb lenne? A hozzászólás módosítva: Jún 30, 2022
Itt egyenlővé válik a két érték - emiatt már le se fut az if utáni feltételes ág -, de hogy a vset_in mikor 0? Miután a programban egy helyen ki lett nullázva, de később. Ha már 1, akkor az is marad. Ugyanis van egy vset++, ami ha nulla is volt egyszer valamikor a vset, utána tuti 1 lesz. És ha vset 1, és a vset_in is 1, már nem fut le a kérdéses if.
Itt egyenlővé válik a két érték - emiatt már le se fut az if utáni feltételes ág Persze, indítás után még ne vacakoljon ezzel, mert úgyis oda áll be, ahol kikapcsoláskor azaz az eepromban volt. Utánna viszont a vset is és a vmod is felvehet 0,1,2 értékeket (mást nem) és kedvemre állíthatom őket egymáshoz képest. Amit szeretnék, hogy ha a az 0,1 vagy 2 vmod-ot egyszer már beállítottam és ujra rálépek az adott értékűre, akkor a vset álljon vissza arra amin előzőleg volt.
de hogy a vset_in mikor 0? Miután a programban egy helyen ki lett nullázva, de később. Ha már 1, akkor az is marad. arra gondolok, hogy a készülék indításakor még a vset_in a vset értékre áll be, nem kell belépni az if-be. De ha valamikor a vset-nek adok más értéket (például 0 ból lesz 1) a vmod 0 címen akkor a kód végi if-ek írni fogják az adott feltételnek megfelelően a vset_in-t (
és a vset_in értékére kellene írnia a vset-et, nem? Ha már 1, akkor az is marad. Ugyanis van egy vset++, ami ha nulla is volt egyszer valamikor a vset, utána tuti 1 lesz. v++ csak akkor lesz ha gombnyomás történik, switch viszont minden alkalommal amikor változik a vmod vagy vset értéke, lefut. Fáradok, bocsi, közben javítottam a leírást. A hozzászólás módosítva: Jún 30, 2022
Kommenteket a kódban nem javítottam, azt ne nézd.
Hajjaj...
vset++; //növelje vset változó értékét eggyel, kiindulóérték null Mitől null? Induláskor eepromból olvasva, és ha ott nem nulla? Aztán: if (vmod == 0 && vset == 0) { //ha mode=0 akkor set=0-nél kapcsolja az in relé 1-t vset_in = 0; Mi biztosítja, hogy a vmod és a vset egyszerre legyen nulla? Ha valamelyik nem az, akkor a vset_in sose nullázódik, tehát ha 1 van benne, az is marad. Ha az a vset++ épp egyre áll be, akkor az az if ott a rossz értékadással már nem fut le. Lehet, hogy előbb egy folyamatábrát kéne rajzolni (Jackson-ábra), hogy átlátható legyen a program és az adott folyamat csak ott és úgy történjen meg, ahol épp kell.
Mitől null? Induláskor eepromból olvasva, és ha ott nem nulla? igen, itt a komment hibásan maradt. Igazából mindegy, hogy 0,1 vagy 2 az érték, a lényeg, hogy növelje. Az pedig biztos, hogy ezek közül (0,1,2) lesz valamelyik. Mondjuk amikor fel lesz programozva, akkor lehet még érdekes ez, hogy akkor mire áll be, de megírhatom hozzá, hogy ha nem 0,1 vagy 2 az érték, akkor legyen mondjuk 0. Akkor ez meg lenne.
Mondjuk a setupba megírom ezt:
Na nem ilyen egyszerűen, de mindjárt kitalálom, mert így igen csak nem jó Mi biztosítja, hogy a vmod és a vset egyszerre legyen nulla? Ha valamelyik nem az, akkor a vset_in sose nullázódik, tehát ha 1 van benne, az is marad. Ha az a vset++ épp egyre áll be, akkor az az if ott a rossz értékadással már nem fut le. a nyomógombok kombinációja. Két nyomógomb van, egyik a vset másik a vmod. Amikor a nyomógombokkal kiválasztom a 0 és 0 értékeket, akkor a feltétel teljesül. A hozzászólás módosítva: Jún 30, 2022
Idézet: „Na nem ilyen egyszerűen, de mindjárt kitalálom, mert így igen csak nem jó ” Hát nagyon nem Eleve seupban értékvizsgálat, mikor van eeprom? Az eepromot a felprogramozáskor kell a kezdőértékkel betölteni, mert utána az eszköz úgyis módosítgatja. És ezt figyelembe véve írni a programot. De mi volna a program célja? Azért mondom a Jackson-ábrát, mert nem kódot kéne írni először, hanem algoritmizálni. Utána már egyszerűbb leprogramozni, ha már látszik, hogy pl. ezek a változók miként kell, hogy értéket váltsanak.
Ez egy be és kimenetválasztós előerősítő lenne majd.
vmod kiválasztja, hogy be vagy kimenet vset a be vagy kimeneten belül kiválasztja, hogy melyik (0,1,2 ami pl be esetén hasamraütök, TV, CD, PC). nem szeretném, hogy elfelejtse a beállított értékeket kikapcsolás után, mivel nem szeretnék minden bekapcsolást azzal kezdeni, hogy beállítom a be és kimeneteket amiket épp használnék - ezért az eepromos huncutság. Illetve amikor beállítom a bemenetet, majd a kimenetet, aztán mégis visszaléptetem a mod-dal a bemeneti választásra, akkor a visszajelző LED (digitalwrite-ok a switch-ben) a bemenet aktuális allapotát jelezze, ne pedig maradjon ott, ahova a kimenetkor állítottam. Eleve seupban értékvizsgálat, mikor van eeprom? Ezzel egyébként mi a gond? Csak hogy ne kövessek el ilyet máskor. A hozzászólás módosítva: Jún 30, 2022
Most jut eszembe, szerintem a switch-ben megadott default-tal kivédtem a 0,1,2-től eltérő értékeket a változóban. Az első, felprogramozás utáni kiolvasás az eepromból lehetne egy nem meghatározott érték, de a változó típusa byte, 0-255 lehet az érték ami belekerül, de ez csak az első gombnyomásig fordulhatna elő. Sőt, ha belép minden alkalommal a switch-be, akkor még gombnyomás sem kell.
A hozzászólás módosítva: Jún 30, 2022
Sziasztok.
Most már működni kezd a dolog. A beállított kombinációkat elmenti. De ha valaki nagyon kedves lenne és nem fáradtság, ha lát benne hibát amit mindenképp javítani kellene, tegye meg legyen kedves és jelez felém. Előre is köszönöm az építő jellegű kritikákat. Ez az első barbárkodásom eddig programozás terén.
Két dolog még akadt. A millis() függvényt nem bírom működésre sehogy sem. A másik, hogy amikor a kódban a vmod változót léptetem, 0-ról 1-re és 1-ről 2-re gond nélkül együtt váltja a vset-hez és vmod-hoz tartozó kiemeneteket (set_LEDeket), de a vmod 2-ről 0-ra észrevenni kicsi késleltetést a set_LED és mod_LEDek közt. Ennek mi lehet az oka? A hozzászólás módosítva: Júl 2, 2022
A millisnél meg kell adni a függvénynek, hogy hány milliszekundumot késleltessen, paraméter nélkül honnan tudná?
A nullázások más-más programhelyen történnek, közben delay hegyek vannak és feltételvizsgálatok. Milyen összefüggés van a változók állapotának változásában? Muszáj mindegyiket külön vizsgálni, vagy a vmod nullázása húzhatja maga után a vset nullázását? Mert akkor egy feltételi ágba lehet tenni a kettőt (101. sor). Hirtelen ránézve ezt látom.
Amúgy mi lesz a cél, mit kell csinálnia az áramkörnek? Azt olvastam hogy valami be-kimenet kiválasztó, de kicsit részletesebben. Mert csak faragjuk a biteket, de mikor tudjuk, hogy már jó? És mi az a minimum, amivel megy, mert kissé redundánsnak érzem a kódot.
Mik az egyes gombok és ledek, relék funkciója? A hozzászólás módosítva: Júl 2, 2022
Lehet nem is kellene külön külön piros meg zöld ledek.
Lehet elég lenne 1 darab duál led piros/zöld . A relék tekercseinek a vezérlő bitjei közé kötve, mikor melyik alacsony/magas aszerint világítana adott színnel.Persze a "vasat" nem ismerve lehet elvetélt ötlet.
Kevered a delay() függvénnyel. A millis() az indulás óta eltelt időt adja vissza ms-ban, és nincs paramétere.
Szerintem akkor lehetne megállapítani, hogy jól működik-e, ha tudnám, hogy mit kéne csinálnia. De így, hogy nem tudom, ez a kód hibátlan
Az nem biztos ,hogy jó mert ha kétszínű ledet használ, és ha mindkét szín egyszerre kapcsol, akkor sárga lesz .
Hogy sárga legyen akkor 2 kivezetéses duál led Zöld/Piros nek a lábain portokat felváltva kellene billegtetni gyorsan szem tehetetlenségénél gyorsabban.
pl.: dual led szembekötve piros zöld A hozzászólás módosítva: Júl 2, 2022
Bővebben: Link
Ide leírtam, de ha ez nem elég, akkor tudnom kellene, mit és hogyan fogalmazzak meg neked, hogy világos legyen. Lényegében ebből a gondolatból indult ki a dolog. Ami még kellhet hozzá, hogy set-reset relékkel működtetem a kapcsolást, a kód végén az if-ek ezt a polaritásforgatást hivatottak megvalósítani. Mivel működik, inkább csak az érdekel, van-e ami nem etikus, helyes, vagy problémát okozhat esetleg kódolás szempontokat figyelembe véve. Például olvastam olyat Bővebben: Link, hogy egymás alá lehet pakolni több if vezérlőt, de a másodiktól kezdve mind legyen else if, mert if-ből csak egyet szabad. Ennek ellenére a kód nálam így is működik. Ha nem tudom miért nem szabad, azaz nem értem meg a miértjét, akkor elég nehéz a helyes úton maradni. Ha inkább csak zavaró a jelenlétem, vagy a kérdéseim azt is elfogadom (persze jó ha értesülök róla, hogy nem kívánt a jelenlét ebben a formában) de akkor jó lenne tudni miért jött létre ez a topik. Arra a kérdésre, hogy miért nem működik a millis() sem kaptam világos választ, ami most nem számonkérés, inkább csak nem értem, hogy nem kapok egyértelmű információkat, mondván: jöjjön rá magától, vagy csak másnak sincs ötlete. A hozzászólás módosítva: Júl 2, 2022
Akkor jó, ha:
Két darab nyomógombbal a) vezérel 12db set-reset DPDT relét,ezen belül tartalmaz: -2*3db bemenetválasztót, melyekből 1 bemenetre 1 relé jut, a nem aktív állapotban majd GND-re lesz téve a nem aktív bemenet -2*2db kimenet választó relét, melyeknél egy relével oldom meg a két kimenet választását -2*2db schematic választást (lenne egy ilyen meg egy olyan panel beépítve, de ez még nem biztos) aminél a kapcsolás be és kimenetét is leválasztanám 1-1 relével b) és vezérel 2*3db kapcsolási állapot visszajelző LED-et. 1) Bekapcsolás után visszaállítja a kikapcsoláskori állapotot mind a be,ki és schematik módokban 2) Mód választáskor ha a be módról a ki módra lépek és azt állítom, majd visszalépek a be módra, akkor a visszajelzés álljon vissza, tehát őrizze meg az állapotát. 3) Természetesen ha módválasztóval lelépek a be módról, az őrizze meg az aktuális állapotát 4) Az egyik gomb léptesse az mód választást, a másik a kiválasztott módon belül az aktuális ki, be menetet vagy a schematikot. Ezért elég 6 LED a visszajelzésre.
Sokkal többre mennénk ha lerajzoldád a vezérlés kapcsolási rajzát ( nem a relé kontaktusait) ugy attekinthetöbb lenne mit es hogyan akarsz megoldani.
Akkor még kérdés: az áramkör mindig 1-1 csatlakozót párosít, mint bemenet-kimenet? Mert ugye két kimenetet nem illik csak úgy összekötni... van, hogy kijön a működtető füst.
Azaz a doboz egyik felén vannak a bemenetek, amik közül kiválasztható az aktív, és ugyanez a másik oldalon is, mint kimenet. Tehát mi küldjön jelet mire. Jól látom? És ezen felül lehetséges még egy áramköri lap, amit ugyanígy hozzá lehet rendelni a csatlakozókhoz, leválasztva a másikat. Es persze majd mindent jegyezzen meg a vezérlő, lapváltáskor is legyen mindjárt az utolsó beálítás az aktív konfig. (A progi még nem tartalmazza) |
Bejelentkezés
Hirdetés |