Fórum témák
» Több friss téma |
Írj egy saját késleltetést ( for ciklus ), abból tudsz break utasítással kilépni!
Steve
Ha nem olvastad Icserny forumtársunk cikkét akkor javaslom nagyon jó tananyag.
Cikk 1 Cikk 2
Még most kezdi, a megszakítás megértése gondot okozhat!
Steve
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.>
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?
Az elöbb elfelejtettem csatolni a kb 2MHz beállításom.
Az adatlap szerint 3V-n 2.3MHz-nek kellene lennie, de valamiért nem megy nálam.
Sikerült
![]() 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.)
Gratulálok, ez tényleg egy bravúros elektronikus és mechanikus munka!
![]() Boldog Karácsonyt és új évet kívánok minden MSP430 rajongónak! ![]()
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!
Nagyon jó, nekem tetszik, gratulálok.
Boldog Karácsonyt kívánok mindenkinek!
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??
Szia.
A ciklusmag (a+b), addig fut, míg x nem lesz egyenlő y-nal. Ha viszont így írod:
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.
Helyesbítek:
Csak akkor fut tovább a program, ha x=y-nal.
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.
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.
A kapcsolást meg a Disassembly ablak tartalmát kell(ene) megnézni!
Az egyenlőséget (==) és az értékadást (=) rendszeresen összekeverem, elnézést kérek érte.
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.
Nem egészen értem. Számomra a while() egy feltételes ugróutasítás. Például:
Ez lefordítva nagyjából így néz ki:
Fúú ez az asembly nekem kínai! Mennyivel egyszerűbb, és világosabb a C, egy két apró kis furcsaságot kivéve.
![]() ![]()
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)
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
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.
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
A RESET láb fel van húzva (pl. 10 kOhm-mal) a tápfeszültségre?
47K-s ellenállást tettem a kapcsolási rajz alapján.
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.
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. |
Bejelentkezés
Hirdetés |