Fórum témák
» Több friss téma |
Idézet: Azt próbálom megértetni, hogy ha a terminálban beírod, hogy START, az nem egy adategységként jön át, hanem karakterenként. S amikor mondjuk a második karaktert olvasod, nem tudod, hogy meddig kell várni a harmadikra, s egyáltalán, hogy hány karakter érkezik még záros határidőn belül. A Serial osztály nem véletlenül a Stream leszármazottja, ugyanis egy kétirányú, végtelen adatfolyamot kezel. Ebből kell kiindulni.„Úgy értettem hogy az ahova lehet irni serial-nal, szóval ha oda start van be irva akkor úgy” Idézet: „...de mindegy is ha nem lehet megcsinálni.” Senki nem mondta, hogy nem lehet megcsinálni. De nem triviális a feladat. Az egykarakteres vezérlés (pl. S - indít, T - leállít) lényegesen egyszerűbb.
Valóban, ha több karaktert vizsgálsz, az bonyolítja a dolgot.
Ellenben blokkolnia nem kell - elég azt figyelni, soremelés történt-e (és nem kizárt, hogy ez is másként jelenik meg Wndows, Linux és Mac vonalon, mint úgy általában a szöveges dokumentumok esetén). Persze mellé be kell vezetni egy bufferterületet, meg egy amolyan pointerrel jelölni az aktuális pozíciót, "enter" (CR/LF, ill. kombinációi) esetén pedig ellenőrizni, hogy az adott karakterlánc egyezik-e a kívánttal - meg nyilván kezelni a "túlcsordulás" esetét... /Esetleg egyszerűbben mondjuk egy 5 elem hosszú karaktertömbbe beírhatók a fogadott karakterek, CR/LF esetén ez kiértékelhető, 5 elem felett eldobandó ("új sor" esetén újrakezdés a tömb elejétől).../ A lényeg, hogy valóban bonyolultabb lesz, mint szimplán egy karaktert nézni. A hozzászólás módosítva: Feb 4, 2014
Idézet: Ezzel kapcsolatban csak az a probléma, hogy az Arduino-tól megörökölt Stream osztály "magasabb szintű" (értsd: többkarakteres) beolvasó metódusai, mint pl. findUntil(), readBytesUntil(), parseInt(), parseFloat() mind kiesnek a számításból, mert blokkoló várakozást tartalmaznak. „Ellenben blokkolnia nem kell - elég azt figyelni, soremelés történt-e” A karakterenkénti beolvasás és bufferelés természetesen megírható pedig nem kezdőnek való feladat (pláne, hogy az esetleges túlcsordulásra is ügyelni kell, különben jönnek a meglepetések!). A stringek kezelése sem triviális C-ben, bár némi segítséget jelent, hogy az Energiában van String osztály. Az, hogy a terminál ablakból beérkező üzenet milyen sorvégjelet tartalmazzon (vagy tartalmazzon-e egyáltalán), az Energiában a terminál ablak alján állítható be, a legördülő listából történő kiválasztással. Az alábbi képen pl. Newline (azaz LF) konvenció van beállítva. A hozzászólás módosítva: Feb 5, 2014
Nem ismerem az Energiát rendesen, de valami ilyesmi lesz a megoldás. Ez természetesen csak egy kódrészlet. A hozzászólás módosítva: Feb 5, 2014
Nem Energiában, de talán abban is, és a program blokkolásával, a "strcmp" függvénnyel megoldható.
Például, nagyvonalakban:
Persze ezt a program szösszenetet, nagyban befolyásolja a környezete is. De szerintem valami hasonló módon megoldható. Idézet: Én csak azt nem értem, hogy a "stop"-nak honnan lesz ötödik karaktere? „Nem ismerem az Energiát rendesen, de valami ilyesmi lesz a megoldás.”
Soros porton érkeznek adatok. Az adatokat decimális számként értelmezem, melyek nulla és száz közé esnek. A beérkező számok növekvő, majd csökkenő sorrendbe jönnek, de nem minden esetben érik el a maximális, azaz 100-as értéket. Tehát elmegy egy X értékig, majd onnan csökken. Van egy beállított érték (nem állandó), ahol a mikrovezérlő cselekszik, de csak visszaszámolás esetén, minek hatására, újra növekedni kezdenek a beérkező számok, de csak addig növekszik, amíg előzőleg növekedett.
Modellezem: beállított érték = 16. Maximum bejövő érték = 20, innen csökken az érték 16-ig,feladat végrehajtás, majd emelkedik 20-ig, majd újra csökken 16-ig, úra feladat végrehajtás... A kérdésem, hogy tudom megcsinálni, hogy a mikrovezérlő, a második "feladat végrehajtást" csak akkor csinálja meg, ha a beállított érték alá megy 10 értékkel a bejövő szám, tehát a modellt követve, lecsökken 6-ig a beérkező adat.. Leegyszerűsítve, ez olyan mintha egy fűtőszál hőmérsékletét figyelném, és a beállított értéken, a fűtőszálat, a mikrovezérlő folyamatosan ki-be kapcsolgatná. De itt most nem hőmérsékletről van szó!
Hiszterézis ?
Ha jól értettem: A megfelelő pont elérésekor bebillentesz egy jelző bitet, ami ha él, akkor a billenési pont más ( Tehát ha egyszer már működésbe lépett, akkor a bitet bekapcsolod, nyilván a megfelelő pontban esetleg törölni is kell ! )... ! A hozzászólás módosítva: Feb 8, 2014
Igen, majdnem Hiszterézis! De az első csökkenésnél azonnal kell reagálni és csak a második után kellene tologatni a reakciót...
Nem billentek jelzőbitet, csak végrehajtok egy feladatot, ami jelen esetben egy I/O állapotváltás: Uart_data= 19->20->19->18->17->16->I/O=pl:high->Uart_data=17->18->19->20->19->18->17->16-> Itt már csak pl. 6-nál kellene váltani, de az újabb váltás, megint az eredeti (16) értéken kell, hogy legyen. Most attól tekintsünk el, hogy a beállított érték (16), a harmadik váltást követően változni fog.
Azért kellene valamivel jelezni, hogy már járt egyszer a 16-nál! Az első csökkenésnél 16-nál kell kapcsolni, a másodiknál 6 -nál, miközben átmegy ÚJRA a 16-on! Mi különbözteti meg a két 16-ost ( csak egy jelzés! ) ?!
Tehát szerintem: jelző=0; X=19,20 -> 19,18,17,16 (mivel a jelző=0, ezért bekapcs valami! + jelző=1 ) --> 17,18,19,20 --> 19,18,17,16 ( de most a jelző 1, ezért 6-ig le kell menni ! ) , 15 ,14,... ! A 6-nál Te tudod, hogy mit kell csinálni ( ha újra 16, akkor jelző=0 ! ) ! A hozzászólás módosítva: Feb 8, 2014
Köszi a segítséget. Én már túlbonyolítottam az egészet...
Az elméleted kiegészítve jó lesz. A kiegészítés: Nem csak egy "jelző" kell, mert amikor a felfele számolás történik, akkor bebillenne a jelző. Azt is figyelnem kell, hogy épp növekvő a beérkező adat, vagy csökkenő.
Persze, csak azt hittem azt már tudod abból, hogy előtte már reagáltál !
Idézet: Sehogy, mert a C állomány az MSP430 számára "emészthetetlen". Előbb le kell fordítani egy alkalmas fejlesztői környezetben, s a kapott bináris állományt lehet letölteni.„Azt szeretném megkérdezni hogy hogyan tudnám a c fileokat beprogramozni msp430 launchpaddal.” Az általad mellékelt VFD clock forráskód CCS C-ben lefordítható (új projektet kell létrehozni MSP430G2553-hoz, s a forráskódot az #include sortól kezdődően be kell másolni az automatikusan létrehozott main.c nyúlfarknyi kódja helyébe). Amikor a Code Composer Studio ingyenes változatát telepíted, akkor a Launchpad kártya driverei is települnek, s akkor a letöltés csak egy kattintás...
Üdv!
Ha összerakok bármiféle áramkört és miközben vcc és gnd egyszerre be van kötve akkor kialszik a power led, még az usb-ről is lecsatlakozik.Valami féle rövidzárlat lehet?
Igen, rövidzárlat, vagy bekapcsolási áramlökés.
Bekapcsolási áramlökés?Van rá esély hogy tönkre teszi?
Bekapcsolási áramlökés például akkor van, ha a bekapcsolt Launchpad kártya tápfeszültségére rácsatlakoztatsz egy külső áramkört, amelyben nagyobb kapacitás (ELKO) van. Nekem a DHT22 szenzorral volt ilyen tapasztalatom. Nálad inkább zárlatra gyanakodnék, ha csak lecsatlakoztatta az USB-ről a kártyát, és egy pillanattal később nem csatlakozott az vissza.
Nem csatlakozik vissza, akkor rövid zárlat lesz.
Köszönöm a választ!
Még valami, most újra kipróbáltam a poti-s feszültség mérést, az eredmény pedig az hogy random irja a feszültséget még akkor is ha össze sincs kötve semmivel?Egy rövidzárlat tönkretehette, vagy a poti adhadta meg magát?Biztos hogy jól van összekötve.
Sziasztok!
Összedobtam egy hőmérőt 7 szegmenses kijelzővel. Két 74hc595, pár tranyó, TC1047-es analóg hőmérőszenzor és g2452-es MUC. Két kérdésem lenne. 1.: Az analóg szenzor esetében, hogy tudom korrigálni a hosszú vezeték (~1,5m) miatti hőmérséklet pontatlanságot, ill. a zajt. 2.: A kijelző fényerejének változtatását, hogy a legegyszerűbb megoldani? Timer->PWM és a szegmenseket kapcsoló tranyók meghajtásával? Közös anódú kijelzőket használok.
A tranzisztorokat most hogy kapcsolgatod? Azoknak a bekapcsoltsági idejével lehet játszani, s szerintem "szoftveres PWM" is megteszi. De csinálhatod a késleltetéseket timerrel is (mindig a soron következő késleltetés idejét beleírva).
Az egyik shift regiszter, a 7 digitet hajtja meg, a másik a szegmensek PNP tranzisztorait.
Három szegmens lévén, három tranyó van. Arra gondoltam, hogy a tranyók emitterét, ami jelen esetben Vcc-n van, meghajtom egy újabb tranyóval, amit vezérelnék PWM-el. De megint úgy érzem, hogy túlbonyolítom az egészet, ezért kérdeztem rá...
Szia!
Korrigálni - alapesetben úgy, hogy megméred a 1.5m vezetéked ellenállását, és kivonod a mért értékből. Szerintem másfél méteren ezzel még nem különösebben kell foglalkozni. (Ill. érdemes megnézni, mit is kell mérned.) Egyébként három, vagy négyvezetékes mérést szoktak alkalmazni (PT-szenzornál pl.), ahol a szenzor megtáplálása (PT1000-nél mondjuk ~100uA körül) külön vezetéken történik, mint maga a mérés, és mivel a mérővezetéken nincs terhelés, a vezeték ellenállása kevésbé okoz gondot - ill. kioltható. ...de itt precíz ellenállást mérnek. Úgy látom, a te hőmérődnek "feszültség kimenete" van - itt max. arra kell csak vigyázni, hogy ne "terheld meg" a kimenetét - ha mégis szükség lenne rá, pl. beteszel egy "buffert" elé. Bár ahogy elnézem, olyan fél- egy volt feszültséggel kell dolgoznod, ergo vagy bekerül egy műveleti erősítő, vagy mondjuk a 1.5V-os referenciával mérsz és "közvetlen" a uC lábára kötöd - a vezetékkel nem lesz gond (a kontroller nem terhel rá), és még viszonylag jól ki is használod az AD mérési tartományát.
A szenzort teszteltem egy multival és bevallom nem tetszett az, amit a mért adatokban láttam. Meg fogom szkóppal is nézni.
A szenzor kimenetére egy 1k ellenállást kötöttem, majd az 1,5m kábelt. A mért adatok össze vissza ugráltak. Hol felfelé mászott el "1-2 fokot" 10-20mV-ot, hol lefelé. Ha közvetlen az ellenállás után mértem (vezeték nélkül) akkor nem ugrált, hanem beállt egy értékre. Az 1k ellenállás, csak biztonsági okokból tettem rá (MUC AD védelem). Tudom, hogy nem kell, legalábbis az adatlap szerint. A mért adatok alapján, arra tudok csak következtetni, hogy valami nem kerek a szenzorral, vagy a vezeték kapacitása/ellenállása túl nagy, bár UTP kábelt használok, vagy tényleg kell valami szűrést (pl. RC) készítenem. Idézet: „Az egyik shift regiszter, a 7 digitet hajtja meg, a másik a szegmensek PNP tranzisztorait. Három szegmens lévén, három tranyó van.” Fordítva: amiből 7 db van, az a szegmens (8. a tizedespont), amiből 3 db van, az a digit (számjegy)! Én a PNP tranzisztorok bekapcsoltsági idejével szabályoznám a fényerőt.
Igen, köszönöm a helyreigazítást!
A shift regisztereket meghajtó függvényemben, elsőnek beírom a meghajtó regiszter 8 bitjét, hogy melyik digitre menjen az adat, majd beírom a második regiszter értékét, a megjelenítendő számot, és ezután engedélyezem. És ez ismétlődik folyamatosan a főprogramban, néha megszakítva egy AD konverzióval. Sajnos nincs most kéznél a program, mert dolgozom. A digiteket meghajtó shift regiszter OE láb "Ki-Be kapcsolgatásával" ez megoldható lenne? Vagy mindenképp át kellene írnom a kiíró függvényt. Idézet: Ez is egy lehetőség, de ahhoz akkor kell egy külön láb. A másik lehetőség: a mostani kiíró függvényben az időzítés(ek) módosítása. Legyen olyan idő, amikor egyik digit sem világít (egyik PNP tranzisztor sincs meghajtva)! „A digiteket meghajtó shift regiszter OE láb "Ki-Be kapcsolgatásával" ez megoldható lenne?”
Á, így már világos! Köszönöm a segítséget!
Tulajdonképp, kivezetés még akad "bőven", mert eddig csak 7 I/O lábat használtam fel. Három a shift regisztereké és kettő hőmérő szenzor lesz rajta. Plusz egy bement kell, melynek állapot váltására fog megváltozni a kijelző fényereje és egy gomb lesz még rajta, amivel eldöntöm, melyik szenzor értéke jelenjen meg a kijelzőn. (Autóba készül, külső/belső hőmérőnek. Gyárilag kifelejtették belőle) Még egyszer köszi a segítséget! |
Bejelentkezés
Hirdetés |