Fórum témák
» Több friss téma |
A klónok CH340 Soros-USB illesztőjének drivere (Letöltés)
Bocs ott hiba van. ( ez már akkor történt amikor ide raktam a kodot). Azt már kijavitottam.
Ettöl félek én is, de majd holnap ujra nekifogok.
Nem az YSTEP teljesen önállo, az Ymotornak csak forognia kell és majd egyszer megállnia, de az a rész még nincs a kodban. Az Y motor most csak két soros az egyikben a fix irány van a másikban meg csak léptet minden megszakitásra. Semmi más feltétel stb ott nincs.
Még az jutott most az eszembe, hogy a void loopban nekem több switch...case subrutinom van. Ez a motorkezelö a legrövidebb talán 6 soros - csak bekapcsolja a feltételeket a motorok forgásához. Nem tudom milyen gyorsan futnak a loop rutinok, a motormegszakitás nagyon lassu, jelenleg 1-20 ms- ként történik. Lehet, hogy ott lesz a konfliktus. Mint már korábban irtam a kod önálloan már ment ( a megszakitás) és a számlálás is. A hozzászólás módosítva: Márc 5, 2020
Sziasztok!
Az alábbi kis ultrahangos távolságmérő programom érthetetlenül működik. Ha a számítógépre van kötve (USB-n), akár használom a soros portot akár nem látszólag hibátlanul működik. De külső tápról (2 cellás LiPo) esetén ha egyszer nem volt viszhang többet nem mér. Reset után sem, csak a táp ki- bekapcsolása segít. Arduino UNO és HC SR04-es modul a hw. (Eddig csak néhány gyakorló programot írtam Ardunióra)..
Tedd fel az egész programot github-ra, vagy legalább pastebin-re! Egyre gyanúsabb, hogy nem csak a bevágott részben vannak hibák. Általánosságban is jobban jársz, ha az egészet meg tudod mutatni, mert sokszor nem ott van a hiba, ahol várjuk.
A következő tippem például az, hogy a switch-case-ben nincs "break;" a case-ek között, és a soron következő logika is lefut, nem csak ez. Emiatt számlál többet egyszerre a számláló, mint várnád.
Kösz a segitséget.
Közben kisérletezgettem egy kicsit. Most fix adatokkal probáltam a megszakitást: void setupban: stepcounter=10, xxsize=40 igy sem számolt jol. a stepcounter soha nem érte el a 0-t, de érdekes modon átugrott ujra 10-re, anélkül, hogy az xxsize--; érték csökkent volna, azaz az xDIR sem változott. STEPCOUNTER = 7 xDIR =1 STEPCOUNTER = 6 xDIR =1 STEPCOUNTER = 1 xDIR =1 STEPCOUNTER = 10 xDIR =1 STEPCOUNTER = 8 xDIR =1 STEPCOUNTER = 6 xDIR =1 STEPCOUNTER = 4 A case-ben mindenütt ott a break; azt már ellenöriztem, csak azt nem tudom, hogy a loop milyen gyakran fut le, mert nagyon ugy néz ki, hogy az okozza a konfliktust. Most egy kicsit felgyorsitottam a megszakitast (10 ms), most egész más adatokat a printout, de a nullát most sem éri el. A printer 115200-bd-re van már állitva.
Azok a változók, amik a megszakításban vannak volatile-ek?
Ha a megszakításból küldöd ki a változók értékét, akkor az megakaszthatja az egész program logikáját. Inkább állíts be egy logikai változót, amit a főprogramban figyelsz, és onnan menjen a print.
Kösz!
Pillanatnyilag nem küldöm sehova. Most a két változo (stepcounter és az xxsize) értéke a void setupban van egyszer és mindenkorra meghatározva ( kiiktattam minden belsö számitgatást), a megszakitásban csak a motoroknak kell ugy menniük, ahogy tervezem. Az adott esetben az Ymotor minden tizedik lépésére (stepcounter) az Xmotornak egyet kellene lépnie. Az Xmotor minden 40. lépésére (xxsize) irányt kell váltania. Külsö hatás csak az a 2 kapcsolo, ami a kodban van (ADJ ill a RUN). Ha ezeket megnyomom, akkor meg kell állnia a gépnek.
Ha nem szupertitkos a program, miért nem osztod meg? Lehet egyből kiszúrná valaki a hibát, elég sokan vagyunk itt rá. Nem kellene látnokot játszania senkinek.
Persze ha mégis az, akkor nem szóltam!
Az UNO tápcsatijára. (nem az USB-re)
Uno tápcsatija? Oda, ahova max. 12V-ot lehet rakni? Akkor az okés.
Pontosan. Ennek a távmérőnek konstrukciós hibája van. (Ha nincs viszhang az Echo láb "H"-ban marad és a triggerre nem reagál többé!) Ezért az Echo lábat kényszeríteni kell "L"-be. (Valahol az interneten láttam ezt a megoldást)
Használom a pin13 ami egyben Tx is, ha jól tudom, ez bezavarhat? Mellesleg különböző időzítésekkel is próbálkoztam, de annak nem volt hatása.
Mar egyszer beraktam, most leegyszerüsitettem, nincs benne külsö összefüggés, csak a stepcounter=10;
xxsize=40; van a void setup ban definiálva. az yDIR adott (nem változik) kösz
Sziasztok.
Harmadik feltételnek azt szeretném, hogy csak akkor teljesüljön, ha még pluszban a 6-os kimenet aktív. (nyomógombot (bemenet) feltételeket betudok illeszteni, az működik, de nem tudok rájönni, hogyan függjön a kimenettől is.) A 6-os kimenet egy relét kapcsol csak. (on-off) Előre is köszönöm.
A kimentet állítod valahol máshol? Egyszerűen az adott if (pin ==High)
De azt is csinálhatod, hogy egy boolean változót veszel fel, ami mikor ezt a pint állítod high-ra akkor true, ha low akkor false. Ha interrupt függvények hozzányúlnak ehhez a változóhoz akkor Volatile valami bollean- kell a setupban. Urána meg még egy && valami==True, (vagy ami neked kell && valami==False, neked kell eldönteni. Vagy && Pin_neve==High kell a linkelt feltételbe. A hozzászólás módosítva: Márc 6, 2020
Idézet: „Mar egyszer beraktam, most leegyszerüsitettem,” Nem akarok kötözködni, tényleg a segítő szándék vezérel. De ez még mindig nem a teljes kód. Fentebb már más is írta, hogy elképzelhető hogy nem ott van a hiba ahol keresed, hanem a program más részén van valami ami bezavar. Hogy konstruktív is legyek, azt már próbáltad hogy kiveszed a megszakításból, és egyszerűen a loop-ban futtatod? Úgy is hibázik? (Nekem speciel nehezen követhető hogy bitenként vizsgálgatod a digitalWrite részben, de biztosan okod van rá)
Illetve megint lemaradt egy = -jel.
Szia.
Sikerült megcsinálni, köszönöm a segítséget. A hozzászólás módosítva: Márc 6, 2020
Nekem ez müködött megszakitással, (igy ahogy itt van semmi más nem volt a sketchben a setupon meg a portok definicioján kivül), de a hülye fejemmel azt nem mentettem el, hanem tovább irtam (nem erre). Berakhatom az egészet is, de meglehetösen áttekinthetetlen ( nincs még annyi tapasztalatom az Arduino nyelvvel). A kod többi részében csak a nyomogombok lekérdezése van valamint a két nyomogom (ADJ meg a RUN) kapcsolová alakitása. Az elsö case-ben kiszámolja a paramétereket meg kiirja a displayre, a második case-ben a manuális mozgás van a 3-6 sorok az alábbi kodban ( az jol müködik).
A 3. Case meg csak beirja a két változot és kezelné az irányváltást az xDIR. Semmi mást nem csinál (a case paramétere a ADJ meg a RUN bekapcsolt állapota). Még ide kell berakni a fordulatszámlálot, de az még nincs meg. Nem értem, hol vizsgálgatok valamit bitenként? A digitalWrite-koban csak kiküldöm a portokra a jelet, legfeljebb csak az van benne, hogy ez csak akkor történjen meg ha a megfelelö kapcsolok (bitek) helyes állásban vannak. Na mindegy egy kicsit kipucolom a kodot s majd felrakom. Mindenképpen köszönöm hogy foglalkozol a dologgal.
Ha felteszed ide, akkor átbogarászom, esetleg megpróbálom valami áttekinthetőbb formára hozni, mert így nagyon kusza. Csak kommenteld fel, hogy lássam pontosan mit szeretnél! Ha belefér, lehet hogy újraírom neked! Mellesleg miért kell hogy megszakításból menjen?
A hozzászólás módosítva: Márc 6, 2020
Addig nézegettem a DigitalRead() függvényt amíg meg nem oldottad. Ez a legegyszerűbb megoldás. Sokan gondolkodnak rajta, hogyan lehet egy kimenetet olvasni, hát így. Ilyen könnyen.
Csak hozzáfűzném a hozzászólásodhoz, hogy ha egy kimeneten timer van, és annak az aktuális állapotát szeretnéd leolvasni, akkor ott a digitalRead() függvény már nem működik. Az esetben már csak a regiszter kiolvasásával tudod megnézni, hogy abban a pillanatban milyen szinten van a kimenet.
Igazad van. Ezt olvasgattam több helyen is nekem sem volt 100%. Nem tudtam pontosan elsőre, hogy ez működhet-e. Nem mertem ezt javasolni elsőként.
Szerencsére itt ez nem játszik. Más esetben maradt volna egy plusz logikai változó és annak a vizsgálata, vagy a regiszteres olvasás. A regiszter olvasás a legjobb, de a plusz logikai változós megoldás meg átláthatóbb szerintem. Csak azért írom, hogy a jövőben aki olvassa annak is legyen valami. De most ebben a feladatban szerencsére jó és egyszerű megoldás.
Tovább gondolva timer-en a logikai változós nem játszik (játszhat). De majd kipróbálom, belezavarok egy kódot ebbe a hibába.
Nem fogod elhinni, a nagy tisztogatatástol elindult és már pontosan azt teszi amit kell.
Valoszinüleg valahol egy jel maradt ki. Megmondani nem tudom pontosan hol. Tegnap átváltoztattam néhány változot booleanra, és lehet, hogy ott hiányzott valami. Itt az ujra müködö kod. Bocs, hogy ennyit zaklattalak titeket. Most még a fordulatszámlálást kell megoldani és kész.
Javaslom, hogy mindig amikor már sikerült elérni valami működőt, akkor zippeld be, és tedd el későbbre! pl. stepper01.zip, stepper02.zip, stb. Így ha ilyen van, hogy egyszer már működött, de elrontottad, akkor van hova visszanyúlni.
Már kezdem tanulni.
Most még nem zippelem, de ha valami müködik és beleakarok nyulni azonnal egy uj nevet adok neki (ez is most már az 5.). A kimondottan jokat meg elteszem egy más könyvtárba referenciának. Most még a forudulatszámlálot kell megcsinálni. Két optoszenzor elött forog a kerék és fel illetve le kell számolni, ha elöbb az S1 vagy az S2 kimenet megy magasra. Még azt nem tudom hova kellene tenni a loopba vagy a forgato case-be. Mennie mindig kellene akkor is ha kézzel forgatom a tengelyt.
Én zárójelezném a feltételvizsgálatokat, biztos, ami biztos. Ha bekerül egy negálás (!), nem mindegy, hogy a kimenetet negálod, vagy esetleg a feltételvizsgálat eredményét.
|
Bejelentkezés
Hirdetés |