Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   30 / 153
(#) kissi hozzászólása Feb 1, 2011 /
 
Sziasztok!

Van-e a Microchip C18-ban direktíva arra, hogy adatokat helyezzek el az EEPROM-ban ( pl. asm-ben DE ) ?

Steve
(#) icserny válasza kissi hozzászólására (») Feb 1, 2011 / 1
 
Gondolom a #pragma romdata, és a cím megadása megteszi. Bővebben: Link
(#) kissi válasza icserny hozzászólására (») Feb 1, 2011 /
 
Köszönöm szépen !

Steve
(#) mateakos hozzászólása Feb 3, 2011 /
 
Üdv.
Az lenne a kérdésem, hogy hogyan lehet (ha egyáltalán lehet) a C18 fordítóból kikényszeríteni, hogy egy egyetlen char paraméterrel redelkező függvény paraméterét WREG regiszterben adja át?
(#) icserny válasza mateakos hozzászólására (») Feb 3, 2011 /
 
Ha jól értem a feladatot, akkor így:

  1. movlw  0xfe        ; W-be -2-őt rakunk
  2. movf   PLUSW2,W    ; W-be rakjuk az FSR2-2) által mutatott paramétert

Bővebben: Link

Megjegyzés: A paraméter átadása a veremtárban történik,a fenti utasításokkal lehet elővenni a veremkeret-mutató felhasználásával.
(#) mateakos válasza icserny hozzászólására (») Feb 3, 2011 /
 
Arra gondoltam, hogy a fordítót utasítani arra, hogy WREG regisztert használja paraméterátadásra, verem helyett, ha az eljárásban nincs szükség veremre. Static módosítóval nem veremben adja át a paramétert, és ezért nem is generál verem kezelő kódot, mivel lokális változója sincs az eljárásnak, de arra nem jön rá, hogy WREG-ben is átadhatná.
Ez az eljárás:
  1. 104:               void transmit(unsigned static char a) {
  2. 105:                 while(txcnt!=0);
  3.   01EE    5003     MOVF 0x3, W, ACCESS
  4.   01F0    E1FE     BNZ 0x1ee
  5. 106:                 txb=(((unsigned short)a)<<1)|0b1000000000;
  6.   01F2    0100     MOVLB 0
  7.   01F4    5180     MOVF 0x80, W, BANKED
  8.   01F6    6E06     MOVWF 0x6, ACCESS
  9.   01F8    6A07     CLRF 0x7, ACCESS
  10.   01FA    90D8     BCF 0xfd8, 0, ACCESS
  11.   01FC    3606     RLCF 0x6, F, ACCESS
  12.   01FE    3607     RLCF 0x7, F, ACCESS
  13.   0200    5006     MOVF 0x6, W, ACCESS
  14.   0202    0E02     MOVLW 0x2
  15.   0204    1207     IORWF 0x7, F, ACCESS
  16. 107:                 txcnt=10;
  17.   0206    0E0A     MOVLW 0xa
  18.   0208    6E03     MOVWF 0x3, ACCESS
  19. 108:               }
  20.   020A    0012     RETURN 0
És így néz ki egy hívása:
  1. 142:                   transmit(0x55);
  2.   025A    0100     MOVLB 0
  3.   025C    0E55     MOVLW 0x55
  4.   025E    6F80     MOVWF 0x80, BANKED
  5.   0260    DFC6     RCALL 0x1ee
Simán átadhatná a paramétert WREG-ben, ha a 01EE című utasításnál W helyett F-et használna célként, vagy TSTFSZ és BRA utasításokat használna.
(Ami már nem a paraméterátadáshoz tartozik, hogy a 0200 címen található utasítás teljesen és egyértelműen fölösleges, de ezt a txb változó volatile módosítója hatására teszi oda.)
(#) mateakos hozzászólása Feb 3, 2011 /
 
Van még egy kérdésem.
Az előzőre úgy sejtem, az a helyes válasz, hogy ennyire nem lehet beleszólni a compiler dolgába.
Próbáltam keresni ebben a topic-ban a ment, visszaállít, megőriz szavakra, de nem sokat találtam arról, amit tudni szeretnék.
Melyik regiszterek tartalmát kell megőrizni a C-ből hívott assembly rutinokban?
Vegyesen írok programot C-ben és assemblyben (nem betétként, hanem külön fájlban, majd az object fájlokat linkerrel összeszerkesztve) Az világos, hogy a szoftveres adat vermet rendben kell tartani, de ezen kívül, ha használni szeretném FSR0, TBLPTR regisztereket, és az ezekhez tartozó egyéb regisztereket, akkor azokat kell-e menteni és helyreállítani? Elvárja-e ezek megőrzését a C fordító normál (nem megszakításkezelő) eljárásoktól és függvényektől?
C18-at és MPASM-et használok.
Köszönöm icserny előző válaszát, arra a tudásra is szükségem lesz (habár azt már elolvastam a "C18 user guide"-ban, de magyarul mégiscsak egyszerűbb)
(#) watt válasza mateakos hozzászólására (») Feb 4, 2011 /
 
Én nem ismerem annyira a fordítót, hogy belelássak, észre veszi-e, hogy az asm betétben milyen regisztereket használsz és annak megfelelően gondoskodik-e a kényes regiszterek mentéséről, de egy szimuláció ezt könnyen kiderítheti.
Írsz egy olyan C forrást, amiben az FSR, vagy a TBLPTR befordításra kerül, majd beleszúrsz egy asm betétet, amiben használod ezeket. Megnézed mit fordított. Ha lesz a fordított asm listában mentés a kérdéses regiszterekről, akkor nagyon okos a fordító! Ezen nagyon meglepődnék!
(#) icserny válasza mateakos hozzászólására (») Feb 4, 2011 /
 
Úgy tudom, hogy a visszaadott eredmény méretétől függően W, PRODLRODH és FSR0 szolgálnak az eredmény visszaadására, tehát ebből következően nem tárolhatnak megőrzendő értéket, felülírhatók.
(#) mateakos válasza watt hozzászólására (») Feb 4, 2011 /
 
Azon én is meglepődnék, ha assembly betétbe belenézne, de jelen esetben ezt biztos nem teszi meg, mert külön object fájlba fordítódik külön asm fájlból az assembly függvény, ráadásul előbb fordítja a C fájlt, az után az ASM fájlt. Ettől függetlenül lehet, hogy az eljárások szabadon módosíthatják TBLPTR, TABLAT és FSR0 értékét, úgyhogy marad a próbakód+disassembly.
(#) watt válasza mateakos hozzászólására (») Feb 4, 2011 /
 
Illetve az a felvetés ellenőrzése, amit icserny 'nagymester' írt. Ha valóban nem tárolnak infókat bennük, akkor szabadon módosíthatóak. Ezt is le lehet ellenőrizni szimulációval.
(#) icserny válasza icserny hozzászólására (») Feb 4, 2011 /
 
Bocs, én PRODL : PRODH-t akartam írni az előző beírásomban, csak a fórummotor túlbuzgóságból vigyori pofát csinált belőle.
(#) watt válasza icserny hozzászólására (») Feb 4, 2011 /
 
Én visszafejtettem a kódot!
(#) kissi hozzászólása Feb 6, 2011 /
 
Sziasztok!

Próbálkozom icserny Bővebben: Link leírása alapján az LCD ( és a többi ) könyvtár újrafordításával, de valami nem jó: az LCD-re kiíráskor
  1. putrsXLCD("ZORRO");
valami nagy mutatót ad át ( PK2 debuggolásnál látszik! ) ! Ha a SCR könyvtárból átteszem a "putrxLCD.c" - t a projektembe és beépítem a projektbe ( ugyanazt! ), akkor működik! A projekt beállításnál SMALL van kiválasztva. Mit állítok be rosszul?!

Steve
(#) pipi válasza kissi hozzászólására (») Feb 6, 2011 /
 
Meg kellene nézni a függvény deklarációját, include-jat, már ha egyáltalán beincludolod. Nincs se hibaüzi se warning rá? ugye a string jöhet a ram-ból meg a flash-ból is, ezért lényeges a deklaráció a programod elején
(#) kissi válasza pipi hozzászólására (») Feb 6, 2011 /
 
Szerintem ilyen gond nem lehet: a fv. deklaráció is megvan. A fordításnál lehet valami opciós probléma ( ha a fv-t beépítem a projektbe, akkor lefordítja és azt használja --> így jól működik! ). Hibaüzenet, warning nincs!
A string egyébként ilyen parancsnál ( amit írtam ) a ROM-ban helyezkedik el tudtommal.


Köszi a segítő szándékot, ha van bármi ötleted, akkor várom...

Steve
(#) icserny válasza kissi hozzászólására (») Feb 6, 2011 / 1
 
Idézet:
„A projekt beállításnál SMALL van kiválasztva. Mit állítok be rosszul?!”
Lehet, hogy pont ezt? A gyári könyvtárak ugyanis LARGE opciókkal vannak fordítva. De a fordító pampogásán kívül ez nálam nem szokott gondot okozni.

Idézet:
„putrsXLCD("ZORRO"); valami nagy mutatót ad át”
Ennek így is kell lennie, ügyanis a függvény deklarációjában szerepela "rom" módosító, ami 24 bites mutatót jelent:
void putrsXLCD(const rom char *);

Idézet:
„Szerintem ilyen gond nem lehet: a fv. deklaráció is megvan.”
Arra vigyázni kell a gyári könyvtár újrafordításánál, hogy a réhi és az új (módosított állományok) ne keveredjenek össze! Ha az alkalmazás fordításakor az új library és a régi header kerül becsatolásra, akkor nem fog működni. Legbölcsebb a régi változatot elmenteni, és minden módosított állomány lecserélni (.lib, .h). Ha csak az LCD-vel kapcsolatos állományok módosultak, akkor a c018.o állományt nem szükséges lecserélni.
(#) kissi válasza icserny hozzászólására (») Feb 6, 2011 /
 
Szia!

Mellékelem, hogy mit látok... A Jó_LCD-nél a projekthez csatoltam a putrxLCD-t és így fordítottam ( ezért azt újrafordítja ! ), a rossznál az általad leírt módszerrel lefordítottam és beraktam a könyvtárba. Az xlcd.h biztosan jó, mert a 2 soros üzemmód és a villogó kurzor megjelenik, csak a szövegkiírás marad el a rossz mutató miatt! Látszik, hogy a jó mutató valóban jó helyre mutat, a másik meg nem is létező helyre ( a PIC-en belül! )!

A LARGE opciót kipróbáltam, a hibajelenség megmaradt.

Steve
(#) kissi válasza kissi hozzászólására (») Feb 6, 2011 /
 
Ha a szöveget a RAM-ba teszem és a
  1. putsXLCD(szoveg);
kiíratást használom az általam újrafordított függvénnyel ( icserny leírása alapján! ), akkor is működik... Nem tudom, mi lehet a gond a ROM-ból történő kiírás fordításával !?

Steve
(#) icserny válasza kissi hozzászólására (») Feb 6, 2011 / 1
 
A rossz változatnál nekem úgy tűnik, hogy csak két bájtos címet kap, és hozzáolvas egy harmadik bájtot, aminek semmi köze a címzéshez.

A könyvtár és az alkalmazás tehát láthatóan különböző memória modell beállítással volt fordítva. A projekt opcióknál a C18 code model: Large (> 64K) beállítással próbálkoztál? Annak jónak kellene lennie!

Ha a könyvtárak forrását becsatolod a projektbe, akkor nyilvánvalóan konzisztens lesz a fordítás, akármilyen memória modellt választasz.
(#) kissi válasza icserny hozzászólására (») Feb 6, 2011 /
 
A rossz változatnál engem semmi nem emlékeztet a jó címre, Te hol látod az 1 hibás byte-ot?!
A LARGE-ot az előbb próbáltam ( írtam! ), most újra, de nem jó!

Steve
(#) mateakos válasza mateakos hozzászólására (») Feb 6, 2011 /
 
Most néztem meg, hogy végül is kell-e vigyázni FSR0 értékére, ha C-ből assembly függvényt hívok. Egy egyszerű ciklust írtam C-ben, ami csupán egy tömböt nulláz, ha semmi függvényhívás nincs benne, akkor is mindig újratölti FSR0-t a mutató értékével, hiába van bekapcsolva minden optimalizálás. Ez alapján arra következtetek, hogy a függvényeknek csak arra kell vigyázniuk hogy maguk után rendben hagyják a vermet.
Ha a próbaidő letelte csak a kiterjesztett utasításkészletet és a procedurális absztrakciót tiltja le akkor ez a C18 fordító még nagyon gyerekcipőben jár (legalábbis a 3.36-os verzió, amit használok), hiszen egy unsigned short változó növelését sem a legrövidebb úton oldja meg.
(#) icserny válasza kissi hozzászólására (») Feb 6, 2011 / 1
 
Idézet:
„A rossz változatnál engem semmi nem emlékeztet a jó címre”
A szöveged a 03FA címen van, ha jól látom, s a pointered átvett értéke is tartalmazza ezt a két bájtot, csak van utána egy fölösleges 0x01 bájt.

A szubrutin meghívásának (putrsXLCD("ZORRO"); hogy néz ki a disassembly listája LARGE modell esetén?
(#) icserny válasza icserny hozzászólására (») Feb 6, 2011 / 1
 
Nálam ez a különbség: SMALL modell esetén kétbájtos, LARGE modell estén hárombájtos cím kerül átadásra.
(#) kissi válasza icserny hozzászólására (») Feb 6, 2011 /
 
Aha, igazad lehet, én előtte néztem a roszat...

Megcsináltam amit kértél, hátha Te észreveszed a problémát!

Steve

LARGE_LCD.PNG
    
(#) kissi válasza kissi hozzászólására (») Feb 6, 2011 /
 
Most látom, hogy mire gondoltál, mindjárt megnézem...
(#) kissi válasza icserny hozzászólására (») Feb 6, 2011 /
 
Itt van akkor a megfelelő részlet... Itt úgy látom, csak 2 byte-ot ad át!?

De nem értem, hogy miért adnak át adott esetben 3 byte-ot, ha az adott PIC-nél max. 2 byte a ROM címe ?!

Steve
(#) icserny válasza kissi hozzászólására (») Feb 6, 2011 / 1
 
Idézet:
„Itt úgy látom, csak 2 byte-ot ad át!?”
Ez elég érdekes! Tudniillik így nem fog működni...
Idézet:
„De nem értem, hogy miért adnak át adott esetben 3 byte-ot, ha az adott PIC-nél max. 2 byte a ROM címe ?!”
A fordítót nem izgatja az adott PIC memória-mérete, az majd a linkelésnél derül ki.

Mellesleg a konfigurációs bitek, az EEPROM, az eszközazonosító és a felhasználói azonosító akkor is 24 bites címzést igényel, ha a memória kisebb, vagy egyenlő mint 64 kbyte.

A könyvtárakat pedig azért fordítják gyárilag LARGE modellel, mert nincs külön batch fájl a 128 kbites típusokhoz.
(#) miklosch hozzászólása Feb 20, 2011 /
 
HI-TECH-ben hogyan tudom megadni a fordítónak, hogy programozáskor töltse fel az eepromot bizonyos adattal? Gondolok itt arra, hogy pl. az eeprom első byte-jában legyen 1, a másodikban 5, harmadikban 7, stb., és ezt csak programozáskor írja bele. Tudom, hogy programozás előtt direktbe át tudom írni az eeprom regisztereit, és azt tölti be, de nekem a programba kellene ezt megmondanom.
(#) El_Pinyo válasza miklosch hozzászólására (») Feb 20, 2011 /
 
Szia!
Link 51. oldal, 3.3.1.8. bekezdés.
Következő: »»   30 / 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