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   32 / 139
(#) szitko válasza icserny hozzászólására (») Jan 31, 2012 /
 
Megtaláltam, de nem igazán értem. A beállítást nagyjából értem, de amit csinál, azt nem.
Ha jól értelmezem a programot, akkor a value=0x01, és ezt kellene beírnia a 0x1040-től 0x107C-ig. Az IAR viszont csak nullákat írt. 0x1040 = 0x00000000, 0x1044 = 0x00000000, stb... Nem 0x00000001-nek kellene lennie?
(#) icserny válasza szitko hozzászólására (») Jan 31, 2012 /
 
Utóinkrementálásnál (value++) lehet, hogy a növelés előtti értéket adja át, s ekkor jogos a nulla.

A _NOP() sorba tegyél töréspontot, ahogy a program is ajánlja, s ne csak az első futás eredményét nézd meg!
(#) szitko válasza icserny hozzászólására (») Jan 31, 2012 /
 
Én egyesével léptettem. A második futásra már 0x01010101 lett az eredmény. Így már kezdem érteni.
Már csak a visszaolvasást kell megkeressem.
Köszönöm szépen a segítséget!
(#) szitko válasza icserny hozzászólására (») Jan 31, 2012 /
 
Kicsit visszalapoztam itt a fórumban, és DecebaL fórumtársunk már írt a flash írásáról.
Bár így, hogy utánna kellett járnom, legalább tanultam megint egy kicsit.
(#) szitko hozzászólása Jan 31, 2012 /
 
Mégegy apró, ám de fontos kérdés a flash írással kapcsolatban. Hogyan tudom kiolvasni az elmentett értéket? Pontossabban arra gondolok, hogyha valamiért újra beírom a programot, akkor az IAR újraírja a segmenseket, és akkor eltűnik a mentett értékem. Másszóval, hogy lehet kiolvasni a mikrovezérlő tartalmát?
(#) icserny válasza szitko hozzászólására (») Feb 1, 2012 /
 
Lehet kísérletezni azzal, hogy az információs memória törlését letiltod. IAR-nál Project / Options / FET Debugger menüpontban a Download lapon Flash Erase címszó alatt ne az Erase main and Information memory legyen kiválasztva, hanem az Erase main memory!

A kiolvasáshoz pedig az MSP430Flasher programot ajánlom. A kiolvasás módját ebben a hozzászólásban írtam le. A MAIN kulcsszó helyére MAIN, INFO, RAM vagy BSL írható, attól függően, hogy melyik memóriát akarod kiolvasni. (A BSL a bootloadert jelenti, ami a G2xxx sorozatnál nincs.)

Link: MSP430Flasher.exe lelőhelye
(#) szitko válasza icserny hozzászólására (») Feb 1, 2012 /
 
Közben eszembe jutott, hogy ki is írathatom lcd-re, de az IAR-ban való kikapcsolás egyszerűbb, mert kb. 8 változóról lenne szó.
Köszi.
(#) moderboy hozzászólása Feb 2, 2012 /
 
Most láttam, hogy az 5-ös széria chipjei gyárilag beégetett bootstrap loaderrel jönnek a gyárból, valaki használta már ezt, tapasztalatok?
(#) icserny válasza moderboy hozzászólására (») Feb 2, 2012 /
 
Nem, mert egy kicsit agyonbonyolítottnak tűnik.
Hasznos linkek: processors.wiki.ti.com/index.php/BSL (MSP430)
MSP430 Programming Via the Bootstrap Loader (SLAU319A.PDF)
(#) gyengus hozzászólása Feb 2, 2012 /
 
Sziasztok!

CCS4-et használok. Van egy változóm amit hiába adok a Watch ablakhoz, egyszerűen azt mondja rá debugkor, hogy nem találja.
Így néz ki a deklarálás:
  1. double h = -99.0;


A programban egy helyen nyúlok hozzá:
  1. h = b[0] >> 1; // /2
  2. if (b[1] != 0) h *= -1;


A b tömbben benne vannak az adatok amivel számolnia kellene.

A kód többi része működik, azért csatolom. A többi változót, pl a b-t, i-t látom a watch ablakban.

1wire_test.c
    
(#) icserny válasza gyengus hozzászólására (») Feb 2, 2012 /
 
Nem látok double formátumot a Watch ablak menüjében, csak float-ot. Ettől függetlenül, a floatnak deklarált változóra is azt mondta, hogy ismeretlen, amiben tökéletesen igaza van, mert egy h = 1.99; utasítást szúrtam be, s "kioptimalizálta" (nem rakott be semmilyen utasítást).
(#) gyengus válasza icserny hozzászólására (») Feb 2, 2012 /
 
Tehát kioptimalizálja, mert nem használom fel az értékét?
Köszi!

Később persze ki fogom íratni, csak lépésenként haladok és gondoltam elég, ha egyelőre a Watchban látom.
(#) icserny válasza gyengus hozzászólására (») Feb 2, 2012 /
 
Nem néztem végig, csak az általam beírt sornál vettem észre ilyet, a Disassembly ablakban. De könnyen lehet, hogy te is így jártál. Nem nagyon csípem a CCS-t, így nem is tudom, hogy az optimalizálást hol lehet benne szabályozni.
(#) szitko hozzászólása Feb 2, 2012 /
 
Miért csak akkor tudom írni az info. memot, ha elötte törlöm az egész segmenset?
  1. FCTL1 = FWKEY + ERASE;                    // Set Erase bit
  2.   FCTL3 = FWKEY;                            // Clear Lock bit
  3.   *Flash_ptr = 0;                           // Dummy write to erase Flash segment
  4.   FCTL1 = FWKEY + WRT;                      // Set WRT bit for write operation
  5.   *Flash_ptr = value;
  6.   FCTL1 = FWKEY;                            // Clear WRT bit
  7.   FCTL3 = FWKEY + LOCK;                     // Set LOCK bit

Ha a "*Flash_ptr =0;" sort kiveszem, mert nem csak egy adatot szeretnék beírni, akkor nem írja be az adatot.
(#) gyengus válasza icserny hozzászólására (») Feb 2, 2012 /
 
Szerintem is ez lehet a baj. Ha jobban belegondolok a fent említett 2 sort átugrotta debugkor ahol a h az értékadás bal oldalán van.

Mi a baj a CCS4-el? Az IAR-t nem próbáltam.
(#) gyengus válasza gyengus hozzászólására (») Feb 2, 2012 /
 
Két különböző értékadás jobb oldalára kellett betennem a h változót, hogy ne optimalizálja ki a fordító.
(#) szitko válasza szitko hozzászólására (») Feb 3, 2012 /
 
Odáig jutottam az info memória írásaval, hogy kétszer ugyanarra a címre nem enged írni. Ha pl. 0x1000 címre írok egy bájtot vagy szót, akkor ha ugyanerre a címre szeretnék mégegyszer írni, először törölnöm kell az egész szegmenset. De nem értem, hogy miért?
(#) szikorapéter hozzászólása Feb 3, 2012 /
 
Helló. Én az IAR Embended Workbench-et használom.Még kezdő vagyokde már próbálkoztam zeneprogramot gyártani nemsok sikerrel.Ha valaki tudna bemutatónak egy programot feltölteni megköszönném.Előre is kössz.
(#) idlob válasza szitko hozzászólására (») Feb 3, 2012 /
 
A Falsh memóriák destruktív kiolvasásúak,* így valószínűleg technológia okokra vezethető vissza a probléma.
Tehát a szegmenst előbb ki kell olvasnod, megváltoztatnod amit kell, majd visszaírni.
*Módosítás: azt hiszem ez mégsem állja meg a helyét, valószínűleg a címzés körül van valami, de szinte biztos hogy technológiai korlát.
(#) icserny válasza szikorapéter hozzászólására (») Feb 3, 2012 /
 
Idézet:
„Még kezdő vagyokde már próbálkoztam zeneprogramot gyártani nemsok sikerrel.”

Ezt nézd meg!
(#) szitko válasza idlob hozzászólására (») Feb 3, 2012 /
 
Próbáltam máshol is utánanézni (Ti forum), de nem sok sikerrel jártam.
Amit a gyenge angol tudásommal kibogarásztam, az az, hogy ha írni akarom az xy szegmens xy címét, előtte törölni kell az adott szegmenset (kivéve első írás). A programomban valahogy így néz ki:
- program indulás/mikrovezérlő indulása
- 0x1000 cím olvasás/xy regiszerbe írás
- a program egyéb műveletei
- a program leállása elött: szegmens D törlése (0x1000)cím
- 0x1000 cím írása
- program vége/ mikrovezérlő leállása.
Ezzel csak az a bajom, hogy mivel nem tudok ugyanarra a címre (pl 0x1000) kétszer egymás után írni, ezért minden mentett adatot ki kell olvassak az adott szegmensből mielött törlöm.
(#) idlob válasza szitko hozzászólására (») Feb 3, 2012 /
 
Az angol Wikipédia következő cikkének Korlátok részének Blokk törlése szakaszát (képességeimhez mérten) alább lefordítottam:

"Egyfajta korlátja a flash memóriának, hogy ugyan olvasható vagy írható egyetlen bájt vagy egyszerre egy egész szó véletlen hozzáférés formájában, törölni csak egy egész "blokkot" lehet. Ez általában a blokk összes bitjét 1-be állítja. Egy frissen törölt blokkal kezdve, annak bármely pontja írható. Azonban ha egy bit 0-ba lett állítva, csak az egész blokk törlésével állítható vissza 1-be. Más szóval a flash memória (különösen a NOR flash) véletlenszerű olvasási és írási műveleteket nyújt, de nem kínál tetszőleges véletlen-hozzáférésű újraírási vagy törlési műveletet. Egy pozíció azonban egészen addig írható amíg az új érték 0 bitjei felülbírálják a felülírt értéket [v.ö. maszkolási technikákkal]. Például egy nibble-t [fél bájt, nem tudom minek fordítják] értéke 1111-be törölhető, majd írható 1110-ra. A következő írások erre a nibble-re meg megváltoztathatják 1010, majd 0010-ra, végül 0000-ra. Lényegében a törlés 1-re állítja (az összes) bitet, míg az írás csak törölni [0-ba állítani] képes a biteket."

Ez alapján az a gyanúm, hogy a megállapításod helyes, valóban nem feltétlen tudsz kétszer egymás után ugyanoda írni, és a törlés előtti mentés elől nincs menekvés.
(#) szitko válasza idlob hozzászólására (») Feb 3, 2012 /
 
Igen, sajnos ehez hasonlókat olvastam Én is. Engem az zavart meg, (de nagyon) hogy a FUG-ban nem találtam erre a problémára való utalást. (vagy rosszul értelmeztem a leírtakat) A jelen írás/törlés megoldással 6-7 16bites változót rakok be 2 szegmensbe. Ha több adat elhelyezésére szorulok, ikább egy soros EEPROM-ot fogok használni. A lényeg ,hogy megoldódott, igaz kicsit körülményes, de működik rendesen.
(#) szitko hozzászólása Feb 4, 2012 /
 
Megjelent a fritzing 0.7-es verziója. Benne van a Launchpad, és sok új alkatrész.
(#) gyengus hozzászólása Feb 5, 2012 /
 
Sziasztok!

Egy érdekes problémám van:
Az áramkör bekapcsolása után olyan, mintha nem futna le a mainben a ciklus. Detektálnia kéne a hőérzékelőt, majd bekapcsolni az egyik ledet, aztán kiolvasni a hőmérsékletet és átváltani a másik ledre.
Ha resetet vagy S2-t nyomok, utána rendesen fut a program. Akkor is működik, ha debuggolom.
S2 hatására elölről kezdi a hőmérséklet mérést.

Olyan, mintha kifelejtettem volna valami inicializálást.
Szerintetek mit hagytam ki?
A Launchpad FETje bekavarhat?

1wire_test.c
    
(#) DecebaL válasza gyengus hozzászólására (») Feb 5, 2012 /
 
one_wire_setup(&P1DIR, &P1IN, BIT7, 1); // P1.7
a fenti sornál áll meg a programod.
probáld meg igy:
one_wire_setup(&P1DIR, &P1IN, 1 << ow_pin7, 1);>>
(#) gyengus válasza DecebaL hozzászólására (») Feb 5, 2012 /
 
Megáll?
És miért csak első induláskor?
Nekem az a furcsa, hogy debugkor, reset vagy megszakítás után már rendesen fut. Sőt, újraprogramozás után is jó.
Tehát a hiba csak a mikrovezérlő első bekapcsolásakor fordul elő.

A One-Wire kezelést a 43oh.com fórumán találtam, ott is így használja a setup hívást.

Azért kipróbálom. Köszönöm a tippet!
(#) gyengus válasza gyengus hozzászólására (») Feb 5, 2012 /
 
Kipróbáltam, a helyzet változatlan.
Nincs definiálva ow_pin7 néven a kódban semmi. Jól gondolom, hogy 7-nek kell lenni?
  1. one_wire_setup(&P1DIR, &P1IN, 1 << 7, 1); // P1.7

Szerintem az 1 << 7 eredménye ugyanaz, mint a BIT7.
(#) szikorapéter válasza icserny hozzászólására (») Feb 5, 2012 /
 
Hali.Ezen az oldalon már megpróbáltam áttölteni a main.c-t de valamiért nem sikerült hibák sorozatát találta benne.Én c main-ba csináltam lehet ez volt a baj,nemtudom.
(#) gyengus válasza gyengus hozzászólására (») Feb 5, 2012 /
 
Közben próbálgattam egy egyszerűbb kódot, az is csinál hasonló fucsaságokat.
A program induláskor a P1.6-ot kimenetnek és alacsonra állítja.
A hiba hasonló: első bekapcsoláskor P1.6 kimenet ugyan, de magas. Reset, megszakítás után, vagy debuggoláskor ellenben jól fut a program.
A 21. sorban 0-ázom az összes kimenetet:
  1. P1OUT = P2OUT = 0; // kimenetek 0-ázása


Nem értem, mik ezek az induláskori animáliák.
Csatolom a kódot. Ez nem használja a One-Wire libraryt, ezért nem hiszem, hogy azzal lenne a gond.

main.c
    
Következő: »»   32 / 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