Fórum témák

» Több friss téma
Fórum » MSP430 mikrovezérlők
 
Témaindító: gomzito, idő: Ápr 21, 2006
Témakörök:
Lapozás: OK   122 / 139
(#) icserny válasza martonroli hozzászólására (») Feb 4, 2014 /
 
Idézet:
„Úgy értettem hogy az ahova lehet irni serial-nal, szóval ha oda start van be irva akkor úgy”
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.
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.
(#) VaZso8 válasza icserny hozzászólására (») Feb 4, 2014 /
 
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
(#) icserny válasza VaZso8 hozzászólására (») Feb 5, 2014 /
 
Idézet:
„Ellenben blokkolnia nem kell - elég azt figyelni, soremelés történt-e”
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.

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

TCN75_hw.png
    
(#) SBahadurD válasza martonroli hozzászólására (») Feb 5, 2014 /
 
  1. #define fut 6
  2. #define nem_fut 0
  3.  
  4. const char parancs[]="start\nstop\n";
  5. char p = 0, allapot = nem fut;
  6.  
  7. //függvény, ami vizsgálja az új karaktert
  8. karakter_vizsgal(){
  9.     if(uj_karakter == parancs[p]){
  10.         p++;
  11.         if(p == 5){
  12.             allapot = fut;
  13.         }
  14.         else if(p== 10){
  15.             allapot = nem_fut;
  16.             p == 0;
  17.         }
  18.     }
  19.     else
  20.         p = allapot;
  21. }


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
(#) szitko válasza icserny hozzászólására (») 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:
  1. uint8_t karakter, buffrecount=0, karakterBuffer[5], Enter=0x0d;
  2. uart_getc(&karakter);  // Soros adat mutató
  3. if ((karakter>= 32) && (karakter<= 127)) {  // ASCII kódba esik-e a karakter, ha igen berakjuk a bufferbe.
  4.     karakterBuffer[buffrecount++] = karakter;
  5. }else if(karakter==Enter){ // ha a sor vége Enter, feldolgozzuk a bejövő adatot
  6.     if (strcmp((char *) karakterBuffer, "start") == 0) {
  7.         // ide kerülhet a "start" parancsa.
  8.     }
  9. ...
  10. buffercount=0; // az új adathoz nullázni kell a tömbszámlálót.
  11. }

Persze ezt a program szösszenetet, nagyban befolyásolja a környezete is. De szerintem valami hasonló módon megoldható.
(#) icserny válasza SBahadurD hozzászólására (») Feb 6, 2014 /
 
Idézet:
„Nem ismerem az Energiát rendesen, de valami ilyesmi lesz a megoldás.”
Én csak azt nem értem, hogy a "stop"-nak honnan lesz ötödik karaktere?
(#) SBahadurD válasza icserny hozzászólására (») Feb 6, 2014 /
 
A \n karakterig kell vizsgálni.
(#) szitko hozzászólása Feb 8, 2014 /
 
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ó!
(#) kissi válasza szitko hozzászólására (») Feb 8, 2014 /
 
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
(#) szitko válasza kissi hozzászólására (») 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.
(#) kissi válasza szitko hozzászólására (») Feb 8, 2014 /
 
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
(#) szitko válasza kissi hozzászólására (») Feb 10, 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ő.
(#) kissi válasza szitko hozzászólására (») Feb 10, 2014 /
 
Persze, csak azt hittem azt már tudod abból, hogy előtte már reagáltál !
(#) Tomaszito111 hozzászólása Feb 11, 2014 /
 
sziasztok azt szeretném megkérdezni hogy hogyan tunám a c fileokat beprogramozni msp430 launchpaddal
a másikkérdésem az lenne hogy a vdf(msp430 al )csöve áramkör programját hogy programozzam
(#) icserny válasza Tomaszito111 hozzászólására (») Feb 11, 2014 /
 
Idézet:
„Azt szeretném megkérdezni hogy hogyan tudnám a c fileokat beprogramozni msp430 launchpaddal.”
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.

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...
(#) martonroli hozzászólása Feb 11, 2014 /
 
Ü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?
(#) icserny válasza martonroli hozzászólására (») Feb 11, 2014 /
 
Igen, rövidzárlat, vagy bekapcsolási áramlökés.
(#) martonroli válasza icserny hozzászólására (») Feb 11, 2014 /
 
Bekapcsolási áramlökés?Van rá esély hogy tönkre teszi?
(#) icserny válasza martonroli hozzászólására (») Feb 11, 2014 /
 
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.
(#) martonroli válasza icserny hozzászólására (») Feb 11, 2014 /
 
Nem csatlakozik vissza, akkor rövid zárlat lesz.
Köszönöm a választ!
(#) martonroli hozzászólása Feb 11, 2014 /
 
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.
  1. void setup() {
  2.       Serial.begin(9600);               // msp430g2231 esetén 4800 kell!
  3.     }
  4.     void loop() {
  5.       int sensorValue = analogRead(A4); //Mérés az A4 bemeneten
  6.       float voltage = sensorValue * (3.5 / 1023.0);
  7.       Serial.print(voltage,3);          //Kiíratjuk az eredményt
  8.       Serial.println(" V");             //Kiíratjuk a mértékegységet is
  9.       delay(1000);
  10.     }
(#) szitko hozzászólása Feb 13, 2014 /
 
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.
(#) icserny válasza szitko hozzászólására (») Feb 13, 2014 /
 
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).
(#) szitko válasza icserny hozzászólására (») Feb 13, 2014 /
 
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á...
(#) VaZso8 válasza szitko hozzászólására (») Feb 13, 2014 /
 
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.
(#) szitko válasza VaZso8 hozzászólására (») Feb 13, 2014 /
 
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.
(#) icserny válasza szitko hozzászólására (») Feb 13, 2014 /
 
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.
(#) szitko válasza icserny hozzászólására (») Feb 13, 2014 /
 
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.
(#) icserny válasza szitko hozzászólására (») Feb 13, 2014 /
 
Idézet:
„A digiteket meghajtó shift regiszter OE láb "Ki-Be kapcsolgatásával" ez megoldható lenne?”
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)!
(#) szitko válasza icserny hozzászólására (») Feb 13, 2014 /
 
Á, í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!
Következő: »»   122 / 139
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem