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   65 / 139
(#) idlob válasza szitko hozzászólására (») Júl 8, 2012 /
 
Ahhoz, hogy a lehető legnagyobb felbontást érd el, a timernek a lehető leggyorsabban kell számolnia, tehát az előosztásnak 1-nek kell lennie, az órajel meg adott. Ez azt jelenti, hogy 3MHz esetén a TAR inkrementálása kb. 1/3 us-onként történik. Ekkor "continous mode"-ban 2^16 lépésben jut el a TAR 0-tól 2^16-ig, és az órajel következő felfutó élére túlcsordul, tehát 1/3*(2^16+1) us lesz a timer periódusideje, ami nagyjából 21,85 ms. Ez majd' 2000x nagyobb mint a ciklusod lefutási ideje, tehát biztos nem fog túlcsordulni.
Ha "up mode"-ban akarsz számolni, akkor a TxCCRx-t úgy kell beállítanod, hogy a túlcsordulás periódusideje kicsit nagyobb legyen mint a ciklus futásideje. Utóbbi kb. 13 us, tehát legyen a timeré mondjuk 16 us, ekkor TxCCRx = 16*3-1 = 47.
De ennek nem látom különösebb értelmét, pontosabb nem lesz a mérés, a timer nullázása, olvasása ugyanúgy megoldandó feladat marad, és egy esetleg beeső megszakítás mérése nehezebb.
(#) icserny válasza idlob hozzászólására (») Júl 8, 2012 /
 
Idézet:
„1/3*(2^16+1) us lesz a timer periódusideje”
Szerintem nem kell egyet hozzáadni, mert 2^16-1 a legnagyobb beírható szám, tehát 2^16-ra már túlcsordul.
(#) szitko válasza idlob hozzászólására (») Júl 8, 2012 /
 
Nagyon szépen köszönöm. Sikerült kizökkentened a hülyeségemből.
Amúgy már írni sem tudok rendesen, mert a mért ciklusidőt is elírtam. Nem ~75kHz, hanem ~75Hz ami kb 13ms, de ez még mindíg belefér.
A lényeg, hogy amikor elkezdtem számolni, valami oknál fogva, én csak 8 bittel számoltam, de hogy miért, azt nem tudom.
A nullázást megoldom a programban, pl. így:
  1. while(1){
  2.            cik_fut_ido = TA0R;
  3.            TA0R = 0x00;
  4.             .......

Hálás köszönet!
(#) idlob válasza icserny hozzászólására (») Júl 8, 2012 /
 
Igen, igazad van. Érdekes, éreztem, hogy valami nem kerek, de végig csak arra tudtam gondolni, hogy a legnagyobb szám után még kell egy órajel a túlcsorduláshoz. Arról pedig valahogy megfeledkeztem, hogy eleve nem tudok 2^16-t 16 biten tárolni. Magyarázom a bizonyítványom.
(#) icserny válasza idlob hozzászólására (») Júl 8, 2012 /
 
Ebben a nagy melegben nem csoda, ha a gondolkodás is megtántorodik...
(#) moderboy hozzászólása Júl 10, 2012 /
 
Egy kis kiegészítés az LP-hez: 6 csatornás logikai analizátor, ha jól látom még fejlesztés alatt áll, de biztos nagy siker lesz.
(#) David.zsombor hozzászólása Júl 12, 2012 /
 
Erről Mit gondoltok? Processing alapú Launchpad programozó. Egyenlőre 1.0 és 3 típusú uC-t támogat de működik. Nekem máris lenne egy kérdésem annak aki kipróbálja: A beállított 1S delay miért csak a fele körül van? Nem jó az órajel? Köszi.
(#) icserny válasza David.zsombor hozzászólására (») Júl 12, 2012 /
 
Itt meg itt írtam erről. Új launchpaddal próbáltam, akkor automatikusan a 16 MHz-es DCO-ra állt be. Ha megadtam neki, hogy F_CPU = 1000000, akkor pedig az 1 MHz-re (de valamiért elkezdett nem működni a RESET gomb).

Azt a fenti beírásban már írtam, hogy INPUT helyett INPUT_PULLUP pin módot kell beállítani az új kártya SW2 gombjára.

Nekem a legfőbb gondom az volt, hogy az ADC-vel mért értékek ugrálnak, akkor is, ha az ADC beállítást egy-az-egyben a saját C parogramomból tettem. Majd ha időmilliomos leszek, akkor esetleg nekiállok turkálni a keretrendszer fájljaiban.

Amúgy pofásan megcsinálták, de azt ne feledjük, hogy ebben sem szimulátor sem debug lehetőség nincs.
(#) David.zsombor hozzászólása Júl 12, 2012 /
 
Azoknak való akik arduinohoz vannak szokva. A programot még bőven fejlesztik és a legtöbb hibáról már tudnak is úgyhogy hátha ezt is megoldják. Nekem a régebbi kártyával nem volt gond a nyomógombbal.
(#) moderboy válasza David.zsombor hozzászólására (») Júl 12, 2012 /
 
Nem probáltam még, de tervbe van véve.
(#) szitko hozzászólása Júl 12, 2012 /
 
Ha negatív számból szeretnék pozitívot csinálni, a típuskényszerítés jó megoldás? Vagy van egyszerűbb megoldás?
Példa:
  1. unsigned int A;                // 16 bit poz. egész
  2. int B;                               // 16 bit
  3.           A = B;
  4.           B = 65536 - A;
(#) icserny válasza szitko hozzászólására (») Júl 12, 2012 /
 
Idézet:
„Ha negatív számból szeretnék pozitívot csinálni, a típuskényszerítés jó megoldás?”
Nem jó, mert csak az értelmezést változtatja meg, s a kis negatív számból így nagy pozitív számot csinál.
Idézet:
„Vagy van egyszerűbb megoldás?”
Mi legyen a negatív értékekkel? Nullának veszed, vagy az abszolútértéke legyen az eredmény? Akármelyiket választod, elágazás nélkül (if) nem tudok megoldást. (Meg kell nézni a legfelső bitet, melynek 1 állapota negatív számot jelez).
(#) szitko válasza icserny hozzászólására (») Júl 12, 2012 /
 
A konkrét problémám, hőmérőnél az lcd-re való kiírás, de csak a negatív értékkel van bajom.
Hőszenzor: TMP36, 500mV=0Cfok, 100mV=-40Cfok, 1,75V=125Cfok.
Most így oldottam meg a mérést:
  1. homero_olv();                       // hőmérő érték beolvasása
  2.             homero_atlag = 0;                   // töröljük a vátozót
  3.             for(char i=0; i<20; i++){           // beolvasott értékek
  4.                 homero_atlag += homero_1[i];    // összeadása
  5.             }
  6.             homero_atlag /= 20;                 // átlag számolás
  7.             volt = homero_atlag * 2500;         // mV kiszámítás
  8.             volt /= 1024;
  9.             fok = (volt - 500);                 // C° kiszámolás
  10.             if(fok < 1){
  11.                 neg_fok = fok;
  12.             fok = 65536 - neg_fok;
  13.             neg = 1;
  14.             .....

és így a kiírást:
  1. void lcd_ertek(int sz){
  2.     unsigned char tiz,egy,tized;
  3.     if(neg){
  4.         jelek(1, 0, 2);         // -
  5.         neg = 0;
  6.     }else{
  7.         jelek(4, 0, 2);         // SP
  8.     }
  9.     tiz = sz / 100;
  10.     szamok(tiz, 13, 2);
  11.     egy = (sz %100) /10;
  12.     szamok(egy, 28, 2);
  13.     tized = sz %10;
  14.     jelek(0, 42, 2);            // .
  15.     szamok(tized, 49, 2);
  16.     jelek(2, 64, 2);
  17. }

Nokia lcd-re íratom ki.
(#) icserny válasza szitko hozzászólására (») Júl 12, 2012 /
 
Nem szép dolog, hogy az átlagolást nem kettő hatványa szerint csinálod! (16 vagy 32 minta esetén az osztás jobbra léptetéssel megoldható).

A negatív számokat én a kiíratásnál ellenőrzöm, az if(data<0) { sign='-'; data = -data;} sorban.

Unsigned változó esetén így kellene: if((a=b)>32767) a= 65536-a; (Itt a az unsigned16 b pedig az előjeles változó)


  1. /**------------------------------------------------------------
  2.  * Decimális kiíratás adott számú tizedesjegyre.
  3.  *-------------------------------------------------------------
  4.  * data - a kiírandó előjeles szám (int32_t)
  5.  * ndigits - a kiírandó tizedesek száma (uint8_t)
  6.  */
  7. void sw_uart_outdec(int32_t data, uint8_t ndigits) {
  8.   static char sign, s[12];
  9.   int8_t i;
  10.   i=0; sign=' ';
  11.   if(data<0) { sign='-'; data = -data;}
  12.     do {
  13.       s[i]=data%10 + '0';
  14.       data=data/10;
  15.       i++;
  16.       if(i==ndigits) {s[i]='.'; i++;}
  17.     } while(data>0);
  18.     sw_uart_putc(sign);
  19.     do {
  20.       sw_uart_putc(s[--i]);
  21.     } while(i);
  22. }


A te kódrészleted számomra értelmezhetetlen, mert a változó típusokat nem adtad meg benne.
(#) szitko válasza icserny hozzászólására (») Júl 12, 2012 /
 
Idézet:
„Nem szép dolog, hogy az átlagolást nem kettő hatványa szerint csinálod! (16 vagy 32 minta esetén az osztás jobbra léptetéssel megoldható).”

Tudom. Ez még csak egy "gyosan összehá...t" program. Majd még pontosítok rajta.
Valóban lemaradtak a változótípusok, bocsi.
Íme:
  1. unsigned int szamlalo=1;
  2. unsigned int homero_1[20];
  3. long homero_atlag = 0, volt;
  4. int fok;
  5. unsigned int neg_fok;
  6. char neg;

Még ezen is finomítani kell.
(#) icserny válasza szitko hozzászólására (») Júl 12, 2012 /
 
Szerintem ennyi kell:
  1. if(fok<1) { neg=1; fok = -fok;}


De lehet, hogy jobban jársz, ha hozzám hasonlóan a kiíratásba teszed.

A neg_fok változód fölöslegesnek látszik lenni.
(#) szitko válasza icserny hozzászólására (») Júl 12, 2012 /
 
Köszönöm a segítséget.
Megnézem mind a kettőt.
(#) szitko válasza icserny hozzászólására (») Júl 13, 2012 /
 
Volt egy kis időm, és megnéztem mind a két programrészletet. Lehet, hogy ezt egy az egyben felhasználom, a szoftveres UART-al együtt, ha nem gond.
Ennél "fok = -fok" viszont nem értek egy utasítást. illetve az asm megfelelőjénél:
  1. mov.w  &fok,R15     ; másolás R15-be
  2. inv.w    R15             ; ???? Mit csinál?
  3. inc.w    R15             ; R15 +1
  4. mov.w  R15,&fok     ; másolás "fok"-ba


Más:
A LPM4 módnál, minden modult (ADC10, TIMER, stb...) ki kell kapcsolni, hogy 1mA alatt legyen a fogyasztás?
(#) icserny válasza szitko hozzászólására (») Júl 13, 2012 /
 
Idézet:
„Lehet, hogy ezt egy az egyben felhasználom, a szoftveres UART-al együtt, ha nem gond.”
Ha működik, akkor nem gond.

A szoftveres UART-tal sok gondom volt Win7 alatt (lehet, hogy a Bluetooth szoftvere is bekavar), s most úgy tűnik, hogy a 9600 Baud sebességet valamivel jobban szereti, mint a 2400-at. Megjegyzem ez a Launchpad USB-UART átalakítójának a sara, mert ha a mikrovezérlőt egy másik konverterhez (CP2102) kötöttem, akkor sohasem volt gondom. a gond itt azt jelenti, hogy bekapcsoláskor min. 2-5-ször, néha többször is újra kellett csatlakoztatni, hogy menjen a kapcsolat, és a Windows is a megadott adatsebességre szíveskedjen beállítani a virtuális soros portot.

Az időzítésen is hangoltam egy kicsit (megnyújtottam a bitidőt), de csak érzésre, mert műzseres mérést nem végeztem. A csatolt program G2452-höz vagy G2553-hoz való, de az ADC kalibrációs adatok szimbolikus neveit deklarálni kell a fejléc állományban mert kihagyták belőle (legalábbis az általam használt kiadásban). Itt most 9600 bit/s az adatküldési sebesség.

A kérdezett gépi kódok: az inv utasítás komplementál (invertál), az inc pedig eggyel megnövel. Ez a kettes komplemens képzés módja, ez felel meg a fok = -fok utasításnak.

main.c
    
(#) szitko válasza icserny hozzászólására (») Júl 13, 2012 /
 
Köszi.
A szoftveres UART-tal, bluetooth-ra (HC-05) szeretném küldeni az adatokat, de még át kell néznem, hogy meg tudom-e valósítani.
Mégegyszer köszi.
(#) szitko válasza szitko hozzászólására (») Júl 13, 2012 /
 
Megvan!
Az ADC10 modult, vagy csak egyes részeit ki kell kapcsolni, hogy valóban alacsony fogyasztás legyen a LPM4-es módban.
(#) szitko hozzászólása Júl 14, 2012 /
 
Csak azért írom le, hogy más ne szenvedjen, és ne egye az ideg egy fél napig!

Miután sikerült "felfognom" félig, Icserny fórumtársunk SW_UART programját, elkezdtem próbálgatni, egy g2252-esel. A terv az lenne, hogy egy HC-05-ös bluetooth modul segítségével, adatokat küldjek a PC-re. Első körben elővettem a HW UART programom, amit a HC-05-höz készítettem g2553-ra, mert abban van HW UART. Összekötözgettem őket, elindítom a progit, és a hypert.-ben szépen megjelenik a szokásos "Hello World" szöveg. Mivel minden rendben ment, kicseréltem a mikrovezérlőt egy g2252-esre, rákötöttem a P1.1-es lábra a HC-05 TX lábát! Azért a TX lábat, mert a hardveres UART-nál a TX-TX és az RX-RX lábakat kell összekötni, és így megy a kommunikáció, amit régebben itt a topikban fel is vetettem, mert furcsa volt, hogy nem keresztbe kell kötni. (HC-05 bt adatlap = 1 PIN = TX, 2 PIN = RX) Tehát vezérlő a helyén, összekötve a bt modullal, jöhet a program. Bemásoltam Icserny programját, kitöröltem belőle ami nekem nem kell, (analóg rész), és jöhetett az első kísérlet. Gondoltam először megnézem az LP-n keresztül, hogy él-e a kapcsolat, ezért a hypert.-ben a launchpad COM portját állítottam be. TX jumper fenn, és az adatok első indításra jöttek, szépen, mintha hardveres UART lenn. Minden rendben, jöhet a bt modul. TX jumper le, drót a P1.1-es lábra, hypert. bt-re állítva. Indítom a progit, és................ semmi. "Se kép, se hang"....... Közben....., eltelt a nap fel..... Hosszas próbálkozás, vezérlőcserélgetés, PC oldali szoftver cserélgetés, és minden létező hiba kizárása után, véletlenül jöttem rá, hogy a bluetooth modul RX lábába kell bedugni a P1.1 azaz a TX lábat.
És ezzel szívtam egész délelőtt. Mert a gyártók nem tudnak kitalálni, egy olyan szabványos jelölést amit mindenki be tud tartani. Felháborító!

Elnézést a regényért, de legalább levezettem a délelőtt felgyülemlett ideget.
(#) moderboy válasza szitko hozzászólására (») Júl 14, 2012 /
 
Átérzem a problémádat, én is jártam még ígyebbül is. Leértékelt gps modult vettünk, kifutó darab volt már évekkel ezelött is, gyári dokumentáció elég kevés, az is zavaros... Lényeg a lényeg 2 soros port volt rajta, mert tudott volna modemet is kezelni, természetesen fél napi szenvedés után gondoltam rá, hogy lehetséges hogy mégsem az elsődleges porton probál kommunikálni kifele.

Tanulság a te történetedből is, mielött a hardver vagy szoftver hibáját keresnénk a bekötést kell megnézni, ilyenkor az első hogy az RX-TX-et meg kell cserélni vagy ki kell mérni melyik melyik. Egy multiméterrel meg lehet nézni a sorosport leírása alapján, ez egyik mindig magas szinten van.
(#) icserny válasza szitko hozzászólására (») Júl 14, 2012 /
 
Idézet:
„a hardveres UART-nál a TX-TX és az RX-RX lábakat kell összekötni”
Hardveres UART-nál a (régi) Launchpad kárty TxD jelzésű kivezetése valójában az RxD bemenet. Nem ez tévesztett meg?
(#) szitko válasza icserny hozzászólására (») Júl 15, 2012 /
 
Nemhiszem, mert az (új) Launchpad kártyánál is úgy kell bekötni, hogy Tx-TX, RX-RX. Sőt, még régebben próbáltam a FRAM kártyával (fr5739), és ott is, a P2.0 (TXD) ment a HC-05 TX lábára, a P2.1 (RXD), meg az RX lábra.
Szóval nem értem.
Viszont a lényeg, hogy eme kis hiba leküzdése után, a szoftveres UART programod tökéletesen működik, a bluetooth-al, és a Launchpad-al egyaránt.
Köszönet érte.
(#) icserny válasza szitko hozzászólására (») Júl 15, 2012 /
 
Idézet:
„az (új) Launchpad kártyánál is úgy kell bekötni, hogy Tx-TX, RX-RX”
Nekem az új Launchpad kártyán nincs jelölveTXD meg RXD kimenet, hanem UART felirat van helyettük. A lényeg: a TXD kimenet szoftveres UART esetén P1.1 lábon, hardveres UART esetén pedig a P1.2 lábon van.

Az RXD bemenet pedig a fordítottja: szoftveres UART esetén a P1.2 láb, hardveres UART esetén pedig a P1.1 láb.
(#) szitko válasza icserny hozzászólására (») Júl 15, 2012 /
 
Idézet:
„hanem UART felirat van helyettük”

Ebben igazad van. Én a jumpereket néztem, és ott a TXD=P1.1, RXD=P1.2. Bár már abban sem bízok, mert ugye el lehet forgatni HW UART, vagy SW UART állásba.
Én úgy vettem észre, az elektronikai jelölések terén, hogy két szabvány van. Az első, a "nemzetközi", a második a Kínai. (Nem rosszindulatból mondom!)
(#) icserny válasza szitko hozzászólására (») Júl 15, 2012 /
 
Így működik az új Launchpad kártya átkötéseinek forgatása

Az új Launchpad kártya dokumentációja (slau318b) szerint:
piros - a mikrovezérlő P1.1 lába (szoftveres UART esetén ez TxD, hardveresnél RXD)
kék - a mikrovezérlő P1.2 lába (szoftveres UART esetén ez RxD, hardveresnél TxD)
zöld - az USB-UART átalakító vevője (RX)
sárga - az USB-UART átalakító adója (TX)

Fentiek alapján érthető, hogy szofveres UART esetén a piros-zöld és kék-sárga átkötések kellenek, mert így TxD - RX, Rxd - TX összekötések lesznek.

Hardveres UART esetén pedig, az elforgatás után piros-sárga és zöld-kék átkötések lesznek, ezek biztosítják az RxD - TX illetve TxD-RX összekötéseket.
(#) szitko válasza icserny hozzászólására (») Júl 15, 2012 /
 
Ez így érthető. Köszi.
Mondjuk ami még zavar, az az, hogy miért ragaszkodik mindenki a szoftveres UART-nál a P1.1/P1.2 vagy P1.5 lábakhoz. Én most a szofveres UART-ot a P2.5-ön vezettem ki (az általad írtat, g2452).
De kezdek rájönni, hogy ez az egész programozás egy nagy szívás. Most épp a Processing szívat, annak is az androidos, bluetooth része. Egyszer sikerült kapcsolatot teremteni a HC-05 + g2452-vel (még tegnap), és azóta csak a hibákat szórja, úgy, hogy a programon nem változtattam, csak egy újraindítás volt.
De ez már nem ide való.
Mégegyszer köszi a kimerítő magyarázatot.
(#) Grebi hozzászólása Júl 22, 2012 /
 
Üdv mindenkinek!

MSP430G2211-el kellene megoldanom egy feladatot és felmerült egy olyan probléma hogy lehetséges egyes kimenetek szembekötése egymással. Nah most nézegettem az adatlapot, de ott nem szerepel az hogy most a kimenet Totem Ploe, Open Collector vagy Tri-state.
Valaki tud ebben tanácsot adni, hogy ha szembe kötöm a kimenetet károsodni fog a vezérlő? Előre is kösz!
Következő: »»   65 / 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