Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   26 / 153
(#) icserny válasza kissi hozzászólására (») Szept 23, 2010 /
 
Szerintem a "szoveg" már maga mutató, mivel tömbazonosító.

Viszont az xlcd.h-ban putrsXLCD() paramétere "auto const far rom char*"-nak van deklarálva. Ez a projekt opciók beállításától függően (near/far memory model) vagy egyezik a tömbdeklarációddal, vagy nem. Próbáld ki mostanitól eltérő beállítással is!

Az egy másik kérdés, hogy a gyári library-t hogyan fordították? Ha így, akkor gáz, mert a PIC18F4450-nél nem sok értelme van a 24 bites pointereknek. Ha meg nem, akkor külön header készlet kellene a 64 kB-nál nagyobb memóriájú mikrovezérlőkhöz, és egy másik a 16 bites címzést használóknak.

Utóirat: a könyvtári forráskódoknál található szkriptek "large memory model" opcióval futtatják a fordítót, tehát neked is ezt kellene beállítani a projekt opciói között.
(#) kissi válasza icserny hozzászólására (») Szept 23, 2010 /
 
Szia, köszi a segítséget, csak nem értek mindent ...
Utóirat: a könyvtári forráskódoknál található szkriptek "large memory model" opcióval futtatják a fordítót, tehát neked is ezt kellene beállítani a projekt opciói között. ezt Te hol nézted meg ( még nem igazodok el teljesen, a mintánál én azt láttam, hogy egy mutatót kell átadnom és kész, se near, se far...)?
A "large memory modell"-re emlékszem, hogy láttam, majd megkeresem, hol lehet beállítani és most mi a helyzet vele !
Köszi!

Steve
(#) icserny válasza kissi hozzászólására (») Szept 23, 2010 /
 
Az információ forrása:
c:/Program Files/Microchip/MCC18/src/make_one_subsystem_t.bat

Ebben az áll, hogy:
for %%i in (*.c) do mcc18 -ls --no-extended -ml -p=%1 %%i

A beállítás MPLAB-ban a Project/Build Options/Build/project menüben az MPLAB C18 fülön a Memory Model kategória kiválasztása után érhető el.

Code model: a small model lenne a logikus, de a könyvtárat valószínűleg nem így fordították!

Data model: a Large data model a célszerű választás

Stack model: ha a linker állományban definiált veremtár egy lapon helyezkedik el, akkor a single bank model a célszerű választás
(#) kissi válasza icserny hozzászólására (») Szept 23, 2010 /
 
Köszönöm szépen, megnézem...

Steve
(#) kissi válasza kissi hozzászólására (») Szept 23, 2010 /
 
Most jöttem haza és nézem a Rebuild_Instruction.txt-ben, hogy a pmc_common könyvtárban található XLCD, amiről azt látom, hogy:
Idézet:
„pmc_common Micro controller Peripheral library source common to
extended and non-extended modes.



Ez nem azt jelenti, hogy mind a extended és nem extended módban is használhatóak a rutinok ( eddig ezt meg se néztem egyébként ) ?!

Próbálom egyébként amit írtál, mindjárt referálok...

Steve
(#) kissi válasza kissi hozzászólására (») Szept 23, 2010 /
 
A Code Model az alapértelmezett Small-ra volt állítva, átállítottam a Large-ra, nem változott!

Köszi, hogy próbáltok segíteni, de egyéb ötlet?

Steve
(#) icserny válasza kissi hozzászólására (») Szept 23, 2010 /
 
Két külön könyvtár van. Például p18f4450_e.lib és p18f4450.lib. Az első az extended módban használható, a második a "hagyományos" módban. Az ingyenes fordító csak az utóbbit támogatja.
(#) kissi válasza icserny hozzászólására (») Szept 23, 2010 /
 
A könyvtárakat hogyan adom meg, hogy melyiket használja, illetve mi van ezekben a könyvtárakban ( mintha olvastam volna valahol, hogy ott vannak a lefordított függvények.Ezeket az előre lefordított függvényeket hogyan lehet megnézni, illetve változtatni? ) ? Eddig én csak include-oltam a header fájlokat és használtam a függvényeket ?!

Bocs, hogy ennyire amatőr dolgokat kérdezek, de szenvedek már vele egy ideje és nem olvastam ilyen infót!

Steve
(#) icserny válasza kissi hozzászólására (») Szept 23, 2010 /
 
Idézet:
„A könyvtárakat hogyan adom meg, hogy melyiket használja?”
A linker script gondoskodik róla. Nézd meg az elejét!
Idézet:
„mi van ezekben a könyvtárakban?”
Az, amiről a DOCS könyvtárban írnak, meg amit az src mappában találsz. (nálam az LCD rutinok még nincsenek dokumentálva, pedig a forrásuk ott van, s a lib-ben is benne vannak)
Idézet:
„Ezeket az előre lefordított függvényeket hogyan lehet megnézni, illetve változtatni?”

Megnézni:
  1. mplib /t p18f4550.lib > ide.txt


Módosítani:
Az MCC18 src és h mappáiban notepad.exe-vel.
Utána újra kell fordítani a már emlegetett szkriptek segítségével. Vigyázat! Egy mikrovezérlőre is elég lassan megy, s ahogy már mondtam, az extended módot az ingyenes fordító nem támogatja.

Ha csak egyetlen mikrovezérlőre akarod futtatni, akor is le kell fordítani az általános futtatórendszert:
  1. make_genericlibs_t.bat


Majd az adott mikrovezérlő lib-jét, például:
  1. make_one_device_t.bat 18F4550 BATCH_BUILD
(#) kissi válasza icserny hozzászólására (») Szept 23, 2010 /
 
Köszönöm, majd megpróbálom!

Steve
(#) kissi válasza kissi hozzászólására (») Szept 23, 2010 /
 
Mi történik, ha én valamelyik 'C' forrásba belenyúlok ( mert pl. a BUSY vizsgálatnál a LAT-ot nézi a PORT helyett a mostani beállítással!) ? Ilyenkor teljesen le kellene fordítanom ( az általad leírt módon ), vagy ha a C forrásfájlt berakom source fájlnak, akkor az úgy is "belefordul" ?!

Steve
(#) potyo válasza kissi hozzászólására (») Szept 23, 2010 /
 
Ha módosítod a C fájlt, akkor azt újra fordítja.

Viszont olyan szerintem nincs gyári kódban, hogy LAT-ot néz egy bemenetnél...
(#) icserny válasza kissi hozzászólására (») Szept 23, 2010 /
 
Ha a forrást berakod a projektbe, vagy a "gyári" függvénnyel azonos nevűt írsz a saját programodba akkor az elsőbbséget élvez. A szabály az, hogy a linker csak azokat az eljárásokat csatolja be a .lib-ből, amelyek neve nem nyert felold(oz)ást a projekt objekt (.o) állományainak összelinkelése során.
(#) kissi válasza potyo hozzászólására (») Szept 23, 2010 /
 
Nézd már meg légyszíves az busyXLCD.c-t és a hozzá tartozó xlcd.h-t... Én úgy látom, hogy DATA_PORT-nak a LAT-ot nevezi ( MCC18 ), noha a busy vizsgálatánál a kijelzőt kell olvasni! Jól látom vagy elnéztem valamit?!

Köszönöm !

Steve
(#) kissi válasza icserny hozzászólására (») Szept 23, 2010 /
 
OK, köszönöm az infót.

Steve
(#) icserny válasza kissi hozzászólására (») Szept 24, 2010 /
 
Nálam két MCC18 verzió (3.22 és 3.36) perifériakönyvtárának forrás is kéznél van, ezekben ez áll:
  1. /* DATA_PORT defines the port to which the LCD data lines are connected */
  2. #define DATA_PORT      PORTB
  3. #define TRIS_DATA_PORT TRISB
(#) icserny válasza kissi hozzászólására (») Szept 24, 2010 /
 
A mellékelt programokat nézd meg, működnek-e nálad? (az egyik printf-et használ, a másik nem, hogy memóriatakarékosabb legyen)

PIC18F4550 esetén a D-portra kell kötni az LCD-t (az RD0..RD3-on eredetileg rajta levő LED-ek is maradhatnak!)

RD0 = RS
RD1 = R/W
RD2 = E
RD3 = --
RD4 = LCD D4
RD5 = LCD D5
RD6 = LCD D6
RD7 = LCD D7

A program a PICCOLO projekt-ben használható, tehát piccolo_all.h, piccolo_config.h és piccolo-4550.h kellenek hozzá... Az USE_USB ne legyen definiálva!
(#) icserny válasza kissi hozzászólására (») Szept 24, 2010 /
 
Most volt időm kipróbálni a "gyári" könyvtárat (MCC18 v3.22), az alábbi program (ami lényegében ugyanaz, amit beírtál tegnap, csak kibővítettem egy második sorral) első blikkre működött. De az inicializálás nem tökéletes, néha előfordul, hogy szemeteket ír ki!

A 15 s helyett nálam azért van 50ms, mert túl alacsonyan van a BORV (2,7 V-nál már indul a PIC, s az LCD adatlap ajánlás szerint ilyenkor többet kell várni).

A 18 TCY helyett nem kell 100 us-ot írnod, mert ahelyett az 5 ms-os késleltetést használja a gyári OpenXLCD() függvény.

  1. #include "piccolo_all.h"
  2. #include "xlcd.h"
  3. #include "delays.h"
  4.  
  5. void DelayFor18TCY(void) {
  6.         Delay10TCYx(2);         //20 TCY delay
  7. }
  8.  
  9. void DelayPORXLCD(void) {
  10.         Delay10KTCYx(60);       //50 ms delay
  11. }
  12.  
  13. void DelayXLCD() {
  14.         Delay1KTCYx(60);        //5 ms delay
  15. }
  16.  
  17. const rom char szoveg[]= "PICCOLO projekt";
  18.  
  19. void main(void) {  
  20.         OpenXLCD( FOUR_BIT & LINES_5X7 );
  21.         while( BusyXLCD() );
  22.         putrsXLCD(szoveg);              //első sor kiírása
  23.         while( BusyXLCD() );
  24.         SetDDRamAddr(0xC0);             //kurzor a második sor elejére
  25.         while( BusyXLCD() );    //második sor kiírása
  26.         putrsXLCD("PIC18F4550 MCU");
  27.         while(1);  
  28. }


Bekötés xlcd.h szerint, azaz:
RB0 = LCD D4
RB1 = LCD D5
RB2 = LCD D6
RB3 = LCD D7
RB4 = E
RB5 = RS
RB6 = R/W
RB7 = --
(#) kissi válasza icserny hozzászólására (») Szept 24, 2010 /
 
Köszi, megnézem...

Nekem a D portra van kötve az LCD ( felső 4 bit adat, 0--> E, 1-->RS, 2--> R/W, ha jól emlékszem, a header fájlt átírtam, a C forrásfájlokat beraktam a source fájlok közé! ). Az az érdekes, hogy 1 karaktert kiír és utána romlik el!?

Légyszíves nézz már rá a #803422 hozzászólásomra, ha van egy kis időd !

Steve
(#) icserny válasza kissi hozzászólására (») Szept 24, 2010 /
 
Idézet:
„Légyszíves nézz már rá a #803422 hozzászólásomra, ha van egy kis időd!”

Azt már megválaszoltam ebben a hozzászólásomban.
(#) kissi válasza icserny hozzászólására (») Szept 24, 2010 /
 
De ez jól van így? Ha a PORT-ot olvassa akkor OK szerintem, de ha írja?! Szerintem íráskor a LAT-ot kellene használni a RMW utasítás miatt, vagy nem jól gondolom ( én úgy tudom pont ezért vezették be a LAT-ot! ) ?!

Most nem tudom tovább nézegetni, valószínűleg vasárnap tudok foglalkozni vele legközelebb!

Üdv mindenkinek!

Steve
(#) kissi válasza icserny hozzászólására (») Szept 24, 2010 /
 
Ezt bemásoltam az én xlcd.h fájlommal nem ment ( nekem a PORTD-n van a kijelző!) --> ez azt jelenti, hogy valami elkötés lenne ( korábban már ellenőriztem és az első betűt mindig helyesen írja ki! )? A D porton én nem láttam semmi extrát, szerintem működnie kellene .
A C18 a log szerint:
Idézet:
„Source: c:\Letölt_FIREFOX\MPLAB-C18-Std-Eval-v3_34(2).exe | 01-19-2010 | 22:45:50”
.

Vasárnap majd folytatom és jelentkezek...

Steve
(#) icserny válasza kissi hozzászólására (») Szept 24, 2010 /
 
Idézet:
„De ez jól van így? Ha a PORT-ot olvassa akkor OK szerintem, de ha írja?!”
Nekem ennél alapvetőbb gondjaim vannak az XLCD függvényekkel. Ha megnézed például az első hívás
  1. OpenXLCD( FOUR_BIT & LINES_5X7 );

azt sugallja, hogy a függvény paraméterezésével választható, hogy 4 vagy 8 bites módban működjön. De ez nem igaz, mert
  1. #define BIT8

megléte vagy hiánya már eleve eldöntötte, hogy melyik módot használja.

A függvénykészlet összeállítása is elég szerencsétlen (igaz, ez nemcsak az XLCD csomag kapcsán tűnt fel...).
(#) zenetom hozzászólása Szept 25, 2010 /
 
Ezzel a C-vel nem haladok semmire, elakadtam kb ott hogy a kapcsos zárójelek a begin meg az end.
Az oké, hogy az asm utasításokat se akarja elfogadni, azt még elviselem. De akkor legalább egy picit legyen logikus a felépítése. Sehogy se tudtam rájönni, hogy hogyan lehet például vizsgálni egy byte változó x. bitét.
Tud valaki valami leírást? Mert a neten mindent találok a C-ről csak azt nem, amit kéne.
(#) icserny válasza zenetom hozzászólására (») Szept 25, 2010 /
 
Minden topikba ötvenszer belinkeltem már!
BRIAN W. KERNIGHAN – DENNIS M. RITCHIE: A C programozási nyelv
Mike Banahan, Declan Brady and Mark Doran: The C Book
Idézet:
„hogyan lehet például vizsgálni egy byte változó x. bitjétJ”
  1. if(enbajtom & (1<<x))
(#) zenetom válasza icserny hozzászólására (») Szept 25, 2010 /
 
:hide:
Köszi.
(#) watt válasza zenetom hozzászólására (») Szept 25, 2010 /
 
Ha bitekre akarsz bontani egy bájtot, és bitenként használni, akkor ez az egyik megoldás(részletek az egyik programomból).
Deklarálás:
  1. //STATUS regiszter deklaráslása
  2. union{
  3.  unsigned char x;
  4. struct {
  5.     unsigned RS485_USD_MMC_Polling_Error:1;
  6.     unsigned Cirko_Polling_Error:1;
  7.     unsigned Nagy_Szoba_Polling_Error:1;
  8.     unsigned Konyha_Polling_Error:1;
  9.     unsigned JuditSzoba_Polling_Error:1;
  10.     unsigned BeaSzoba_Polling_Error:1;
  11.     unsigned flag6:1;
  12.     unsigned flag7:1;
  13. };
  14. }STATUS_Slave;
  15. #define STATUS_Slave_Byte STATUS_Slave.x

Hivatkonzni lehet rá:
  1. STATUS_Slave_Byte=0;    //Slave Hiba Státuszbitek törölve

Vagy:
  1. STATUS_Slave.JuditSzoba_Polling_Error=1;

Illetve:
  1. if (STATUS_Slave.JuditSzoba_Polling_Error==1)
  2. {
  3. }
(#) zenetom válasza watt hozzászólására (») Szept 25, 2010 /
 
Köszönöm szépen.
ASM-be ez mennyivel egyszerűbb.
(#) vicsys válasza zenetom hozzászólására (») Szept 25, 2010 /
 
Azért mert asm-ben gondolkodsz, nem C-ben...
(#) potyo válasza watt hozzászólására (») Szept 25, 2010 /
 
Remélem van otthon Judit nevű személy
Következő: »»   26 / 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