Fórum témák
» Több friss téma |
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?
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!
É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!
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.
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?
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
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.
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?
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)
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:
A programban egy helyen nyúlok hozzá:
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.
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).
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.
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.
Miért csak akkor tudom írni az info. memot, ha elötte törlöm az egész segmenset?
Ha a "*Flash_ptr =0;" sort kiveszem, mert nem csak egy adatot szeretnék beírni, akkor nem írja be az adatot.
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.
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ó.
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?
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.
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.
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.
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.
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.
Megjelent a fritzing 0.7-es verziója. Benne van a Launchpad, és sok új alkatrész.
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?
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);>>
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!
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?
Szerintem az 1 << 7 eredménye ugyanaz, mint a BIT7.
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.
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:
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. |
Bejelentkezés
Hirdetés |