Fórum témák
» Több friss téma |
Sziasztok.
Ha engedélyezem a WDT-t "örkutya módban", akkor 32ms-ként ki kell adjam a "WDTCTL = WDTPW + WDTCNTCL;" parancsot? A hozzászólás módosítva: Jan 15, 2013
Igen, 1 MHz SMCLK és maximális (15 bites) leosztásnál 32,767 ms alatt túlcsordul a WDT, ha közben nem törlöd.
Szeretném az "agyonbonyolított" programomban bekapcsolni a WDT-t, ha valami oknál fogva elakad valahol a program, indítsa újra. De.... az újraindítás előtt el kéne menteni pár nagyon fontos változó értékét a flash-be. A mentéssel nincs problémám, de azt nem tudom, hogy állítsam be a WDT-t, hogy ezt megcsinálja nekem.
Ha beállítom a WDT-t, hogy megszakítást okozzon és ott menteném az adatokat, akkor ha a program épp egy másik megszakításban akad el, soha nem jut el a WDT megszakításig. Vagy a WDT megszakítás máshogy működik? Vagy csak én nem értek valamit? Ha viszont engedélyezem a WDT-t, és, feltételezzük a 32ms-ot, 32ms-ként törlöm, akkor a "hibánál" nem lesz mentve semmi, mert resetel, mielőtt tudnák menteni.
Emlékeim szerint a WDT-nek nagyobb a prioritása a többi program megszakításénál. Ha RESET-re konfig-olod, akkor imho mindenképp végrehajtódik. Viszont ilyen beállítás mellett szerintem nem tudsz egyéb utasításokat végrehajtani a reset előtt. Nagy időveszteség lenne ha a "fontos adatokat" folyamatosan a flash-ben tárolnád és abból dolgozna a program? Vagy a korlátozott számú újraírhatóság miatt aggódsz? Ha nagy hülyeségeket írtam bocs' ne vedd készpénznek, valaki hozzáértő majd megmondja a tutit
Idézet: Megszakításként, sajnos, nem egészen. Lásd adatlap Table 5.-ben!„Emlékeim szerint a WDT-nek nagyobb a prioritása a többi program megszakításénál.” Timer1 és Comparator A+ leelőzi. Ennek ellenére én ezzel próbálkoznék (mármint a WDT megszakítással). Egyébként a WDT-hez az ACLK órajel is hozzárendelhető, így lényegesen hosszabb türelmi időszak is beállítható. (Ha nincs kristály, akkor VLO-t engedélyezni kell!) A hozzászólás módosítva: Jan 15, 2013
Idézet: „Nagy időveszteség lenne ha a "fontos adatokat" folyamatosan a flash-ben tárolnád és abból dolgozna a program?” Igen. Idézet: „Vagy a korlátozott számú újraírhatóság miatt aggódsz?” Igen. A program "hosszútávra" készül, és az állandó flash újraírás, nemcsak "sok" időbe telik, hanem, hamar kihasználnám az újraírhatóság korlátait. Idézet: „Ennek ellenére én ezzel próbálkoznék” Összedobtam egy programot, amiben engedélyeztem a WDT megszakítást. Csináltam egy "fals" hardveres i2c rutint megszakítással. Úgy csináltam meg, hogy az i2c olvasási rutinnál leálljon a program a megszakításban. Vártam, de nem ment be a WDT megszakításba. Az a legnagyobb problémám, hogy a program elég sok időt tölt a különböző megszakítási rutinokban, és ha ott akad el, akkor..... nem ér semmit az "őrkutyus". Idézet: ... akkor az a program rosszul van megtervezve. Megszakításba nem szabad blokkoló várakozásokat rakni.„Az a legnagyobb problémám, hogy a program elég sok időt tölt a különböző megszakítási rutinokban, és ha ott akad el, akkor...” A WDT megszakítás használatának feltétele, hogy a megszakításokból visszatérjen a program, s a WDT-nál magasabb prioritású megszakításjelző bit ne "ragadjon be". Ha nem ilyen a programod, akkor csak a WDT reset jöhet számításba, akkor viszont gond lesz a mentéssel. Idézet: Bocs, ha nem jól értem és esetleg nem jót mondok, de PIC-ezek jellemzően ! Ott a WDT újraindítás miatt "nem mennek tönkre" a változók értékei, csak az SFR regiszterek értékei állnak alapállapotba, pl. adatirány regiszter, hiszen a tápfeszt nem veszed el! Induláskor meg tudom nézni, hogy mi okozta a RESET-et ( gondolom itt is ) és annak megfelelően cselekszem ! Úgy gondolom, hogy itt is megtalálod újraindítás után a menteni kívánt változóidat ( ha meg be-kimenetekről beszélünk, annak csinál árnyékregisztert folyamatosan!„De.... az újraindítás előtt el kéne menteni pár nagyon fontos változó értékét a flash-be.” Steve A hozzászólás módosítva: Jan 15, 2013
Idézet: „Megszakításba nem szabad blokkoló várakozásokat rakni.” Ha ez blokkoló várakozásnak számít: Egy RTC megszakítást idéz elő (port_2), és a megszakításban kezelem le az LCD rutinokat is (óra kiírása). Miután kiírta az LCD-re az időt, kiszáll a megszakításból. Akkor tényleg rosszul írtam meg a programot.
Esetleg az nem megoldás, hogy nem használod a Timer1-et, csak a Timer 0-t, akár counter változókkal? Annál viszont a WDT prioritása nagyobb.
Amúgy le van az valahol (összefoglalva) egzaktul írva, hogy mi történik resetkor? Mi veszik el, mi nem, milyen regiszterek állítódnak mire, stb...
Egyenlőre a szívinfarktus határán mozgok, mert egy egyszerű WDT törlést nem tudok megcsinálni.
1.:A program indításánál kikapcsolom a WDT-t :WDTCTL = WDTPW + WDTHOLD; 2.:Miután mindent beállítottam (port, stb), engedélyezem:WDTCTL = WDTPW + WDTSSEL; // VLO Eddig minden a "nagy könyv" szerint megy, és a szimulációs ablakban úgy állnak a WDT bitjei, ahogy a parancsot kiadtam. De, ahogy kiadom a WDT törlés parancsot, tehát '1'-be állítom/állítanám a WDTCNTCL bitet, abban a pillanatban resetel a mikrovezérlő, holott törölnie kéne a számlálót. De nem adom fel, úgyis megoldom valahogy. Ja. Használd a válasz gombot, mert így elég nehéz kibogarászni, hogy kinek írsz. Köszi!
Do not try to set only the WDTCNTCL bit either, as follows:
WDTCTL_bit.WDTCNTCL = 1; // Crashes This causes a reset because it violates the password protection. Maybe the watchdog is not quite so simple after all. Nem lehet, hogy nálad is ez a gond? Mármint, hogy a WDTCNTCL bitet birizgálod PW nélkül?
Nem hiszem, bár most már semmiben nem vagyok biztos.
A teljes parancs: WDTCTL = WDTPW + WDTCNTCL; // WDT törlése Az az érdekes, hogy igazából a WDT "eredeti (Watchdog mód)" funkciójáról alig találni valamiféle komolyabb leírás.
Komolyabb leírás: MSP430x2xx Family User's Guide
A WDC watchdog módban egy PUC (Power-UP Clear)-t indikál (ha a WDT lejárt vagy nem megfelelő értéket kapott a felső (PW) bytera /05Ah/). Tehát az a kérdés, hogy PUC hatására mi történik a RAM-ban lévő adatokkal és mennyire tudod ezt újra használni. Úgy gondolnám, hogy mivel végig tápfeszen van és nem láttam, hogy írná a törlést, az megmarad... Több helyen ír ilyesmiről, pl. Digital I/O Registers szekció (341. oldal): Initial state oszlop - Reset with PUC vagy Unchanged. Ez alapján pl. P1, P2 kimenet nem változik meg, persze szinte minden mást újra kell konfigurálni. Egy másik oldalon pl azt írják, hogy - Néhány C fordító automatikusan tartalmaz kódot, ami törli a RAM-ot PUC esetén (ez a jó, ha tudod kategória) - Ha WDT okozta, az normál körülmények között változatlanul hagyja a RAM-ot. Habár ha processzor crash miatt járt le, nincs módja megtudni, mit csinált a RAM-mal a processzor a watchdog resetet megelőzően. - WDT security megsértés: általában programhiba vagy processzor crash okozza. Ne bízz a RAM-ban. (Ill. az egyéb, súlyosabb hibák esetén sem.) Idézet: „Komolyabb leírás.....” Helyett: Komolyabb leírás! Ezzel kellett volna kezdenem. Mindenesetre köszi. Maradva az előzőkben felvetett hibánál (WDT számláló törlése), odáig eljutottam, hogy ha a WDT a VLO-t használja, nem fogadja el a számláló törlő parancsot, hanem a parancs kiadásával rögtön reset lesz. Viszont ha az SMCLK-t használja, minden rendben megy. Idézet: „persze szinte minden mást újra kell konfigurálni.” Ez lenne a célom hiba esetén. A "szerkezet" egy folyamatosan változó hőmérsékletű helyre lesz beépítve, természetesen az alkatrészek tűrésén belül változik a hőmérséklet, és ha valamiért megállna a program futása, elég nagy galibát okozna.
Sziasztok!
Tömören az eddigiek, amik meg vannak: 1. ledek fényerejét szabályozom három funkcióval: +, -, és magától erősödő fény, amelyek közül három bemenet nyomógombjával lehet választani. 2. Icserny iránymutatása alapján a beállított fényerőt három különböző portra tudom irányítani. 3. a program alapját a: 8_2. lista: a pwm_led program adja. További három dologra lennék kíváncsi az igen lassan haladó projektemmel kapcsolatosan: 1. A ledek az idejük nagy részében nem világítanak, ezért gondoltam, hogy ekkor (amikor idx==0) aludhatna lpm4-ben az uc, energiatakarékosság végett. Viszont teljesen elvesztem a dologban... A kód bizonyára bőven tartalmaz sallangokat...
A további 2 dologról csak az lpm4 megoldása után kérdeznék... Minden segítséget szívesen fogadok. A hozzászólás módosítva: Jan 16, 2013
Azt hiszem, hoyg a program megérett arra, hoyg kihajítsd és az egészet újragondold. Ne a meglevő kódot próbáld toldozgatni, hanem előbb funkcionális blokkokban gondolkodva tervezd meg papíron az egészet!
Mindenestre megszakításban sem késleltetést, sem altatást nem szabad csinálni. A P1SEL = xxxx; típusú beállításokat pedig mellőzni kellene a lehetséges mellékhatások miatt. Meg kell szokni, hogy mindig csak azokat a biteket változtasd, amelyeket kell, különben a program későbbi bővítésénél meglepetések érhetnek! Amit most a megszakításokban csinálsz, annak 90 %-át a főprogramban kellene végrehajtani, s akkor esetleg az LPM4-et is meg tudnád oldani. Ha a nyomógombokat megszakításban akarod kezelni, akkor ott elég konstatálni, hogy melyik gomb okozott megszakítást (be kell állítani egy változót), s a főprogramot kell felébreszteni. Én a főprogramban kezelgetném az összes csatornaváltást, és a kitöltési tényező nyomógombbal történő változtatást is. (Ez utóbbi lehetővé tenné azt is, hogy a főprogram eldöntse azt is, hogy melyik módban altassa magát). Nyomógomb pergésmentesítésére nem szabad a megszakításba késleltetést rakni. Ha periodikus megszakításban mintavételezed a nyomógombot, akkor a pergésmentesítés módja az legyen, hogy: 1. módszer: nem minden ciklusban nézel rá, hanem csak minden n-edikben (be kell vezetni egy számlálásra használt változót). 2. módszer: minden ciklusban ránézel, de csak akkor veszed komolyan, ha egymás után n-szer ugyanazt az állapotot láttad.
Köszi!
Régóta áltattam magam, hogy jó ez így csak egy kicsit kell rajta csiszolni... Régen elölről kellett volna kezdeni. Még egyszer köszönöm az építő kritikát, este nekilátok!
Ebben az esetben viszont, hogy ne toldozgatás legyen, a másik két dolgot is előadom:
1. a ledek bekapcsolva felejtése ellen úgy védekeznék, hogy amennyiben kb.: 1 órán keresztül nem érkezik külső megszakítás (nem nyomnak meg nyomógombot ) a led fényereje lemegy 0-ra és jöhet a lpm4. Ilyen hosszú idő méréséhez mit érdemes használni, őrkutyát, vagy egy külön számlálót kelle elindítani?? 2. a tápfeszültség vizsgálatát szeretném megoldani úgy, hogy az egyik gomb hosszan történő megnyomása esetén megvizsgálnánk az áramforrás feszültségét és eldöntenénk, hogy egy érték felett, vagy alatt van-e (esetleg azt, hogy három sáv melyikébe esik a mért érték), majd az eredményt a megfelelő színű led jelezné. Hála a legújabb cikkednek, amit megint csak megköszönök, azt a kérdést nem kel feltennem, hogy ez lehetséges-e, (csak azt hogy hogyan tudom ezt megvalósítani?). Az eddigi segítséged utólag, az elkövetkezőt pedig előre is megköszönöm! A hozzászólás módosítva: Jan 17, 2013
Nagyon sokat kínlódok a belső ellenállás felhúzással, hol működik hol nem. Nem tudok rájönni mi a bibi. A fenti kód 10-ből 2 szer nem húzza fel. Idézet: Számlálót. „Ilyen hosszú idő méréséhez mit érdemes használni?” Idézet: A belső 2,5 V-os referencia használata mellett lehet mérni a tápfeszültség felét a 11. (belső) csatornában. Az ADC10MEM-ből kiolvasott értéket kell egy vagy két küszöbértékhez hasonlítani. Az if feltételvizsgálatokat kell végiggondolni:„a tápfeszültség vizsgálatát szeretném megoldani” 1. Ha a felső küszöbnél nagyobb, vagy egyenlő, akkor 1. sáv 2. Ha a felső küszöbnél kisebb, és az alsó küszöbnél nagyobb, vagy egyenlő, akkor 2. sáv 3. Ha az alsó küszöbnél kisebb, akkor 3. sáv A lényeg az, hogy minden szám tartozzon valahová és egyik érték se tartozzon két sávba.
Miből gondolod, hogy pont ezekkel a sorokkal van baj? Ha a 7. sor után teszel egy töréspontot, ott kimutatható a hiba? Ha nem, akkor valahol máshol babrálsz bele a P1OUT regiszterbe (én jártam már így!).
Ez az, hogy nincs hiba. Már mindent kiszedtem az alábbi kóddal tesztelem csak. Amikor nem húzza fel akkor ha kézzel megérintem akkor is létrejön a megszakítás.
Sziasztok.
Sok-sok olvasgatás után, sikerült működésre bírnom a WDT-t "őrkutya" módban. Tökéletesen működik, még a számlálótörlés is. De... A WDT számláló törlését úgy oldottam meg, ami nem biztos, hogy jó, hogy beállítottam egy Timert XY időre, és ott törlöm a WDT számlálót. Viszont a logika szerint, így csak akkor működik az "őrkutya", ha a program valamelyik megszakításban akad el, mivel ha nem megszakításban akad el, akkor a Timer, amiben a WDT számláló törlés van, mindenképp megszakítást okoz, és törli a számlálót. Ezt, hogy lehet kiküszöbölni? Egyébként a WDT törléssel az volt a baj, hogy én a VLO-t használom, és törlésnél ezt nem adtam meg. A roszz: WDTCTL = WDTPW + WDTHOLD; // stop WDT ..... WDTCTL = WDTPW + WDTCNTCL + WDTSSEL; // WDT enable, WDT=VLO .... WDTCTL = WDTPW + WDTCNTCL; // clear WDT A jó: Ugyan ez, csak az utolsó sornál: .... WDTCTL = WDTPW + WDTCNTCL + WDTSSEL; // clear WDT
Nem tudom hogy ezt keresed-e, de en csak ezt talaltam:
Eclipse Plugin A hozzászólás módosítva: Jan 17, 2013
Köszi.
Valami ilyesmit kerestem. Felraktam a Plugin-t, Juno alá, és első "ránézésre" egész jónak tűnik. Ha lesz egy kis időm megnézem "közelebbről" is.
Kíváncsi vagyok a tapasztalataidra! Nekem az nem tetszett a leírásban, hogy az mspdebug miatt nem lehet fenn a Texas eszközmeghajtó, a külön telepítendő meghajtó viszont nem kezeli a soros porti kommunikációt. Ha ez tényleg így van, akkor számomra felejtős a dolog. Bővebben: Link
Igen, olvastam én is. Egyenlőre azzal küzdök, hogy a 64 bites win alá, normálisan fel"varázsoljam" (mindig valami hibába botlok). Igaz, ki van emelve, hogy 32 bites verzió, de az nem jelent semmit. Ha nem megy megpróbálom a 32 bites gépemen, csak azt nem találom (hogy tud egy lakásból eltűnni egy Netbook? ).
|
Bejelentkezés
Hirdetés |