Fórum témák
» Több friss téma |
Sziasztok! Valaki esetleg tud valamit hozzászólni az előző hozzászólásomhoz?
Ma már odáig jutottam, hogy lcd-vel kiirattattam a status regiszterem értékét, hogy kiderüljön, hogy a TO bit milyen értéket vesz fel. Érdekes, hogyha csak annyi a programom, hogy ezt írja ki és nem adom ki a clear watchdog parancsot, akkor is csak úgy látszik, hogy újraindult, hogy az lcd háttérvilágítás egy pillanatra kikapcsol. De a TO bitem továbbra sem vált át 0-ba, holott a watchdog okozta. Valaki találkozott már hasonlóval, vagy én nem jól csinálok valamit? Közben csatolom az új programot, ez a "jó". (Vagyis ebben nem vált a TO 0-ba.)
Nézd meg a generált assembly kimenetet.
Én arra tippelnék, hogy a programodhoz alapból hozzá van fűzve egy kis kódrészlet, ami induláskor inicializál pár dolgot. Többek között elmenti valahová a TO bit értékét, majd alaphelyzetbe állítja, és csak ezután indul a main() függvény.
Köszönöm a tippet. Utána néztem, de nem találom azt a részt, ahol ez megtörténne. Mindenesetre csatolnám az assembly kódot, ha esetleg rajtam kívül másnak sikerülne megtalálnia. Nagyon érdekes a dolog, mert még egyszerűbb programnál sem sikerül a TO bitet normálisan kiértékelni. Pedig a HI-TECH V9.82 pro verzióját használom. Már gondolkoztam rajta, hogy CCS-ben is megpróbálom, csak azt nem szeretem annyira, mert nem az "igazi C".
Van esetleg valami más, amit kipróbálhatok? A hozzászólás módosítva: Dec 1, 2012
Hogy hogyan lehet ezt onnan kiiktatni... hát, talán a doksiban valahol fellelhető. A hozzászólás módosítva: Dec 1, 2012
Amelyik fordítót használod, nyilván annak a doksijában.
Helló!
Ezt találtam az USER MANUAL-ban: Idézet: „2.4.2.3 STATUS REGISTER PRESERVATION The resetbitssuboption of the--RUNTIMEoption (see 2.7.50 “--RUNTIME: Spec-ify Runtime Environment”) preserves some of the bits in the STATUSregister before being clobbered by the remainder of the runtime startup code. The state of these bits can be examined after recovering from a reset condition to determine the cause of the reset. The entire STATUSregister is saved to an assembly variable ___resetbits. This variable can be accessed from C code using the declaration: extern unsigned char __resetbits; The assembly equates ___powerdownand ___timeoutrepresent the bit address of the powerdown and timeout bits within the STATUSregister and can be used if required. These can be accessed from C code using the declarations: extern bit __powerdown; extern bit __timeout; See Section 2.8 “MPLAB IDE Universal Toolsuite Equivalents”for use of this option in MPLAB IDE.”
Nem hiszem el, pont én is idecsöppentem, de megelőztél!
Azt hiszem jó helyen járunk, szerintem így már menni fog! Ha kipróbáltam, akkor értesítelek! Nagyon köszönöm!
No, a helyzet az, hogy az MPlab-ban kellett engedélyezni azt, hogy mentse a STATUS regiszter értékét, így már OK.
Vagyis azt hiszem. Mármint hogy működik a watchdog, már a timeout bit kiértékelése is megy, de van egy dolog, amit nem értek. Írtam egy programot, amiben engedélyezem a watchdogot, de nem törlöm. Bizonyos programokkor látszik, hogy újraindult a PIC, van amiben meg nem. Pl írtam egy Timer2 megszakítást, ahol megvizsgálom a timeout(TO) bit értékét. Ha 0, akkor watchdog okozta az újraindulást, ekkor kiiratom az értékét lcd-re. Na mármost, ha a watchdog előosztóm a maxon van, akkor nem írja ki a timeout-ot. De még csak nem is látszik az újraindulás, szépen dolgozik a PIC, méri a hőmérsékletet... Ha a watchdog előosztót kisebbre állítom, akkor már kikerül az LCD-re a timeout bit. Ez miért van? Csatolom a forráskódot.
A kód működik, hardver hiba volt... vakhangya létemre csak a 6872. alkalommal vettem észre.
Sziasztok!
Nem értem, hogy az alábbi union hogyan biztosítja, hogy a PORTA és a PORTAbits ugyanazon a memóriaterületen legyenek ( legalábbis kezdődjenek, ami elvileg az union "feladata" lenne )! Úgy gondolom, hogy ennek érdekében az union-on belül kellene valamilyen módon szerepelnie a PORTA-nak, de nem ott van !? Valaki "homályosítson" már fel!
Előre is köszönöm a segítséget! Steve
A leírtak (önmagukban) nem is biztosítják.
De mivel mindkettő "extern", ezért ebből még csak annyi tudható, hogy valahol máshol van megjelölve, hogy ez a két változó a valóságban hol is lakik. Na ott dől el, hogy a két változó tulajdonképpen ugyanazon a címen lakik.
Aha, köszi, így már akkor értem ( szerintem )!
Így viszont felmerült bennem az a kérdés, hogy akkor ez csak annak az egyszerűsítése, hogy
Köszönöm a segítséget! Steve Idézet: Ezzel nem tud mit kezdeni a fordító. Az asm betétek csak akkor értelmesek, ha valami kódot generálnak, tehát valami utasítás is kellene mellé. A PORTAbits.RA0-ról viszont a C fordító tudja, hogy egy változó, tehát értékadások jobb- és baloldalán tudja, hogy milyen utasítást generáljon a PORTA,0 mellé (célként vagy forrásként használva). „nem tudom, ilyet írhatnék-e egyáltalán, elfogadja-e a fordító ?!”
Ilyet pl. lehetne csinálni:
De ez "hátrányos helyzetű" lesz így, mivel a fordítás során a makrók behelyettesítődnek, így pl. debuggoláskor nem tudnád használni a PORTA kifejezést, mert olyan nevű változó nincs. A hozzászólás módosítva: Dec 5, 2012
Köszönöm mindkettőtöknek, majd próbálom...
Steve
Csak nem boldogulok vele...
C18-nál idéztem a P18F14K50.h fájlból, de nem tudom, melyik állományban kell keresnem az extern-ként megjelölt PORTA és RA0(bit) változókat : a P18F14K50.inc lenne az ? Honnan lehet ezt megtudni, illetve, ha igen, akkor itt a csak a PORTA és a bitek címei vannak megadva, mi biztosítja, hogy ez ugyanazon a területen van? Steve
A fordító a lib/p18F14k50.lib file-ból fogja ezt elővadászni. Ennek a lib-nek a forrása pedig az src/traditional/proc/p18F14K50.asm file-ban leledzik. Egyébként hasznos dolog ilyen esetben a total commander tartalomra történő keresése. Én ilyesmi esetben mindig azzal szoktam megkeresni, hogy egy adott dolog melyik file-ban van definiálva.
Más téma: azzal volt bajom mostanában, hogy az előfordító a számításokat rosszul csinálta. A hiba abból eredt, hogy az előfordító nem megfelelő típusú számokkal számolt és ez miatt csonkolva lett az eredmény. A forrásomban megadhatom ugyan, hogy pl. hosszú előjel nélküli számokkal végezzen számításokat a konstansok előállításához (pl: #define SZAM 100UL), de erről néha elfeledkezik az ember. Az előfordító ugye nem ismer típuskényszerítést, hogyan oldható meg a szám hosszúvá konvertálása? Szorozzuk meg 1UL -el és az eredmény így már hosszú előjel nélküli szám lesz, az értéke meg természetesen ettől nem fog változni. A hozzászólás módosítva: Dec 6, 2012
Köszi a segítséget, így már valóban látom...
Főleg assembly-t használok, a C egy kicsit még idegen az "automatizmusával" ! Lehet, hogy ez itt már off, de: - Ezt infót egyébként miből kellett volna kiolvasnom / honnan tudom, hogy milyen lib-eket használ számomra automatikusan ( én most nem adtam meg külön ezt a lib-et "használatra ?) -illetve, hogy ez a lib mit tartalmaz? Steve
Mplabban crtl-shift-F a project fájljain belül keres, lehet kattogni az eredményablakban, és akkor mindjárt az arra fájlba/pozicióra ugrik
A C források által include-olt fájlokat emiatt melegen javasolt felvenni a project-be, "gyári" mintaprogiknál is van hogy kihagynak includeokat a projectből.
Köszi, ezt már ismertem, csak nem tudtam, hogy milyen fájlokat érint! Nincs erről valamilyen "kigyűjtés" ?
Steve u.i. most nézem, hogy ezeket a *.map-ből ki tudom vadászni , na így már bogarászhatom tovább a 'C' rejtelmeit ! A hozzászólás módosítva: Dec 6, 2012
C18-ban van rá lehetőség, hogy két változót ugyanarra a memóriacímre tegyen vagy csak az előbb látott asm segítségével tudom megoldani?
Steve Idézet: „honnan tudom, hogy milyen lib-eket használ?” A linker állomány elején van megadva. Pl. 18f14k50_g.lkr elején ez áll:
Minden mikrovezérlőhöz van egy egy saját *.lib állomány. Ennek újrafordítását emlékeim szerint már tárgyaltuk veled az LCD vezérléshez felhasznált lábak kiosztásának módosítása kapcsán. Idézet: Így van, de azt másképp oldottam meg ( nem kellett újrafordítani ) és így nem maradt meg bennem.„Ennek újrafordítását emlékeim szerint már tárgyaltuk veled az LCD vezérléshez felhasznált lábak kiosztásának módosítása kapcsán.” Köszönöm az ismételt segítségedet. Steve Idézet: „C18-ban van rá lehetőség, hogy két változót ugyanarra a memóriacímre tegyen vagy csak az előbb látott asm segítségével tudom megoldani?” Ugy erted sporolni szeretnel a memoriaval, es tudod, hogy egyik valtozot mikor hasznalod, akkor a masikat nem fogod, szoval nyugodtan kerulhetnek egy teruletre is? Arra valo az un. overlay tarolasi osztaly. Hogy hova fognak kerulni a valtozok azt a fordito fogja eldonteni, kiszamitja, hogy mely fuggveny volt melyikbol hivva es abbol fogja tudni hova kell elhelyeznie a valtozot ahhoz, hogy ne irjak egymast felul.
Itt a compiler tudja, hogy funkcio_B es funkcio_C a funkcio_A -bol lett hivva, ezert az "a" valtozo nem lesz felul irva sem "b"-vel, sem "c"-vel, de jo esely van ra, hogy "c" ugyanarra a memoria cimre fog kerulni, mint "b", mivel a ket fuggveny nem letezik egy idoben... Ez majdnem olyan mintha normal "auto" tarolasi osztalyt hasznalnal, ami a veremre helyezi a valtozokat, csakhogy nincs stack pointerezes, ami a 18F csaladban eleg koltseges mulatsag mind kod meret mind pedig futasi idot tekintve. Ha konkretan ugyanarra a teruletre akarsz tenni ket valtozot akkor vagy pointert kell hasznalni, vagy pedig pragmaval kikenyszeriteni (bar velemenyem szerint ezt erdemes elkerulni):
A hozzászólás módosítva: Dec 7, 2012
Szia!
Hasonlót szeretnék, mint a PORTA és a PORTAbits... Előre is köszönöm a segítséget! Steve
Nezd meg a header file-t, hogy hogyan csinalta a Microchip -- de mint mondtam ezt kerulni kell, es ha arra van szukseged akkor nagy valoszinuseggel valamit rosszul csinalsz...
Idézet: „Hasonlót szeretnék, mint a PORTA és a PORTAbits...” Az miért nem jó, amit a legelején kérdeztél: a PORTAbits-féle union+struct kiegészítve még egy union mezővel, ami unsigned char típusú? Annyi lesz a különbség, hogy nem PORTA névvel tudsz rá hivatkozni, hanem PORTAbits.valami lesz a neve.
Sziasztok!
Idézet: „Az miért nem jó, amit a legelején kérdeztél: a PORTAbits-féle union+struct kiegészítve még egy union mezővel, ami unsigned char típusú? Annyi lesz a különbség, hogy nem PORTA névvel tudsz rá hivatkozni, hanem PORTAbits.valami lesz a neve.” Ezt megcsináltam és működött is, csak szerettem volna, ha ugyanolyan szintaktikával tudom kezelni . Benjami kolléga válasza alapján megnéztem a befordított lib tartalmát és így már megcsináltam, hogy ugyanarra a címre definiáltam a VALTOZO és a VALTOZObits változókat és union-al így már meg tudtam oldani a bitek elnevezését is. Köszönöm a segítséget mindenkinek! Steve
Ha az a célod hogy hogy pl. az alábbi uniont nem csak bitenként, hanem byte-ként is el akarod érni, és ehhez nem akarsz rekord típusú változónevet használni akkor a #define-val is meg tudod oldani a következőképpen:
|
Bejelentkezés
Hirdetés |