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   24 / 139
(#) kissi válasza Beachway hozzászólására (») Dec 19, 2011 /
 
Írj egy saját késleltetést ( for ciklus ), abból tudsz break utasítással kilépni!

Steve
(#) DecebaL válasza Beachway hozzászólására (») Dec 19, 2011 /
 
Ha nem olvastad Icserny forumtársunk cikkét akkor javaslom nagyon jó tananyag.
Cikk 1
Cikk 2
  1. void main(void)
  2. {
  3.   WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  4.  
  5.   CCTL0 = CCIE;                             // CCR0 interrupt enabled
  6.   CCR0 = 50000; //  a változtatással tudod az időzítő idejét változtatni
  7.   TACTL = TASSEL_2 + MC_1;                  // SMCLK, upmode
  8.  
  9.   _BIS_SR(GIE);          
  10.  
  11. // saját forráskód
  12. }
  13.  
  14. // Timer A0 interrupt service routine
  15. #pragma vector=TIMERA0_VECTOR
  16. __interrupt void Timer_A (void)
  17. {
  18.   // ide írd be az időzítési kódod vagy novelj egy számlálót és akkor a main -ba írd meg az időzítést
  19. }
(#) kissi válasza DecebaL hozzászólására (») Dec 19, 2011 /
 
Még most kezdi, a megszakítás megértése gondot okozhat!
Steve
(#) icserny válasza Beachway hozzászólására (») Dec 19, 2011 /
 
A "bazi nagy" __delay_cycles(2000000) késleltetést oszd fel kis szeletekre, így:

for(i=0;i<200;i++) {
__delay_cycles(10000);
}

Ezen a cikluson belül csinálhatsz "kiugrási feltételt". Gondolom, erre akart rábeszélni Kissi kolléga is, csak egy kicsit konkretizáltam, a jobb érthetőség kedvéért.>
(#) szitko hozzászólása Dec 19, 2011 /
 
Sziasztok.
Kb. másfél éve kezdtem el egy projektet, és most a LaunchPad-nak köszönhetően 90%-osan kész. Kellett még hozzá, rengeteg tanulás, és kitartás, mivel teljesen egyedül csináltam. Van még pár
kép és egy rosszul sikerült videó.

Viszont egykis gondom támadt a freki beállításával. Alapban 1MHz-en megy a program, de túl lassú, és valamiért nem tudom beállítani 2Mhz-re. Tudna ebben valaki segíteni?
(#) szitko válasza szitko hozzászólására (») Dec 19, 2011 /
 
Az elöbb elfelejtettem csatolni a kb 2MHz beállításom.
  1. //---------------------------- Freki beállítás ------------------
  2.      DCOCTL = DCO0 | DCO1;           // DCO = 3, MC = 0
  3.      BCSCTL1 = XT2OFF+RSEL0+RSEL3;   // RSELx = 9

Az adatlap szerint 3V-n 2.3MHz-nek kellene lennie, de valamiért nem megy nálam.
(#) Beachway hozzászólása Dec 20, 2011 /
 
Köszönöm mindenkinek a segítséget!!
(#) szitko válasza szitko hozzászólására (») Dec 23, 2011 /
 
Sikerült . Ismét a kapkodás volt a bűnös és ez négy napomba került. A hiba az volt, hogy csináltam egy panelt, amibe beültetem a Launchpad-ot, és ugye onnan kap tápot, tehát amikor belrakom a helyére a VCC, RST, TEST, jumpereket leveszem, ha kiveszem a LP.-t visszarakom. Ez utobbi elmaradt, vagyis csak a VCC-t nem tettem vissza amikor rádugtam a számítógépre, és nem kapott tápot. Vagyis kapott valamit mert az IAR néha felismerte.
Mivel megnöveltem a frekit, így már normálisan megy a "segway". Nem döl el. (Olyan mint egy egyensúlyozó robot, csak nagyban.)

LP.jpg
    
(#) t0bi válasza szitko hozzászólására (») Dec 23, 2011 /
 
Gratulálok, ez tényleg egy bravúros elektronikus és mechanikus munka! Remélem, rövidesen végleg elkészül, majd kérünk egy videót, ahogy ezen gurulsz.

Boldog Karácsonyt és új évet kívánok minden MSP430 rajongónak!
(#) szitko válasza t0bi hozzászólására (») Dec 23, 2011 /
 
Köszi, feldobtam a lentebb linkelt oldalra egy új videót. Már mentem vele, de a karácsonyi készülődés miatt nem sok időm van normális videót csinálni.
Véleg akkor fog elkészülni, ha sikerül két MSP430-at összekötni, valamilyen módon. Az ok, amiért össze akarom kötni őket, mert szeretném LCD-n megjeleníteni a sebességet, akkufeszt, H-híd hőmérsékletet, és ha szükséges a gyorsulásmérő középérték állítását megvalósítani. Ezek viszont nem férnek el ebben a uC-ben.

Boldog Karácsonyt és kevés munkát kívánok mindenkinek!
(#) DecebaL válasza szitko hozzászólására (») Dec 24, 2011 /
 
Nagyon jó, nekem tetszik, gratulálok.
Boldog Karácsonyt kívánok mindenkinek!
(#) szitko válasza DecebaL hozzászólására (») Dec 26, 2011 /
 
Köszi szépen.
(#) Beachway hozzászólása Dec 27, 2011 /
 
Van itt még valami amit nem igazán értek! A while ciklus működése a következő: while(kifejezés) { utasítás1; utasítás2; } Viszont az én programomban ez nem így történik.
while(P1IN & BIT4) {
P1OUT = 0X00;
}
while(P1IN & BIT3) {
P1OUT = 0X01;
P1OUT = 0X80;
P1OUT = 0X40;
}
While(P1IN & BIT2) {
P1OUT = 0X00;
P1OUT = 0X40;
}
Nos mikor a BIT4 feltétel teljesül, a 0X01; 0X80; 0X40 utasítások kerülnek megvalósításra.Majd mikor a BIT3 feltétel teljesül, a 0X00; 0X40; utasítások következnek.
A tanultak szerint pedig nem így kellene lennie, ha nem mikor a BIT4 teljesül, a 0X00; és a BIT3 nál a 0X01; 0X80; 0X40; Van ennek valami magyarázata, vagy ez a fordító egy fajta hibája??
(#) szitko válasza Beachway hozzászólására (») Dec 27, 2011 /
 
Szia.
  1. while(x=y) {
  2. a + b;
  3. }

A ciklusmag (a+b), addig fut, míg x nem lesz egyenlő y-nal.
Ha viszont így írod:
  1. while(x=y);
  2. a + b;

akkor a cilkusmag (a+b), csak akkor fut le, ha x=y.
Remélem érthető, mert Én is csak kezdő vagyok a C-ben.

Kérés: Használd a kód gombot, mert átláthatóbb a progi részlet.
(#) szitko válasza szitko hozzászólására (») Dec 27, 2011 /
 
Helyesbítek:
  1. while(x=y);

Csak akkor fut tovább a program, ha x=y-nal.
(#) Beachway válasza szitko hozzászólására (») Dec 27, 2011 /
 
Nem igazán értelek. Én minden esetben határozottan elválasztottam a feltételt () ,az utasításoktól {};;.Tehát ez nem csúszhatott el.
(#) icserny válasza szitko hozzászólására (») Dec 27, 2011 /
 
Több hiba van a leírtakban:
1. Az egyenlőség vizsgálata "==" jellel történik.
2. "a + b" helyett pl. c = a + b;-t írj!
3. A while ciklus a leírtakhoz képest fordítva működik, tehát a ciklusmag mindaddig ciklikusan végrehajtódik, amíg a feltétel igaz.

  1. while(x==y);
  2.     c = a + b;
Itt az üres ciklus ismétlődik ("várakozás"), amíg a feltétel teljesül, a következő sor pedig akkor hajtódik végre, amikor a feltétel (már) nem teljesül.
(#) icserny válasza Beachway hozzászólására (») Dec 27, 2011 /
 
A kapcsolást meg a Disassembly ablak tartalmát kell(ene) megnézni!
(#) szitko válasza icserny hozzászólására (») Dec 27, 2011 /
 
Az egyenlőséget (==) és az értékadást (=) rendszeresen összekeverem, elnézést kérek érte.
(#) Beachway válasza icserny hozzászólására (») Dec 27, 2011 /
 
Ha jól gondolom ez valami olyasmi lehet mint a digitális áramkörökben használt tárolók, melyek két darab kapuáramkörből tevődnek össze.És elég egy pillanatra beírni a tárolóba, az meg is jegyzi annak állapotát.Jelen esetben a kaput egy while ciklus alkotja.És a két while ciklus pedig a memóriát szimbolizálja.Én ezt valahogy így tudom az ismertekkel össze egyeztetni.
(#) icserny válasza Beachway hozzászólására (») Dec 27, 2011 /
 
Nem egészen értem. Számomra a while() egy feltételes ugróutasítás. Például:
  1. int main( void ) {
  2.   int i=5,j=1;
  3.   while (i>j) {
  4.      j=j+1;
  5.   }
  6. }

Ez lefordítva nagyjából így néz ki:
  1. main:
  2. ;---  int i=5,j=1; --------------
  3.  001120    403F 0005    mov.w   #0x5,R15   ;i = 5
  4.  001124    431E         mov.w   #0x1,R14   ;j = 1
  5.  001126    3C01         jmp     0x112A     ;a feltételhez ugrik
  6.  001128    531E         inc.w   R14        ;j = j +1  (a ciklus törzse)
  7. ;----  while (i>j) {
  8.  00112A    9F0E         cmp.w   R15,R14    ;i és j összehasonlítása
  9.  00112C    3BFD         jl      0x1128     ;sipirc vissza, ha i>j teljesül
  10. ;--- }
  11.  
  12. _exit:
  13.  001132    4030 110C    br      #0x110C    ;program vége
Tehát először átugorja a ciklus törzsét, a feltételvizsgálat pedig a kiértékelés eredményének függvényében vagy visszaküldi, vagy nem.
(#) Beachway válasza icserny hozzászólására (») Dec 27, 2011 /
 
Fúú ez az asembly nekem kínai! Mennyivel egyszerűbb, és világosabb a C, egy két apró kis furcsaságot kivéve. Vannak esetek mikor a gyakorlat és az elmélet nem egyezik.Tudom, hogy mit csinál a gyakorlatban, és ezt belekalkulálom az elméletbe.Talán ha még sokat tanulok a témában meg fogom egyszer érteni.
(#) icserny válasza Beachway hozzászólására (») Dec 27, 2011 /
 
Kínai? Pedig magyarul igyekeztem kommentálni...
Nem olyan bonyolult:
- Az i és j változóknak a fordító kinézte az R15 és R14 regisztereket és belepakolta a kezdőértékeket.
- A jmp utasításról könnyű kitalálni, hogy ugrik a megadott címre.
- Az inc az inkrementálást jelent (a fordító bölcsen rájött, hogy a j = j +1 helyett egyszerűbb a j++ utasítást végrehajtani).
- A cmp utasítás pedig az összahasonlítás (compare), ami más mikrovezérlőhöz hasonlóan itt a j-i kivonásnak megfelelően állítja be a státuszbiteket.
- A jl utasítás pedig feltételes ugróutasítás, csak akkor ugrik vissza, ha az i>j feltételeknek megfeelően állnak a státuszbitek (ennek részleteibe tényleg ne menjünk bele, főleg hogy lustaságból előjeles változótípust adtam meg, aminek jóval bonyolultabb az összehasonlítása)
(#) mzozo95 hozzászólása Dec 29, 2011 /
 
Sziasztok!

Szeretnék egy pwm jelet 'visszafejteni' ezzel az egységgel. A jel egy RC-szervó vezérlőtől(távirányító), a jel kitöltése 1 és 2ms között változik, ami 20ms-onként frissül .

Lehetséges ez valahogy? Csak úgy lehetséges, hogy szoftveresen állandóan figyeltetném a bemenet szintjét? Vagy van erre egy elegánsabb módszer is, ami nem foglalja le a teljes cpu-t?

Valaki tudna segíteni?

Előre is köszönöm!
Zoltán
(#) icserny válasza mzozo95 hozzászólására (») Dec 29, 2011 /
 
Impulzus-szélesség mérésre a Timer_A2 Input Capture módja használható. A Timer menjen szabadonfutó (continuos) módban, s az 1. vagy 2. Capture/Compare modult be kell konfigurálni Capture módba úgy, hogy a bejövő jel felfutásakor és lefutásakor is adjon egy megszakítást és tárolja el TAR tartalmát.

Bonyodalom akkor van, ha a Timer túlcsordul, azokat is figyelembe kell venni. De ha induláskor és minden lefutás után nullázod a TAR regisztert, akkor nálad nem lesz túlcsordulás MCLK=SMCLK=1 MHz esetén.
(#) hayes987 válasza icserny hozzászólására (») Dec 29, 2011 /
 
Helló!

Újra csak a régi problémámra keresek megoldást. Próbapanelen összeraktam egy msp2211-es felprogramozott ic-t. A mikorovezérlőn egy ledvillogtató program van, ami a launchpad-ben működött is, de a próbapanelen nem. Az ic 2 db. 1,5 voltos elemről kapja az áramot, a (+) -t kötöttem a VCC-re, a (-) -t pedig GND-re. A VCC és GND közé tettem egy 100nF (0.1 uF) kondenzátort, a ledet, az ellenállással pedig a megfelelő portokra és a GND közé tettem. A probléma az, hogy a 3 ledből 2 nem csinál semmit, a harmadik pedig folyamatosan világít.

Üdv: Hayes
(#) icserny válasza hayes987 hozzászólására (») Dec 29, 2011 /
 
A RESET láb fel van húzva (pl. 10 kOhm-mal) a tápfeszültségre?
(#) hayes987 válasza icserny hozzászólására (») Dec 29, 2011 /
 
47K-s ellenállást tettem a kapcsolási rajz alapján.
(#) icserny válasza hayes987 hozzászólására (») Dec 29, 2011 /
 
Hát akkor más okot nehéz kitalálni. Esetleg azzal próbálkozhatsz, hogy Debug helyett Release módú programot fordítasz. IAR EW-nél a Project menü Edit Configurations pontjában lehet kiválasztani...

Ha a Launchpad kártyán programletöltés után J3-ról a VDD kivételével az összes átkötést lehúzod és megy a program, akkor a próbapanelon is mennie kell.
(#) hayes987 válasza icserny hozzászólására (») Dec 29, 2011 /
 
Oké, próbálkozom még, hátha rájövök.
Launchpad-en működik a dolog, úgy is hogy nem usb-ről, hanem külső 5V-ról üzemeltetem és lehúzom mind az 5 J3-as jumpert.
Azért köszönöm a segítséget.
Következő: »»   24 / 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