Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   25 / 153
(#) mazso1988 válasza schferenc81 hozzászólására (») Aug 8, 2010 /
 
Én bár nem vagyok annyira jártas a C programozásban, de úgy tudom hogy a CCS Compilerrel is lehet rá fejleszteni!
(#) schferenc81 válasza icserny hozzászólására (») Aug 8, 2010 /
 
Sziasztok!
Köszi a hozzászólást. Igen, de úgy látom, hogy a Microchip oldalról letölthető C18 és C30 nem használható a PIC16F887-hez.
Legalábbis a header fileja nincs ezekbe a fordítókba.

Amúgy a fél óra, egy nap volt , de végre a HiTech C-vel is felgyúltak az első LED-ek.
Úgyhogy az első nehézségeken túl vagyok.


Olvasgatom a Kónya-Kopják könyvet.
Ott van egy fejezet ami arról szól hogy mi a különbség a C30-as illetve a Hitec fordító között.

De azért gondolom egy két kivétel tekintetében úgyanúgy kell programot írni mindkettőben ?!

Üdv.:
Feri
(#) icserny válasza schferenc81 hozzászólására (») Aug 8, 2010 /
 
A C18 a PIC18 (16 bites programmemória, 8 bites adatút) mikrovezérlőkhöz való.

A C30 a PIC24, dsPIC30, és dsPIC33 (24 bites programmemória, 16 bites adatút) mikrovezérlőkhöz és jelvezérlőkhöz való.

A HiTech fordító PIC16F887-hez való használatához a Kónya-Kopják könyv szerintem túl sok segítséget nem fog adni...
(#) zenetom hozzászólása Szept 2, 2010 /
 
Hali!
MPLAB-ban, van egy C program, viszont én asm kódot akarok beszúrni, (nem értek céül szinte semennyire) amiben van ugrás is egy cimkére (az asm kódon belül), de a fordító syntax hibát ír ki arra a sorra ahol van az _asm utasítás, meg a W-t nem ismeri fel hogy az a work lenne.
  1. _asm
  2.                                         ANALOG
  3.                                         NOP
  4.                                         BSF ADCON0,1   //beállítja az ADCON0 1. bitjét, ezzel elkezdődik az analóg jel mérése
  5.                                         NOP
  6.                                         BTFSS ADCON0,1   //ha befejeződött akkor egyes lesz az ADCON0 1.bite
  7.                                         GOTO ANALOG
  8.                                         MOVF ADRESL,W    //az ADRESL-ben van a beolvasott jel alsó 8 bite, az egész 10 bites,
  9.                                                                          //a felsö 2 bit az ADRESH-ban van
  10.                                         MOVWF ADAT
  11.                                 _endasm

Szóval nem fogad minden asm kódot?
(#) potyo válasza zenetom hozzászólására (») Szept 2, 2010 /
 
Melyik C fordító?

Az már elhangzott itt párszor, hogy ADCON0 egyes bitjének van szép neve, tessék azt használni, különben nem vagyunk hajlandóak kódot bogarászni.
(#) zenetom válasza potyo hozzászólására (») Szept 2, 2010 /
 
Uhh, tényleg :hide: Ezért már warnt érdemelnék
A fordító az Microchip C18 Toolsite (azthiszem ez a a fordító...) vagyis: C:\MCC18\bin\mcc18.exe.
(#) potyo válasza zenetom hozzászólására (») Szept 2, 2010 /
 
Az nagy baj lenne, ha ezt C-ben tennéd be?
  1. ADCON0bits.GO=1;  // konverzió indul
  2. while (ADCON0bits.DONE) ;  // amíg tart a konverzió, várunk
  3. ADAT=ADRESL;  //eredmény áttöltése ADAT változóba


A GO és a DONE elnevezés ugyanazt az egyes bitet jelenti, csak egyik helyen ez a beszédesebb, másik helyen az.
(#) zenetom válasza potyo hozzászólására (») Szept 2, 2010 /
 
Köszi, azthiszem lassan meg kell tanulnom a C-t is... PIC-re meg PC-re is. Legalábbis az alapokat.
Szerintetek is?
(#) potyo válasza zenetom hozzászólására (») Szept 2, 2010 /
 
A legjobb ismerni C-t és asm-et is, és akkor el lehet dönteni, hogy melyiket használja az ember a feladattól függően. Mivel most neked C-be kellett volna az asm betét, ezért ajánlottam inkább, hogy tedd ezt be normál C utasításokkal. Egyébként nézd meg, hogy mit fordított a fordító ebből (View->Disassembly listing).
(#) zenetom válasza potyo hozzászólására (») Szept 2, 2010 /
 
Ez a Disassembly listing ablak jól jön majd ha C-ben van a forráskód, illetve ha elkezdek C-ben is írkálni.
(#) icserny válasza zenetom hozzászólására (») Szept 2, 2010 /
 
Idézet:
„asm kódot akarok beszúrni, (nem értek céül szinte semennyire) amiben van ugrás is egy cimkére”
A címke után kettőspontot kell tenni! - mondja a MPLAB C18 C COMPILER USER'S GUIDE

C nyelven meg így is írhatod (itt a jobbra/balra igazítástól függetlenül helyiérték-helyesen olvassuk ki az eredményt!):
  1. unsigned int ADC_meas(void) {
  2.     ADCON0bits.GO = 1;                  // AD konverzió indítása
  3.     while (ADCON0bits.NOT_DONE);        // konverzió végére vár
  4.     if ( ADCON2bits.ADFM )
  5.         return (((unsigned int)ADRESH)<<8)|(ADRESL);
  6.     else
  7.         return ((((unsigned int)ADRESH) << 2) | (ADRESL>>6)) ;
  8. }



Egyébként a C18-hoz van gyári perifériakönyvtár. Ebben az általad kívánt művelet csatornakiválasztással kiegészítve így néz ki:
  1. unsigned int read_ADC(unsigned char chan) {
  2.     SelChanConvADC(chan);       //Csatornaválasztás és konverzió indítása
  3.     while (BusyADC());          //Megvárja a konverzió végét
  4.     return ReadADC();                     //Visszatérési érték a konverzió eredménye
  5. }
(#) zenetom válasza icserny hozzászólására (») Szept 2, 2010 /
 
Köszi, először az alapokat is próbálom majd lefektetni. :yes:
(#) icserny válasza zenetom hozzászólására (») Szept 2, 2010 /
 
Még egy utólagos észrevétel: rossz helyre akartál visszaugratni. Csak a BTFSS utasításra kell visszamenni!
(#) zenetom válasza icserny hozzászólására (») Szept 2, 2010 /
 
Tényleg, így ez végtelen ciklus lenne (bár működött így is azthiszem, szóval lehet meg csinálta a konverziót egy kör alatt). Viszont most megyek aludni, mindjárt kelhetek. Jóéjt!
(#) potyo válasza zenetom hozzászólására (») Szept 2, 2010 /
 
Attól függ, hogy végtelen ciklus lesz-e, hogy pontosan mikor billen át nullára a GODONE bit. Ha már a BTFSS után, de még a BSF előtt, akkor végtelen ciklus lesz. De ha a BSF után és a BTFSS előtt, akkor viszont kilép a ciklusból.
(#) zenetom válasza potyo hozzászólására (») Szept 3, 2010 /
 
Igen, ez érthető. :yes:
(#) kissi hozzászólása Szept 13, 2010 /
 
Sziasztok!

Elkezdtem próbálkozni a C-vel és vannak részek, amelyek nem tiszták: a képen látható, hogy asm-ben írtam egy egyszerű késleltetést és a fordításkor betett egy pár felesleges NOP-ot ( a GOTO IDE után )! Ez miért van?

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

Steve
(#) potyo válasza kissi hozzászólására (») Szept 13, 2010 /
 
Vedd elő az adatlapot és nyálazd át a GOTO utasítás leírását, ott lesz a magyarázat arra, hogy miért van ott a NOP.

Amúgy mi köze ennek a C-hez, ha te is írod, hogy az asm betétbe tette be?
(#) kissi válasza potyo hozzászólására (») Szept 13, 2010 /
 
Aha, értem... akkor cserélhetem BRA-ra... Azt hittem nem optimalizál kellőképpen!

Bocs, hogy ideírtam, de az én fejemben ez most egy 'C-projekt' ! !

Köszi!

Steve
(#) watt válasza kissi hozzászólására (») Szept 14, 2010 /
 
Persze, kicserélheted BRA-ra, de azzal nem tudsz akkorát ugrani. Ha meg tudod, hogy nem is kell, akkor eleve nem GOTO-t használsz, mert pazarlás a két bájtos mivolta miatt.
A C fordítótól elvárod, hogy az asm betétedet is olptimalizálja?
(#) kissi válasza watt hozzászólására (») Szept 14, 2010 /
 
Nem vártam el, csak most állok át 18-asra és noha találkoztam már a BRA-val, kapásból nem ugrott be a dolog ! Igazából az volt a problémám, hogy NOP-ot láttam, holott én nem írtam bele és eszembe jutott, hogy valamikor olvastam, hogy a C, mikor nem fizetős, akkor pl. NOP-okat pakol bele, nem optimalizál rendesen, hogy a helyes útra térítse az embereket ! Nem is lett volna semmi gond, ha kihagyja azt a sort és nem ír oda NOP-ot a disassembler ( akkor valószínűleg beugrott volna a GOTO 2 szavas utasításkódja ), de így az optimalizációs probléma ugrott be!

Mindenesetre köszönöm a segítséget, biztos nem felejtem el !

Steve
(#) trudnai válasza kissi hozzászólására (») Szept 15, 2010 /
 
Nem, azok a NOP-ok mas miatt vannak ott. A GOTO a 18F-en ket szavas, hogy nagyobb cimtartomanyt le tudjun fedni (hogy bele ferjen az utasitasba a hosszabb cim...) Na es a masodik szo ugy van ossze allitva, hogy ha veletlen oda kerulne a vezerles, akkor az egy NOP utasitaskent hajtodjon vegre. Magaran nehogy veletlen valami nagy marhasagot csinaljon ha oda kerul a vezerles. Es pl egy BTFSS ugye egy utasitast ugrik at, ez valojaban egy szo atugrasat jelenti. Emiatt pl ha BTFSS moge egy GOTO0t raksz akkor nem lenne kivanatos az eredmeny hisz egy adat reszre kerulne a program vezerles. Emiatt az ugy van megcsinalva, hogy az ott mindenkepp NOP-nak hajtodik vegre. Es ezt latod a disassembly ablakban...
(#) kissi válasza trudnai hozzászólására (») Szept 16, 2010 /
 
OK, így még világosabb, köszi!

Steve
(#) kissi hozzászólása Szept 22, 2010 /
 
Sziasztok!

Miért nem akar ez működni C18 alatt, PIC18F4450-en
( 4 bites üzemmód, 20 MHz, több soros üzemmód )?Csak a 'H'-t írja ki!?

  1. #include <xlcd.h>
  2.     #include <delays.H>
  3.        
  4. void DelayFor18TCY(void)     // 100 us!
  5.     {
  6. //        Nop();
  7. //        Nop();
  8. //        Nop();
  9. //        Nop();
  10. //        Nop();
  11. //        Nop();
  12. //        Nop();
  13. //        Nop();
  14. //        Nop();
  15. //        Nop();
  16. //        Nop();
  17. //        Nop();
  18. //        Nop();
  19. //        Nop();
  20. //        Nop();
  21. //        Nop();
  22. //        Nop();
  23. //        Nop();
  24.         Delay10TCYx(50);
  25.         return;
  26.     }
  27.  
  28. void DelayPORXLCD(void)        // 15 ms késleltetés
  29.     {
  30.         Delay100TCYx(0);        //( unsigned char unit );
  31.         Delay100TCYx(0);        //( unsigned char unit );
  32.         Delay100TCYx(238);        //( unsigned char unit );
  33.         return;
  34.     }
  35.  
  36. void DelayXLCD(void)
  37.     {
  38.     Delay100TCYx(250);            //( unsigned char unit );  5 ms késleltetés
  39.     return;
  40.     }
  41.  
  42. static const rom char szoveg[]= "Hello!";
  43.  
  44.     void main(void)
  45.  
  46.     {    
  47.         OpenXLCD( FOUR_BIT & LINES_5X7 );
  48.         while( BusyXLCD() );
  49.         putrsXLCD( szoveg );
  50.         while(1);    
  51.     }


Köszi!

Steve
(#) watt válasza kissi hozzászólására (») Szept 23, 2010 /
 
Ez az XLCD ez mit takar? Nem is tudtam, hogy C18-ban(microchip?) van ilyen rutin!
(#) kissi válasza watt hozzászólására (») Szept 23, 2010 /
 
Én úgy látom, hogy van, el is fogadta ( nézd meg a doksiját, lenne még sok hasznos dolog), de mivel még most kezdem a C-t, ezért valamit biztos én rontok el. Azt láttam, hogy a"putrsXLCD( szoveg )" egy mutatót vár, próbáltam putrsXLCD( &szoveg ), putrsXLCD( "Hello" ), ill. már putrsXLCD( *szoveg ) módon is, de egyelőre nem ment!
Már második napja nézegetem, gyanús volt néhány dolog (pl. 18 ciklusos késleltetést is kért a kijelző kezeléséhez, holott oda tudomásom szerint 100 us kell, de hiába javítottam ). Az első karaktert veszi, utána történik valami gubanc, de ha nem lesz ötlet, akkor "megszkópozom" !

Én úgy gondolom, hogy paraméterként egy sztringmutatóhoz jónak kellett volna lennie a &szoveg-nek, de nem működött, ezért kínlódtam mindenféle variációval és tettem fel a kérdést a rutinosabb kollégáknak!

Steve
(#) watt válasza kissi hozzászólására (») Szept 23, 2010 /
 
A legtöbb esetben nekem bonyolultabbnak tűnik megérteni a rutinok működését, mint megírni az egészet. Ha lesz időm megnézem ezt a rutint.
Azt nézted, hogy a mutató milyen típusú? Flash-ből, vagy eepromból várja az adatot?
(#) kissi válasza watt hozzászólására (») Szept 23, 2010 /
 
Én úgy láttam, hogy a putrsXLCD ROM mutatót vár, míg a putsXLCD lenne a RAM-os!

Jól adom meg a mutatót a "&szoveg"-el?
(#) watt válasza kissi hozzászólására (») Szept 23, 2010 /
 
Szimulátorban nézted, hogy a beállított mutatókhoz ugrik-e a programszál?
Igen, az & a változó címét adja át, de hogy a rutin mit kér...
(#) kissi válasza watt hozzászólására (») Szept 23, 2010 /
 
Szimulátorban jónak tűnt, de már nem emlékszem melyik verziónál, de akkor sem működött jól..ezért gondoltam, hogy meg kell szkópoznom, mert az időzítéseket nem mértem, meg a busy flag-et nézi, amit nyilván nem szimulál!
Csak gondoltam, hogy aki használja, az kapásból kiszűri a hibámat, de ha nem, akkor kiderítem

Steve
Következő: »»   25 / 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