Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   65 / 153
(#) Wudoou válasza Wudoou hozzászólására (») Nov 30, 2012 /
 
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.)

main.c
    
(#) _vl_ válasza Wudoou hozzászólására (») Nov 30, 2012 / 1
 
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.
(#) Wudoou válasza _vl_ hozzászólására (») Dec 1, 2012 /
 
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
(#) _vl_ válasza Wudoou hozzászólására (») Dec 1, 2012 /
 
  1. 336  07F9  0183                      clrf    3
  2. 337  07FA  120A  118A  280F          ljmp    _main   ;jump to C main() function

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
(#) Wudoou válasza _vl_ hozzászólására (») Dec 1, 2012 /
 
Mármint a HITECH doksijában?
(#) _vl_ válasza Wudoou hozzászólására (») Dec 1, 2012 /
 
Amelyik fordítót használod, nyilván annak a doksijában.
(#) cszotyi válasza Wudoou hozzászólására (») Dec 1, 2012 / 1
 
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.”
(#) Wudoou válasza cszotyi hozzászólására (») Dec 1, 2012 /
 
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!
(#) Wudoou válasza Wudoou hozzászólására (») Dec 1, 2012 /
 
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.

watchdog2.c
    
(#) whalaky válasza icserny hozzászólására (») Dec 1, 2012 /
 
A kód működik, hardver hiba volt... vakhangya létemre csak a 6872. alkalommal vettem észre.
(#) kissi hozzászólása Dec 5, 2012 /
 
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!
  1. extern volatile near unsigned char       PORTA;
  2. extern volatile near union {
  3.   struct {
  4.     unsigned RA0:1;
  5.     unsigned RA1:1;
  6.     unsigned RA2:1;
  7.     unsigned RA3:1;
  8.     unsigned RA4:1;
  9.     unsigned RA5:1;
  10.     unsigned RA6:1;
  11.   };
  12.   struct {
  13.     unsigned AN0:1;
  14.     unsigned AN1:1;
  15.     unsigned AN2:1;
  16.     unsigned AN3:1;
  17.     unsigned T0CKI:1;
  18.     unsigned AN4:1;
  19.     unsigned OSC2:1;
  20.   };
  21.   struct {
  22.     unsigned :2;
  23.     unsigned VREFM:1;
  24.     unsigned VREFP:1;
  25.     unsigned :1;
  26.     unsigned SS:1;
  27.     unsigned CLKOUT:1;
  28.   };
  29.   struct {
  30.     unsigned :5;
  31.     unsigned LVDIN:1;
  32.     unsigned CLKO:1;
  33.   };
  34. } PORTAbits;


Előre is köszönöm a segítséget!

Steve
(#) _vl_ válasza kissi hozzászólására (») Dec 5, 2012 /
 
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.
(#) kissi válasza _vl_ hozzászólására (») Dec 5, 2012 /
 
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
  1. #define PORTAbits.RA0  (_asm PORTA,0 _endasm)  <-- nem tudom, ilyet írhatnék-e egyáltalán, elfogadja-e a fordító ?!


Köszönöm a segítséget!
Steve
(#) icserny válasza kissi hozzászólására (») Dec 5, 2012 / 1
 
Idézet:
„nem tudom, ilyet írhatnék-e egyáltalán, elfogadja-e a fordító ?!”
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).
(#) _vl_ válasza kissi hozzászólására (») Dec 5, 2012 / 1
 
Ilyet pl. lehetne csinálni:
  1. #define PORTA (*(unsigned char *)&PORTAbits)

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
(#) kissi válasza _vl_ hozzászólására (») Dec 5, 2012 /
 
Köszönöm mindkettőtöknek, majd próbálom...
Steve
(#) kissi válasza _vl_ hozzászólására (») Dec 6, 2012 /
 
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
(#) benjami válasza kissi hozzászólására (») Dec 6, 2012 / 1
 
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
(#) kissi válasza benjami hozzászólására (») 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
(#) pipi válasza kissi hozzászólására (») Dec 6, 2012 /
 
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.
(#) kissi válasza pipi hozzászólására (») Dec 6, 2012 /
 
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
(#) kissi válasza benjami hozzászólására (») Dec 7, 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
(#) icserny válasza kissi hozzászólására (») Dec 7, 2012 / 1
 
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:
  1. #IFDEF _CRUNTIME
  2.   #IFDEF _EXTENDEDMODE
  3.     FILES c018i_e.o
  4.     FILES clib_e.lib
  5.     FILES p18f14k50_e.lib
  6.  
  7.   #ELSE
  8.     FILES c018i.o
  9.     FILES clib.lib
  10.     FILES p18f14k50.lib
  11.   #FI
  12.  
  13. #FI


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.
(#) kissi válasza icserny hozzászólására (») Dec 7, 2012 /
 
Idézet:
„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.”
Így van, de azt másképp oldottam meg ( nem kellett újrafordítani ) és így nem maradt meg bennem.
Köszönöm az ismételt segítségedet.
Steve
(#) trudnai válasza kissi hozzászólására (») Dec 7, 2012 /
 
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.

  1. funkcio_A() {
  2.     overlay int a;
  3.     funkcio_B();
  4.     funkcio_C();
  5. }
  6. funkcio_B() {
  7.     overlay int b;
  8. }
  9. funkcio_C() {
  10.     overlay int c;
  11. }


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):

  1. egyikfile.c:
  2. ------------
  3. #pragma udata overlay overlay_teruletem=0x100
  4. int var1, var2;
  5.  
  6. masikfile.c:
  7. ------------
  8. #pragma udata overlay overlay_teruletem=0x100
  9. float var3;

A hozzászólás módosítva: Dec 7, 2012
(#) kissi válasza trudnai hozzászólására (») 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
(#) trudnai válasza kissi hozzászólására (») Dec 7, 2012 /
 
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...
(#) _vl_ válasza kissi hozzászólására (») Dec 7, 2012 /
 
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.
(#) kissi válasza _vl_ hozzászólására (») Dec 7, 2012 /
 
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
(#) benjami válasza kissi hozzászólására (») Dec 7, 2012 / 1
 
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:
  1. typedef union
  2. {
  3.   struct
  4.   {
  5.     unsigned bit0:1;
  6.     unsigned bit1:1;
  7.     unsigned bit2:1;
  8.     unsigned bit3:1;
  9.     unsigned bit4:1;
  10.     unsigned bit5:1;
  11.     unsigned bit6:1;
  12.     unsigned bit7:1;
  13.   };
  14.   struct
  15.   {
  16.     char byte;
  17.   };
  18. }ADATTIPUS;
  19.  
  20. ADATTIPUS DATABits;
  21. #define DATA DATABits.byte
  22.  
  23. void main(void)
  24. {
  25.   DATABits.bit0 = 1;
  26.   DATABits.byte = 0x55; // gondolom, ezt szeretnéd elkerülni
  27.   DATA = 0x77;          // helyette meg ezt használni
  28. }
Következő: »»   65 / 153
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