Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Na léptem egyet, sajnos a cursor többet. Nem tudom miért megy a cursor tovább:
Valami nem stimmel. Kezdetben a displayen 0 van az elsö kockában. Ha megnyomom a gombot az n 3-ra ugrik és egy háromdigites szám jelenik meg, ami kaotikusan változik ha a fehér gombot nyomogatom. Holott semmi oka sincs az n-nek változnia, sehol sincs erre parancs Kösz
A hozzászólás módosítva: Feb 11, 2020
Üdv ismét a hozzáértő csapatnak!
A múltkori, több feltételű elágazás kérdése - Nektek köszönhetően - sikerrel megoldódott, azonban most egy újabb problémám adódott. Az volna a cél, hogy létrehozzak egy (pontosabban több) szubrutint a programban, amelyeket többször meg tud hívni a főprogram. Egy változó értékét kell átadni a függvénynek, amelynek értékétől függően a függvény végrehajt egy feladatot, az egyszerűség kedvéért mondjuk egy kimenetet kell alacsony (LOW) értékre állítani, ha az átadott változó értéke valamilyen értékhatárok között van, ellenkező esetben pedig magasra (HIGH). Akár hogyan próbálom azonban elhelyezni a függvényt, deklarálni a változót, mindig valami hibát ír a fordító. Amit már kiokoskodtam: - A void setup () előtt kell megírni a függvényt. - A változónak globálisnak kell lennie. (Kérdés: hol kell deklarálni? A setupban?) - A meghívás hogyan történik? (A void (függvénynév) nem működik, hibát ad rá.) - A függvény végére egy return; kell. - A függvény hívását a loop ()-ba kell tenni. - A függvény meghívása előtt a loop ()-ban kell a változó értékét módosítani, a kiértékelés viszont a függvényben történik. Minden segítséget örömmel fogadok!
Bővebben: Link
Szerintem ami hiba: - void visszatérésű értékhez nem kell return (attól még lehet, de a hívó ezt nem használja). - a meghívása simán függvénynév(); - a globális változót a saját fv. előtt deklaráld (én a setup előtt szoktam minden globális cuccot deklarálni)
Nem kell a setup() előtt megírnod. Pontosabban mindig az előtt kell megírnod, mielőtt használnád. Ha már a setup-ban használni akarod, akkor kell előtte megírnod, ha nem, akkor ráérsz utána is.
A fv. deklarálása kb. így történik:
Ezt meghívni pedig ugyan úgy, ahogy a többit is meghívnád, azaz
A "void" az csak egy visszatérési érték típus (csak különleges, mert azt mondja, hogy visszatérési érték nélküli fv. következik, s így return se kell a törzsbe), ami lehetne int, char, kiskutyafüle, akármi, meghíváskor már nem kell megint megmondanod. A példaprogramok között nézelődj, hamar meg fogod érteni!
Ez katyvaszos kicsit, és nem is teljes a kód.
Amit látok, hog az LPrint-tel kiíratod a Turn változót, ami 4 digites. Tehát pozícionálsz, kiírsz, a cursor nyilván a végén lesz. És a loop-ban megintcsak írsz dolgokat, nem csak az LPrinttel. És az inputHW-ban is kiíratsz. És a count-ot folyton nullázod a loop-ban. Ha kiírsz valamit, akkor a cursor elmászik a kiírt szöveg végére. Ha máshol kellene villognia, akkor kiíratás után oda kellene visszatenni setCursor-ral.
Azt látom, de ha az n nem változik miért nem az elsö digitet változtatja? Direkt leröviditettem a kodot, és csak az maradt benne ami most nem megy. A Turn az a 4 digites szám, de viszont az n az egész kodban nem változik azaz a nulladik helyen kellene a számnak változnia, de változik bárhol a 4 helyen és az n az elsö változás után 3-ra ugrik.
A gondom azt, hogy régebben ASM-ben irtam a kodokat és azok a mai napig müködnek az Arduino nyelvét meg csak tanulgatom. A fenti kodban csak az lenne a feladat, hogy az elsö száma változzon a 4 digites számnak. ( utánna lenne a kod másik része hogy a 2., 3. meg a 4. helyre ugorjon a cursor és ott ismétlödjön a történet - akár egy kofferzár vagy lakat). . De most még az elsö szám sem akar ugy változni. Na megyek még egy kicsit veszödni, egy szám változása megy, de ez a 4 számjegyü kiirás valami zürt visz a dologba, de nem tudom hol és miért. A hozzászólás módosítva: Feb 11, 2020
Négy számjegyű számot bevinni nyomógombbal ... na ne!!! Ilyenkor szoktam elővenni a Nextiont!
Pontosan ezért akarom ugy megirni, hogy a nyomogombbal egyenként viszem be a számokat az ezrest, a százast a tizest meg az egyeseket. Ezért kell csak 0-9-ig számolni. S ha benn a 4 számjegy akkor a Turn változtatja a 4, addig önállo számjegyet egy valos számmá 0-9999ig. Ezt eddig is igy csináltam, mert igy a legegyszerübb. Ezzel nincs semmi gond. Azért kell, hogy a cursor az egyes számjegyek helyén maradjon addig amig nem léptetem a következöre.
Azon az egy 4 jegyü számon kivül még van 3 darab 2 jegyü is...... A hozzászólás módosítva: Feb 11, 2020
Lehet, hogy nálam nem kerek valami (Linux), de teljesen mindegy, hogy előtte, vagy utána írom meg. Ha mindent a loop után írok, akkor is ugyanaz, mint ha előtte.
Sok programnyelvnél teljesen mindegy hol írod meg. Vannak azonban olyanok, amik háklisak rá, hogyha nem találják meg azelőtt a deklarációt, mielőtt használnád (pl. .Net esetében a PowerShell se szereti). Úgy emlékeztem az Arduino is ilyen (amennyi féle programnyelvvel eddig foglalkoztam, nem is csoda, ha megkopnak az ilyen emlékek). Most gyorsan kipróbáltam, az 1.8.10-es verziójú Arduino környezet se foglalkozik vele és mehet bárhova, igazad van.
Lehet, hogy ez egy rossz beidegződés (nálam), de én megszoktam, hogy inkább előbb legyenek, így kevesebb gondom van a nyelvek közti váltogatáskor
Szia, az inputWH() függvényedben lévő változóid deklarálatlanok.
count értéke memóriaszemét, mert egy függvény nem látja a rajta kívül létrehozott változókat (hacsak nem globálisak). Keress rá a variable scope fogalomra.
Szia. Szerintem használd a setCursor függvényt kiírás után. Pl. így
Ezt I2C LCD -hez írtam, sima LiquidCrystal könyvtártól csak a példányosítás és az inicializálás külömbözik.
Kösz, én is I2C displayjel dolgozok. Ki fogom probálni, de nem akartam automatikusan a poziciot változtatni, hanem erre van két másik gomb (jobbra balra), hogy bármikor bármelyik számjegyet ujra tudjam irni. Egyelöre, az zavar, hogy nem marad azon a pozicion ahol kellene. Megprobalom kivenni az átalakito sort ( Turn=count*1000, mert valoszinü az zavar.
Csak vedd ki belöle for ciklusokat és a gombnyomásokkal változtasd a pozicio és szam változók értékeit és meg is van
Pontosan ez történt kivettem a ciklusokat és már megy a bevitel. Érdekes, hogy a lcd.blink() meg az lcd.cursor() is eltolja a poziciot. A második sor elsö poziciojába nem tudok beirni semmit ha elöbb bekapcsolom a fenti funkciot. Nélkülük minden müködik.
Most még azon filozok hogyan csináljak a 4 számjegyböl egy számot. Ha berakom a loopba az összeszámolást, akkor az ezresek mennek, de a százasok stb. már elkezdenek felszámolodni ( azaz minden ciklus egy százassal többet ad) valahogy ki kell venni a ciklusbol, hogy csak egyszer számoljon.
Az nem megoldás hogy a kurzor pozíciójától függően 1000, 100, 10, 1-et adsz hozzá a változóhoz és azt iratod ki egyből?
Az is megoldás lehet, én úgy oldanám meg hogy az egészet egy funkcióba tenném amiben a byte tömböt egy for ciklussal bejárnák visszafelé és hatványoznám. Lehet hogy leírom a kódot, egyszerübb számomra mint a fogalmazás
Az menne, csak a cursor nem marad a helyén ha pl a 0.1 pozicioba kiirok egy 2000, akkor már nem tudok 2100-t bevinni, mert ott a konfliktus. Szoval a 4 jegyü számot nem gond most már odairni a displayre, csak az nem szám, hanem 4 karakter. Ha menet közben alakitom át akkor meg minden ciklus az elsö számjegyen kivül hozzáadodik az elözöhöz, holott csak egyszer kellene. Na ezen még gondolkodnom kell ( azt hittem egyszerübb lesz, az ASM-ben is egy kis szenvedés volt).
Talán külön nevet fogod adni a ezreseknek a százasoknak a tizeseknek meg az egyeseknek és a végén összeadom. Na megyek vissza a géphez...
Így valahogy.
Így szerintem egyszerübb késöbb változtatni ha pl 5 digitest szeretne vagy nagyobbat(persze a változó túlcsordulásra figyelni kell abban az esetben), a SZAMHOSSZ -t kell növelni, csökkenteni
A számolás már müködik, kivettem a ciklusbol. A cursor még nem ugy, ahogy kellene a karakter helye mellett villog vagy az van aláhuzva. Nem tudom miért.
Én ugy csináltam hogy az egyes helyeket megjelöltem:
Ezresek: Turnt=count*1000; Szazasok: Turnh=count*100; Tizesek: Turnd=count*10; Egyesek: Turnu=count; A végleges szám: Turn=Turnt+Turnh+Turnd+Turnu; Majd Lcd.setCursor(0,1); Lcd.print(Turn); Ez igy most müködik. Csak még nem jelzi ki hol van a cursor.
A kurzort minden kiírás után állítsd vissza a megfelelő pozícióba. 4 gombod van(fel, le, jobbra balra)? Ha gondolod, megírom hogy én hogyan csinálnám. Legjobb mindent függvényekbe szétszedni akkor átláthatóbb marad a kód és az lcd-re írást csak akkor végezni el ha változás történt egyébként a sokszori kiírás végett lehet hogy nem látszódik a kurzor.
pl.
A hozzászólás módosítva: Feb 12, 2020
Kösz már kezdek belejönni, mint kiskutya az ugatásba. Már minden adatot be tudok vinni és meg is jeleniteni immár szám formájában a displayen.
Már csak a kijelzés ( villogás) a gond. Azt még nem tudom oda vinni ahova a számot kellene beirni. Mindig eggyel mellette villog. Na ezen még elgondolkodok. A helyeket egy arrayjel kezelem igy most már az adatbevitel tökéletesen megy. Most még egy kicsit meg kell fésülni a kodot, hogy jol nézzen ki. Azután majd folytatom, de még kell épiteni egy szenzort a fordulatszám kezelésére. Ahogy a képen látod 5 gombom van. Balra Fel Jobbra Enter és Start/Stop ( LE nincs, azaz csak felfelé számolom a gombnyomást. Nagyon szépen köszönöm, hogy foglalkozol velem!
Persze a delayt ki lehet hagyni, csak a prell végett tettem bele, és a végén amikor egy entert nyomsz akkor az egyesit() függvénnyel létrehozol egy integer számot amit arra használsz amire szeretnéd.
Módosítottam a hozzászólásomban lévő kódot(setup fügv. for ciklus alatt)mivel elfelejtettem értéket hozzárendelni a szám tömb elemeihez ami esetleges gondokat okozhat(kapkodás)
Szivesen . Jól néz ki, tekercselögéphez lessz? Villogás az valószínü a gyors egymásutáni lcd-re írás végett történhet. Fontos hogy feleslegesen ne írd ugyanazokat az adatokat az lcd-re csak ha ténylegesen változott valamely érték.Ezt én egy flag változóval oldom meg mint a fenti kódomban
Igen az lesz. Igy néz ki, csak még a kulisszát kell megcsinálni a menetek számolására.
Tekercselö A hozzászólás módosítva: Feb 12, 2020
Én csináltam anno karakteres LCD drivert, ami 1-2 milliszekundumonként 1-1 karaktert ír ki a kijelzőre (időzítő megszakításból). Semmi villogás nem tapasztalható. A programban csak egy kijelző karakterszámával megegyező méretű karaktertömbbe (hívhatjuk frame buffernek is) kell írni a megjelenítendő tartalmat, a háttérben teljesen független módon folyamatosan megy a kijelző tartalmának a frissítése. Villogó karaktereket is meg tud jeleníteni. Sajnos arduino változatot nem csináltam, csak natív atmega C és PIC változat készült belőle.
Nekem nem a villogással van baj, hanem azzal, hogy a két gombbal jobbra balra lépkedek és azt kellene kijelezni ( ahogy azt megcsináltam ASM-ben). Az Arduinoban meg mindig eggyel mellette villog azaz nem ott ahol változtatom a karaktert hanem mellette. Sajnos sem az lcd.blink_on()-nak sem az lcd.blink()-nak, sem az lcd.cursor()-nak nincs paramétere (legalábbis nem fogad el semmit), azaz nem tudom beirni, hogy villogjon pl a 8,1 kocka.
Na de pillanatnyilag mindegy, majd lehet, hogy még valami eszembe jut. Amugy szépen müködik. Most azon filozok ( a tárcsagyártás szünetében egy kávé mellett, hogy hogyan zárjam le a display kezelését, mert most a gombokkal a szálvezetö motort kell a kezdö menetre mozgatni. Valoszinü ehhez valami statemachine-t fogok bevezetni. Annak 3 fejezete lesz: 1. display 2. a kezdet beállitása 3. A tekercselés. De azt majd késöbb, addig utánna kell nézni egy korábbi programban azt hogyan csináltam.... A hozzászólás módosítva: Feb 12, 2020
|
Bejelentkezés
Hirdetés |