Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Nem baj ha leírod, én könybben megértem, ha leírod és kommenteled.
![]() Ahogy nézem ez, ha vége a void loopnak, akkor megint kér egy gombnyomást. Nekem pedig a loop pörögne úgymond a végtelenségig. (Egy motort kell meghajtanom, x fordulatot forog, ha forgott lekapcsol, majd Y idő letelte után megint forod, lekapcsol.... A gombbal indulna az egész, és egy hosszú megnyomással pedig leállna)
Ne csak nézd, hanem kísérletezzél is!
Próbálgasd variálni a számokat, és értsd is, meg ami történik. Most gombnyomással tudod be/ki kapcsolni a led villogtatást. Annak a helyére kel raknod a motor forgatás részt. Azt hiszem, az már megy? Csak a forgatásnál is lepesHosszTime = millis(); időzítéssel kel megoldani a várakozást. Hogy ne álljon meg a program a delay-ban. Mert akkor nem érzékeli a gomb nyomást a programod. (Próbálkozzál! És ha nem megy? Megmutatod, és segítünk.) A hozzászólás módosítva: Jan 14, 2019
Kicsit átszerveztem a gomb kezelést:
Azt hiszem így jobb lessz!
Próbáltam, bekapcsolás OK, de kiakpcsolni az eredeti kód vagy kikapcsol, de általában nem.
![]() Ha beleintegrálom a sajátomba, akkor sem jó, mert bekapcsoláskor egyszer lefut, és vége. De az én else ágamba sem megy bele, nem villogtatja a LED-et, és nem kezdi elöről a ciklust. Ennek az a müködése gomb nélkül: - Motor megy x fordulatot - Motor nem megy, LED villog bizonyos ideig - Motor megy x fordulatot - Motor nem megy, LED villog bizonyos ideig -.... A gombal: - Gomb röviden megnyom elindul a motor - Motor megy x fordulatot - Motor nem megy, LED villog bizonyos ideig - Motor megy x fordulatot - Motor nem megy, LED villog bizonyos ideig -.... - gomb megnyom a motor leáll, LED kikapcsol - Gomb röviden megnyom elindul a motor - Motor megy x fordulatot - Motor nem megy, LED villog bizonyos ideig - Motor megy x fordulatot - Motor nem megy, LED villog bizonyos ideig -....
Eddig tart a gomb lekezelése, A többi dolgokat tedd külön blokkba. És az itt használd, változókat ne használd máshól. Találj ki más neveket, ha még szükséges késleletetés. A 186. sortól nem kel ugyanezt megismételned. A többi részt nem néztem! Először talán a LED villogás be/ki kapcsolás müködjőn neked.
A hozzászólás módosítva: Jan 14, 2019
A zárójele a 193-as sorba tettem, akkor egyszer bekapcsol, de egy motorforgás után ki is kapcsol. Ha oda teszem a zárójelet, ahova írtad, akkor nem csinál semmit sem, alapból világít a LED, és olyan, mintha a gomb nyomás érzékelés nem is lenne.
Ilyen hosszú várakozások tilosak a programban!: delay(2000); //pause
És van erre készen lib: Stepper Control Bővebben: Link A hozzászólás módosítva: Jan 14, 2019
Helló!
Ismét belefutottam az Arduino rejtélyes megoldásaiba! Van egy unsigned char tömböm, feltöltöttem for ciklussal ' '-zel, vagyis szóközzel (32-es dec érték). Ha ki szeretném soros porton a tömböt iratni, ugyanígy for ciklussal, akkor, ha ezt használom: Serial.print((unsigned char)lcd_tomb[i]); - 32-t ír ki a soros monitorra, ha ezt: Serial.print((signed char)lcd_tomb[i]); - úgyszintén 32-t ír ki, viszont, ha ezt: Serial.print((char)lcd_tomb[i]); - akkor szóközöket! A probléma az LCD-m feltöltésénél is előjött, az lcd.print()-nél. A char a C szabályai szerint alapértelmezetten signed char, tehát nem értem, miért különbözteti meg a környezet a char-t és a signed char-t. Valaki ki tudná esetleg fejteni? Köszönöm.
A várakozás a LED villogás/ motor ciklusok közti idő. Akor hogyan kellene várakoznom, illetve a LED-et villogtatni abban az esetben? Amúgy ez jól működik, csak a gomb nyomásos kapcsolás nem.
A programot külön egyedülállóan is lefutattam, bekapcsolás OK, de a kikapcsolás néha működik, de inkább szinte nem. Szóval abba a programba kellene a gombbal való be/kikapcsolást betenni. Nem lehetséges, hogy inkább a LOOP-on kívűl kellene, de hogyan eltárolni az állapotot? És onnan meghívni? Nem értek hozzá, csak találgatok.
Sajnos az egész megoldásod triviális, nehezen lehet eldönteni kinél meddig tart a rövid vagy hosszúnak nevezet gombnyomás?
És ezt még tetézi, hogy közben mást is kel csinálni a programnak. És azzal is szétcsúszik az egész időzítés. (Pláne ha még telerakod bizonytalan számú hosszú delayokal a programodat!) Jobban járnál, ha megszakítással kezelnéd a gombot. Akkor csinálhatsz közben bármit. Delay közben is bejön a megszakítás. Különben az egész léptetés rendszeredet nem értem! Ezt nem így szoktuk megoldani.
Akkor hogyan lehet megoldani? Nme szoktam bonyorult dolgokat csinálni, ez így működik, de értem, hogy ez miatt meg más nem fog működni. Hogyan kellene?
Már írtam. Vagy interrupt, vagy csinálsz valami saját delay-szerű függvényt, amiben a millis()-t figyeled és közben folyamatosan figyeled a bemenetedet, és ha kell akkor teszed amit kell.
A 2 vagy 3 pinre kötheted a gombodat.
attachInterrupt() Bővebben: Link
A tömbben mindenképpen 1 byte van minden esetben de a print utasításkor változik minden. Az unsigned char-nál és a signed char esetén lehet, hogy a soros kommunikációkor karakterenként küldi a számot, míg a sima char-nál az adott számhoz rendelt ASCII-t küldi. Pontosabban a sima Char-nál csak a byte értékét, míg a többinél szerintem átalakítja a számot karaktersorozattá és azt küldi. A példádnál a 32-t elküldi elsőként a 3-as ASCII kódjával ASCII (51), utána meg a 2-s ASCII(50) kódját küldi.
De ez csak tipp, lehet tévedek. Ezt a serial.print()-ben kellene megnézni, hogy az pontosan mit is csinál.
Vagy így is lehetne:
A hozzászólás módosítva: Jan 14, 2019
Nekem az interrupt illetve a saját függvény kínai, hogy azt hogyan kell.
![]()
Pedig elvileg a char és a signed char ugyan az lenne, engem ez kavar meg... Mindegy, van ennél nagyobb problémám is, hátha valaki foglalkozott már vele:
Szeretném korrekt módon megoldani az ékezetes betűk kiíratását 1602-es LCD-re. Van egy progmem-mel tárolt szövegem, szeretném, ha ez már tartalmazná az ékezeteket is. Visszaírom soros portra a tárolt szöveget, tökéletesen, ékezettel jelenik meg. Szeretném ezt a szöveget karakterenként áthajtani egy függvényen, ami kiszűri a 128-nál magasabb kódú betűket, vagyis azokat a karaktereket, amik 2 byte-on vannak tárolva. Több kérdés felmerült bennem. Az AVR program memóriájában is 2byte-on kell tárolódjon. Az összes függvényem unsigned char vagy signed char vagy sima char-t használ, és mégis megjelenik az LCD kijelzőn a két speciális (hibás) karakter, amikor ékezetes betűt íratok ki. Ilyenkor a char temp változómnak el kell tudnia tárolnia a 2 byte-ot. Felülírja a következő RAM részt is, így 2byte-on tárol? Tehát akár hibás programfutást is előidézhet? Mivel 2byte-ot foglal el az ékezetes betű, nem tudom egyszerűen: if (temp=='á') levizsgálni, de if (temp=="á") se működik. Pedig ha ez működne, már azonnal elő tudnám venni a spécileg legyártott karaktert, írnám is ki az LCD-re a gyönyörű á-t. De nem tudom sehogy kiszűrni az ékezetes karaktert a programban... Próbáltam már egy két elemű char temp[2]-nek a 0. elemére betuszakolni az á betűt, hogy majd szépen átlóg a temp[1]-be is, így felbontódna két byte-ra, én meg egyszerre két egymás után jövő karaktert is tudok ellenőrizni, de nem akar működni. Nem szeretnék olyan szövegeket látni a kódban, hogy char temp[]="Mer""/0xfe"t"/0xb1"si";. Én szeretném, hogy bármit beírhassak: char temp[]="Merítési";, majd a fv. feldolgozza. Lehetséges ez? Legyetek szívesek, mutassatok irányt. Köszönöm.
Az interruptot mos írta le kapu48 fórumtárs.
A saját függvény pedig kb. annak mintájéra mehet, amit írtam:
Ezt ha meghívod mondjuk 2000 msec-kel, akkor true-t ad vissza ha simán lefutott és senki se nyomkodta a gonbot, és false-t ad vissza gombnyomásra. Ezt nyilván le kell kezelni. Lehet olyat is csinálni, hogy annyi msec-et ad vissza, ami hátra volt még gombnyomáskor, stb.
Motor forgatás lecke: 17. LECKE/ STEPPER (LÉPTETŐ) MOTOR
Bővebben: Link
Köszi. Olvasgatom. Eddig nem nagyon vitt előre. Valamiért nálam 2 byte egy ékezetes betű. Az LCD-n is két furcsa karakter jelenik meg egy lcd.print("á") után, és a soros porton is két karakter jön át ékezetenként, ha az ékezetes szöveget tartalmazö tömböt kiiratom. Ha megszámoltatom az strlen() fv-nyel a tömb hosszát, az ékezetes betűket mindig kettőnek számolja. Ez a bajom.
A gondot az okozza, hogy az operációs rendszer Unicode karakterkódolást használ, ami a szabványos ASCII karaktereket 1 byteon tárolja 0..127 kódokkal, az egyéb nemzeti karaktereket pedig több byteon. Ezek közül az első értéke 127-nél nagyobb, innen tudja, hogy nem szolgai módon tovább kell küldeni a karakterkódot, hanem kezelni kell.
A kijelződ viszont minden karaktert 1 byteon tárol. Kell írnod egy függvényt, ami az Arduino forrásban tárolt szövegedet kiíratás előtt átnézi, az ASCII karaktereket simán átengedi, a több byteos nem ASCII-kat pedig táblázatból kikeresi és behelyettesíti a 1602-es kijelző 8 felhasználói karakterkódja közül a megfelelőre.
Üdv Mindenkinek. Adott egy kód, amiben van feszültségmérés. Autó akkumulátor/generátor feszültséget figyel. Kérdésem az, hogy hogy tudom megoldani, hogy a kijelzőn csak egy tizedes jegyig írja ki a számot? Jelenleg két tizedesjegy van, ami számomra fölösleges.
Hirtelen, kód nélkül, emlékeim szerint, tegyél egy vessző eggyet (,1) a kiírós sorban kiírandó változó mögé.
Bővebben: Link A hozzászólás módosítva: Jan 15, 2019
Idézet: „Nekem az interrupt illetve a saját függvény kínai,” Keressél rá ezekre a könyvekre : Ruzsinszki Gábor - Mikrovezérlős rendszerfejlesztés cc++ nyelven II vagy: innen letölthető másik: Harsányi Réka – Juhász Márton András Fizikai számítástechnika: elektronikai alapok és Arduino programozás című könyv Arduinos összefoglaló Cseh Róbert
Valamint ha túl mer nézni az Arduino-n, akkor maga az AVR kínál majdnem minden GPIO-n úgynevezett pin change interruptot. Nagyon hasznos.
Köszi.
Ez lenne a célom, de nem értem, hogy a 2byte-on tárolt karakter hogyan jut át a függvényeimen, amik csak 1 byte-ot kapnak, és 1byte-ot adnak tovább. És azt nem tudom, hogyan tudnám ezt a két byte-os karaktert két byte-ra szétválasztani, mikor mindenhol 1byte-ként van kezelve. Tehát simán eltárolom az á betűt char temp='á'-ként. Ebben tudnátok esetleg segíteni? Köszi. A hozzászólás módosítva: Jan 15, 2019
|
Bejelentkezés
Hirdetés |