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   108 / 139
(#) pumi1980 válasza szitko hozzászólására (») Jún 24, 2013 /
 
Idézet:
„Arra, hogy pontosan mi a hiba, a mikrovezérlős szervó vezérléssel, még nem jöttem rá teljesen”

Szerintem az a probléma, amit icserny is irt: nem tisztán hardveres (PWM) a szervó jel előállítása. Mivel valószínűleg egy timer megszakításban történik a jel előállítása ezért a megszakítás(ok) kezelésének ideje is hozzáadódik a tényleges impulzus hosszhoz. Ez főleg akkor gond, ha több megszakítás is felléphet egyszerre. Akkor ez a hozzáadott idő folyamatosan változik, ez okozza a remegést. Vagyis hiába állítjuk elméletileg középállásba a szervót, az impulzus hossz folyamatosan változni fog pl.: 1,54ms 1,59ms 1,55ms ...
Én a CCRx regiszterek segítségével (MSP430G2553 hardver PWM OUT) teszteltem egy szervót: semmilyen remegés nem jelentkezett. A 28 lábú MSP430G2553-nél ezzel a módszerrel 4 szervó kezelhető, sajnos a 20 lábúnál még kevesebb.
(#) szitko hozzászólása Jún 27, 2013 /
 
Sziasztok.

Tegnap egy különös dolgot tapasztaltam, és nem tudom hova tenni.
A modell terepasztal vezérlést fejeztem be, és a programot kiegészítettem pár dologgal, LCD vezérlés, szoftveres UART, pár adat mentése flash (info) memóriába.
Miután úgy éreztem, hogy teljes a program, és az alap tesztek is sikeresek voltak, a végleges verziót szerettem volna "beégetni" (de csúnya szó ez) a mikrovezérlőbe, de nem sikerült. Hibának azt írta az IAR, hogy nem tudja írni az info mem. adott szegmensét. Gondoltam ez furcsa, hisz nem is írok bele semmit, csak ha majd fut a program, akkor lesz írva a flash.
Mindegy...., kivettem a flash írást a programból, ami a Timer_A0 megszakításban volt. Így már lefordult a program, viszont hiányzott az adat amit a flash-ből kellett volna kiolvasni.
Nem szaporítva tovább a szót, rájöttem, hogy "kis" programból sikerült egy olyan programot fabrikálnom ami már nem fért bele a mikrovezérlőbe. (kicsivel több mint 8k-s a program, a uC g2452-es)
Elkezdtem játszani az optimalizálással, és így már sikerült belepréselni a teljes programot g 2452-be.
Az első kérdésem az lenne, hogy mi alapján optimalizál az IAR, ill. egyáltalán mit optimalizál...
A próbálkozásaim közben volt olyan, hogy egy-egy utasítást, egyszerűen nem hajtott végre a mikrovezérlő, de csak azokat az utasításokat amik a Timer_A0 megszakításban voltak. Mintha azokat a parancsokat kihagyta volna a fordító, és nem kerültek bele a uC-be.
Ez, hogy lehetséges? És miért csak a Timer megszakításban lévők vesztek el?

Bocsi a regényért...
(#) SBahadurD válasza szitko hozzászólására (») Jún 27, 2013 /
 
Ez fura. Nem kéne szólnia a programnak, ha nem sikerült maradéktalanul lefordítani az adott mikrovezérlőre a programot? Elvileg tudnia kéne, hogy mennyi a szavad memória nem?
(#) icserny válasza szitko hozzászólására (») Jún 27, 2013 /
 
Erőteljes optimalizálásnál a fordító "kioptimalizál" minden olyan programrészt, amit feleslegesnek talál. Ennek igen furcsa következményei lehetnek, mert ha jól belegondolsz, a fordító szemszögéből nézve például egy szoftveres késleltető ciklus is "fölösleges"... Hasonló lehet a helyzet a megszakításból kioptimalizált kódrésszel is: a fordító szerint bizonyára nem csinált semmi "hasznosat".
(#) szitko válasza icserny hozzászólására (») Jún 27, 2013 /
 
Nem értem ezt az egész optimalizációs részt. (eddig nem foglalkoztam vele)
Tehát, ezek szerint azzal, hogy én alacsonyról közepesre kapcsoltam az optimalizációt, bizonyos programrészek kikerültek a programból?
Mi alapján dönti el a program, hogy mi marad, és mi nem? És ha számomra kulcsfontosságú egy késleltetés....
Meg lehet nézni valahol, a már optimalizált programot? Kíváncsi lennék rá, hogy az IAR-nak miért nem fontos egy adat mentése a flash memóriába.....
(#) icserny válasza szitko hozzászólására (») Jún 27, 2013 /
 
Idézet:
„Mi alapján dönti el a program, hogy mi marad, és mi nem?”
Fogalmam sincs, a dokumentáció is elég szűkszavú.
Idézet:
„Meg lehet nézni valahol, a már optimalizált programot?”
A Disassembly ablakban biztosan.
(#) SBahadurD válasza szitko hozzászólására (») Jún 27, 2013 /
 
Lehet, hogy a megszakítást azért szedi ki, mert azt hiszi, hogy soha nem lesz meghívva. Mert ugye nem a szoftver hívja meg, ezért ha csak a kódot nézi az analizáló, tényleg nincs értelme bent hagyni egy függvényt, amit senki nem hív meg. Ugyanez lehet a várakozásnál is, látszólag semmit nem csinál a processzor közben. Hiszen semminek az értéke nem módosul alatta.
(#) szitko válasza SBahadurD hozzászólására (») Jún 27, 2013 /
 
Idézet:
„Lehet, hogy a megszakítást azért szedi ki,”

Nem a megszakítást szedi ki, hanem a megszakításból a flash írást meghívó parancsot.
Röviden: A Timer számlál adott értékig, ha eléri az értéket megszakítást okoz, elvégez a megszakításban pár parancsot, és mielőtt visszatérne elmenti az adatot a flash-be. Ez utóbbi parancsot nem hajtotta végre.

Közben visszaállítottam az optimalizációt alacsonyra. Lefordítottam a program (kivettem pár részt, hogy elég legyen a 8k) és megnéztem/kimásoltam a disassembly ablak tartalmát. Ezek után, ugyanezt medium optimalizációval is megcsináltam, de nem találtam semmi különbséget a két assembly "program" között. Érdekes...

Most megpróbálom átrakni az egész programot CCS-be. Kíváncsi vagy az mit csinál vele...
(#) idlob válasza szitko hozzászólására (») Jún 27, 2013 /
 
Ez egy igen érdekes cikk arról, mi mindenre képes (és mire nem) egy ügyes fordító.
A falsh írása nem túl gyors dolog, ezért megfontolandó lenne kipiszkálni a megszakításból, ami lehet megoldaná a problémádat is egyúttal.
(#) szitko válasza idlob hozzászólására (») Jún 27, 2013 /
 
Kivettem a flash írást, és beraktam máshova. Így a Timer megszakításban mindössze három változó növelése maradt.
Erre a fordító kivette az első változó növelését, illetve a program nem hajtotta végre. Ezért érdekes. Miért pont a Timer megszakítással vacakol...
Azt elfelejtettem írni, hogy amikor "eltűntek" a programrészek, az optimalizációt már visszaállítottam, és egy-két részeltet kiszedtem a programból, hogy pont (~7,99k) beleférjen a uC-be.
(#) DJ Tacki válasza szitko hozzászólására (») Jún 27, 2013 /
 
Bocsánat hogy belekontárkodom, csak egy ötlet.
WinAVR-ben C nyelven a megszakításban (is) használt változókat "volatile" klcsszóval kellett megjelölni, ezzel mondtuk meg a fordítónak, hogy a "tudtán kívül", megszakításban is megváltozhat az értéke, így nem optimalizálta ki regiszterbe, illetve minden használat előtt kiolvasta az értékét a memóriából.
Nem lehet hogy itt is hasonló megfontolásból szedi ki?
(#) szitko válasza DJ Tacki hozzászólására (») Jún 27, 2013 /
 
Sajnos nem. Jelen esetben a változókat csak a megszakításban használom, ezért nem kell a volatile.
(#) hotau hozzászólása Júl 2, 2013 /
 
Szép napot!
Lenne egy olyan kérdésem, hogy szeretnék csinálni egy bicikli világatást 8 ledből ami úgy működne, hogy
1 gombnyomás 8 Led villogtatása egyszerre.
2 gombnyomás Knight Rider "fénycsóva.
3 gombnyomásnál ez futna le OLI felirattal.
Ehhez írtam egy kódot és meg szeretném kérdezni a hozzá értőket, hogy jó e?
A válaszokat előre is köszönöm.

kód:

  1. #include "io430.h"
  2. #include "intrinsics.h"
  3.  
  4. int main( void )
  5. {
  6.   // Stop watchdog timer to prevent time out reset
  7.   WDTCTL = WDTPW + WDTHOLD;
  8.   int szamol = 1;                  // számolja a gomb lenyomásokat
  9.   P2DIR &= ~BIT6;                 //P2.6 legyen digitális bemenet
  10.   if(P2IN & BIT6)           //lenyomásra vár
  11.   {
  12.   szamol++;
  13.   }
  14.   if(szamol = 2) //8 Led villogtatása egyszerre.
  15.   {
  16. P1DIR = 0xFF;                   //P1 minden bitje legyen digitális kimenet
  17. while(1) {
  18. P1OUT = ~P1OUT;               //P1 bitjeit komplementáljuk
  19. __delay_cycles(500000);       //Várakozás kb. 500 ms ideig
  20. }
  21. }
  22.  
  23. if(P2IN & BIT6)           //lenyomásra vár
  24.   {
  25.   szamol++;
  26.   }
  27.   if(szamol = 3) // Knight Rider "fénycsóva"
  28. const char a[]={0x01,0x03,0x07,0x0E,0x1C,0x38,0x70,0xE0,0xC0,0x80};
  29. char i;
  30. void main(void) {
  31. WDTCTL = WDTPW + WDTHOLD;       //Letiltjuk a watchdog időzítőt
  32. P1DIR = 0xFF;                   //P1 minden bitje legyen digitális kimenet
  33. while(1) {
  34. for(i=0; i<10; i++) {
  35. P1OUT = a[i];               //bitminta kirakása a P1 portra
  36. __delay_cycles(50000);      //Várakozás kb. 50 ms ideig
  37. }
  38. i=10;
  39. while(i) { //a ciklus addig fut, amíg i!=0 teljesül
  40. i--;                        //ciklusváltozó léptetése
  41. P1OUT = a[i];               //bitminta kirakása a P1 portra
  42. __delay_cycles(50000);      //Várakozás kb. 50 ms ideig
  43. }
  44. }
  45. }
  46.  
  47. void delay(unsigned int delayTime);
  48. void main(void) {
  49.    WDTCTL = WDTPW + WDTHOLD;    //Hold the WDT (WatchDog Timer)
  50.    P1DIR = 0xff; //Set Port 1 (P1) to output.
  51.    unsigned int i=250; //This is the delay value between each column (found by trial and error)
  52.    while(1){
  53.     P1OUT= 0x00;
  54.     delay(i);  
  55.     P1OUT= 0xff; // 1. oszlop
  56.     delay(i);     // A késés
  57.     P1OUT= 0x81; // 2. oszlop
  58.     delay(i);
  59.     P1OUT= 0x81; // 3. oszlop
  60.     delay(i);
  61.     P1OUT= 0x81; // 4. oszlop
  62.     delay(i);
  63.     P1OUT= 0x81; // 5. oszlop
  64.     delay(i);
  65.     P1OUT= 0xff; // 6. oszlop
  66.     delay(i);
  67.     P1OUT= 0x00; // 7.oszlop
  68.     delay(i);
  69.     P1OUT= 0x00; // 8.oszlop
  70.     delay(i);
  71.     P1OUT= 0xff; // 9.oszlop
  72.     delay(i);
  73.     P1OUT= 0x80; // 10.oszlop
  74.     delay(i);
  75.     P1OUT= 0x80; // 11.oszlop
  76.     delay(i);
  77.     P1OUT= 0x80; // 12.oszlop
  78.     delay(i);
  79.     P1OUT= 0x00; // 13.oszlop
  80.     delay(i);
  81.     P1OUT= 0x00; // 14.oszlop
  82.     delay(i);
  83.     P1OUT= 0xff; // 15.oszlop
  84.     delay(i);
  85.     P1OUT= 0x00; // 16.oszlop
  86.     delay(i);
  87.    }
  88. }
  89. void delay(unsigned int delayTime){
  90. int x;
  91. for (x=0;x<delayTime;x++){
  92. x=x*1;
  93. }
  94. }  
  95.  
  96.  
  97. if(P2IN & BIT6 && szamol =4 )           //lenyomásra vár
  98.   {
  99.   szamol == 1 ;
  100.   }
(#) szitko válasza hotau hozzászólására (») Júl 2, 2013 /
 
Csak átfutottam a kódot, de ez így nem jó!
Az első hiba, hogy 2 "main" függvény van, abból csak egy lehet!
A P2.6 bit (bemenet) vizsgálata utána, a program bemegy egy végtelen ciklusba, és így a "23." sortól, már semmilyen utasítás/parancs nem kerül végrehajtásra.....

Szerintem: A gomb figyelését tedd be megszakításba, majd egy "switch/case" parancs kombinációval döntsd el, hogy mit csináljon a továbbiakban a program.

A 3. gombnyomásnál lévő feltételt, hogy képzelted el? Kezedbe veszed a lámpát, és menet közben rázod? Számomra kicsit fura....
(#) hotau válasza szitko hozzászólására (») Júl 2, 2013 /
 
Szép napot.
Tényleg észrevettem, hogy több main van, a kelleténél a többi gondon még majd gondolkodok.
A 3. at azt úgy gondoltam, hogy rá teszem a kerékre.
Üdv. Olivér
(#) szitko válasza hotau hozzászólására (») Júl 2, 2013 / 1
 
Idézet:
„A 3. at azt úgy gondoltam, hogy rá teszem a kerékre.”

Akkor nem lesz világításod...
(#) SBahadurD válasza hotau hozzászólására (») Júl 2, 2013 /
 
Akkor valahogy a pozícióérzékelést is meg kéne oldani. Pl egy hall szenzorral, meg egy mágnessel, mint a sebességmérőnél szokás. Mondjuk, ha elég úgy, hogy pl. kb 20-25 km/h között legyen látható rendesen, akkor nem kell, de ez elég bizonytalan.
(#) szitko hozzászólása Júl 2, 2013 /
 
Sziasztok.

Először is mindenkitől elnézést kérek, hogy itt a fórumon személyes kérdést teszek fel, de hátha mást is érdekel. (és nem szeretek privát üzenetet küldeni)
Icserny fórumtársunkhoz szólna a kérdésem, mégpedig az Ő általa írt szoftveres UART-al kapcsolatban.
Egy G2553-ba használom a hw UART-ot, és szükségem lenne még egy UART küldés funkcióra. Beraktam a szoftveres UART-ot, de már két napja nem sikerül "behangolni" 3,4MHz-re. 1MHz-en szépen működik mindkettő. Lehet, hogy a nem pontos 3,4MHz (adatlap szerint beállítva) miatt nem megy?
(#) SBahadurD válasza szitko hozzászólására (») Júl 2, 2013 /
 
A gyártó honlapján fent levő mintaprogramok között van egy nagyon jól megcsinált timer alapú UART megoldás. A szinkronizált bemenetek, meg a kimeneti módok miatt tökéletesen pontos, független a szoftveres pontatlanságoktól. Én egy olyan projektet csináltam most g2553-al, amiben 3 UART is kell, és az egyik timerre mindig szükségem van. Így használok egy HW uart-ot, egy timer_uart-t és a watchdog timer segítségével csináltam magamnak a harmadik uart-ot. Teljesen jól működik.
Az órajeleket DCO szolgáltatja. Annak a beállítását szintén a példaprogramok közötti DCO pontos kalibrálását segító programmal csináltam. Ennek az a lényege, hogy a kristály frekvenciájához tökéletesen be tudja állítani DCO-t, csak meg kell mondani, hogy hányszor olyan gyorsa állítsa. Kicsit át kell azt alakítani, mert a flashbe akar írni.
Ja, és 9600bps kommunikációt használok 8N1 üzemmóddal.

Ha nem találod, akkor el tudom küldeni a linkeket.

Amúgy minek pont a 3.4MHz? Miért nem használod valamelyik kalibrált frekvencián? Akkor nem lenne ilyen gond. Mert szerintem elég nehéz lehet adott frekvenciára rendesen beállítani a fent említett módszer nélkül.
A hozzászólás módosítva: Júl 2, 2013
(#) szitko válasza SBahadurD hozzászólására (») Júl 2, 2013 /
 
Idézet:
„Amúgy minek pont a 3.4MHz?”

Külső kvarcot nem akarok használni, 1MHz kevés, a 8MHz meg sok. Továbbá mind a három Timer foglalt, a WDT meg az eredeti feladatát látja el. Ezért használom az Icserny által írt UART-ot, plusz az "egyszerűsége" miatt.

Már akartam kérdezni tőled, hogy sikerült ezt a problémát megoldani?
A minap szembesültem egy hasonló "Timer reset" problémával én is. Beállítottam a Timert, hogy megszakítást okozzon, és ahogy engedélyeztem a megszakításokat a mikrovezélő újraindult (resetelt). A probléma az volt, hogy a TACTL-ben engedélyeztem a megszakítást (TAIE), és nem a TACCTLx-ben.
(#) SBahadurD válasza szitko hozzászólására (») Júl 2, 2013 /
 
Használd a 8MHz-et és használd az órajelleosztást ott, ahol kell. Amúgy az adott példaprogram eredetileg arra van, hogy az információs memóriába elprogramozza a kalibrációs adatokat. Szóval az is lehet, hogy egy 32kHz-es kvarc segítségével kalibrálod a chipet a kívánt frekvenciára, utána újraprogramozod a neked szükséges programmal, úgy, hogy az információs memóriát ne törölje, és a programodban a kívánt adatokat töltöd be DCOCTL és BCSCTL1 regiszterekbe.

Az én megoldásom az volt, hogy nem a XOR műveletet használtam, hanem szépen beítam újra a kívánt paramétereket a regiszterbe. (Ugye az én problémám csak az NMI bekövetke után jelent meg. Ekkor viszont a timer regiszterébe mindig egy adott értéket kellett írni, ezért nem volt szükség a XOR-ra.) Ezután már nem jelentkezett a hiba. De hogy az miért történt, máig nem tudom. Lehet, hogy az ERRATA-t kéne tanulmányozni hozzá.
(#) szitko válasza SBahadurD hozzászólására (») Júl 2, 2013 /
 
Idézet:
„Használd a 8MHz-et és használd az órajelleosztást ott”

2,35-ös osztás sajnos nincs.
A ciklusidőkhöz, és a kijövő PWM jelekhez, a 3,4MHz kell nekem. Csak az SW UART nem megy, minden más tökéletes, és pontos. Próbáltam 4MHz-en is a programom, de túl sokat kellett volna korrigálnom.
(#) SBahadurD válasza szitko hozzászólására (») Júl 2, 2013 /
 
Lassítani mindig lehet valahogy szoftveresen. Gyorsítani nem.
Mondjuk szerintem, ha nagyon pontatlan lenne a 3,4 MHz és ehhez van beállítva a HW UART, akkor annak sem kéne rendesen működnie. De azért az jobban tolerálja az eltérést szerintem, mint a SW UART.
Én anno, mikor még nem értettem a működését a HW UART-nak, csináltam magamnak egy szoftveres UART vevő programot is. Amikor 1MHz-ről járattam, akkor nem működött, nem vette a géptől kapott jeleket rendesen, amikor 16MHz-ről járattam, akkor működött. Valószínűleg pontosabb lett, a rövid utasítások miatt. Mondjuk Icserny adó kódja 1MHz-en is működik. Igaz, az adás egyszerűbb, mint a vétel szerintem. Mondjuk én sem a legjobb megoldást választottam...
(#) bedoweb hozzászólása Júl 2, 2013 /
 
Sziasztok. Olvastam Icserny új cikkét és gondoltam kipróbálom az energia fejlesztőprogramot is. De valamiért, amikor leakarom tölteni a programot a Launchpad-ra, akkor a következő hibaüzenetet kapom: Cannot run program "E:\......\HARDWARE\TOOLS\MSP430\BIN\msp430-g++" : CreatePRocess error=2, A rendszer nem találja a megadott fájlt

véleményetek szerint mi lehet a probléma?
A hozzászólás módosítva: Júl 2, 2013
(#) icserny válasza szitko hozzászólására (») Júl 3, 2013 /
 
Idézet:
„Lehet, hogy a nem pontos 3,4MHz”
Biztos, hogy nem pontos. Az adatlapban található értékek csak körülbelüliek, a gyártási szórás miatt. Ha kiméred, meg tudsz határozni egy beállítást, ami arra a példányra jó.
(#) icserny válasza bedoweb hozzászólására (») Júl 3, 2013 /
 
Próbáld meg valami egyszerűbb helyre kibontani, pl. C:\Energia! (Szóköz, ékezetes karakter ne legyen az elérési útvonalban!)
(#) szitko válasza icserny hozzászólására (») Júl 3, 2013 /
 
Méréseim szerint, csak AD konverziónál változik a freki, +- pár 100Hz-et. Miután vége a konverziónak visszaáll a beállított 3.4MHz-re. Még a hőmérséklet változásra is érzékeny, de jelen eseteben ez elenyésző. Három g2553-t próbáltam, és mindegyiknél ugyanezt tapasztaltam.
Szerencsémre találtam a kacataim között egy 3,42700MHz-es kvarcot, ezzel pontosítom a frekit, és remélhetőleg az sw UART is megjavul.
Köszi.
(#) bedoweb válasza icserny hozzászólására (») Júl 3, 2013 /
 
Köszi, igen az volt a baj
(#) bedoweb hozzászólása Júl 3, 2013 /
 
Sziasztok. Még egy kérdés. Sima C-ben oké, de ebben az Energia feljesztői környezetben azt, hogy érem el, hogy a végtelen ciklus csak a PUSH2 megnyomására induljon?
(#) SBahadurD válasza bedoweb hozzászólására (») Júl 3, 2013 /
 
Szerintem csinálj egy kis ciklust a loop elején, ami csak akkor lép tovább, ha lenyomod a billentyűt. És valami feltételvizsgálattal oldd meg, hogy később már ne akadjon el ott.
Pl.

char n = 1;

loop{
while( "gomb nincs lenyomva" && n);
n = 0;
//És innentől kezdődhet a tényleges feladat.

}
Következő: »»   108 / 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