Fórum témák

» Több friss téma
Fórum » CCS PIC Compiler
 
Témaindító: (Felhasználó 1542), idő: Ápr 3, 2006
Lapozás: OK   85 / 118
(#) szuperman válasza potyo hozzászólására (») Feb 14, 2013 /
 
Szimulátorban építek még.
(#) szuperman válasza potyo hozzászólására (») Feb 14, 2013 /
 
Sikerült megtalálnom a hibát. Most már megy az általad javasolt módszerrel. Nem mellesleg elképesztően gyors. Szeretném érteni is. Elmagyaráznád ezt a részt? for (i = 2147483648; i; i>>= 1)
Pl. a >>= mit jelent? A feltétel ,hogy lehet csak annyi ,hogy i?

Előre is köszi!
(#) potyo válasza szuperman hozzászólására (») Feb 14, 2013 /
 
Az i>>=1 az ugyanaz rövidebben, mint az i=i>>1, vagyis egy hellyel jobbra lépteti i-t, ami ugyanaz, mintha kettővel osztanád.

C-ben alapvetően az összehasonlítást végző műveletek is ugyanolyan műveletek, mint pl. a szorzás, vagyis eredményt adnak vissza. És minden feltétel számára az a lényeg, hogy a feltételben szereplő kifejezés eredménye nulla, vagy nem nulla. Ha leírsz egy olyat, hogy if (x==5), akkor az (x==5) mint kifejezés kiértékelődik, és az értéke nem nulla (akármennyi lehet, fordítótól is függ, hogy konkrétan mennyi lesz, a lényeg, hogy nullától különbözik), ha az x értéke 5, illetve az értéke nulla, ha az x nem 5. Az if számára pedig csak az a lényeg, hogy nulla vagy nem nulla, ami ott áll. Pl. csinálhatsz olyat is, hogy y=(x==5), ez teljesen legális C-ben. Így a jelen esetben szereplő ciklus is addig ismétlődik, amíg az i értéke nem nulla. Az pedig akkor lesz nulla, ha a jobbra léptetések végén az egyes bit kiléptetődik. Teljesen ekvivalens lenne azt írni, hogy i!=0, vagy ebben a konkrét esetben akár i>0-t is lehetne (mivel az i unsigned típusú, tehát csak pozitív lehet), a fordító vélhetően ugyanazt fordítaná mindhárom verzióból. De alapvetően C programozók egyszerűen csak i-t írnak ilyen esetben, hiszen az is teljesen megfelelő.
(#) szuperman válasza potyo hozzászólására (») Feb 15, 2013 /
 
Köszönöm a bő választ, így már világos. Sőt! Fogom a fejem ,hogy ez nekem nem jutott eszembe.
(#) kukac_24 hozzászólása Feb 19, 2013 /
 
Halihó, abban kérném a segítségeteket, hogy 18F2520-al hogy tudnám mérni 4-6 bemenet jelének a periódusidejét párhuzamosan?
(#) _vl_ válasza kukac_24 hozzászólására (») Feb 19, 2013 /
 
Mekkora frekit/periódusidőt, milyen pontossággal szeretnél mérni?
(#) potyo válasza kukac_24 hozzászólására (») Feb 19, 2013 /
 
Az attól függ, hogy mekkora frekvenciájúak azok a jelek és mekkora az elvárt pontosság.

Nem néztem meg, de gondolom össze lehet legózni hat darab megszakításra alkalmas bemenetet, timerrel lehet mérni az időt, kérdés csak az, hogy elég lesz-e az így összehozott pontosság, vagy olyan pic(ek) kell(enek), amiben van több hardveres CCP modul?
(#) kukac_24 válasza potyo hozzászólására (») Feb 19, 2013 /
 
Elég pontosnak kellene lennie, ha pl a periódusidő egy előre beállított szint alá esik, akkor kellene jeleznie a készüléknek. Én is azon agyaltam, hogy több CCP modulos PIC-et használok.
(#) icserny válasza kukac_24 hozzászólására (») Feb 20, 2013 /
 
Idézet:
„Elég pontosnak kellene lennie...”
Nem lehetne számszerűsíteni a megkívánt pontosságot? Nagyon nem mindegy, hogy 1 us vagy 1 ms a tűréshatár! A frekvencia is érdekes, mert nagyobb frekvenciák esetén nem a periódusidő mérése, hanem a periódusok számlálása adott ideig ad pontosabb eredményt.
A hozzászólás módosítva: Feb 20, 2013
(#) zoox hozzászólása Feb 23, 2013 /
 
Sziasztok.

Tud-e valaki segiteni?
Szóval akarok írni egy olyan függvényt amivel HD44780-asLCD-re akarok szöveget irni,csak nem tudom hogy lehet a függvénynek stringet átadni.
kod:
ez mőűködik de nem igy szeretném
  1. void    LCD_PRINT_szoveg(int sor,int cim,char szoveg[]);
  2. strcpy(char_teszt,"abcdefgh");
  3. LCD_PRINT_szoveg(3,1, char_teszt);

Ez sana nem jó:
  1. LCD_PRINT_szoveg(4,1,(strcpy(char_teszt,"12345678")))


de igy szeretném ami nem megy:
  1. LCD_PRINT_szoveg(4,1,"12345678";


Valahol azt olvastam hogy a C-s függvénynek csak pointert lehet átadni paraméternek ,de már láttam olyan függvényt ahol stringet adtak át paraméternek (igaz mikroC-volt)ugy hogy akkor biztos van valami megoldás ,de egyenlöre nem találom .Remélem elmondtam mindent és valamennyire érthető voltan.
Előre is köszi.
(#) zoox hozzászólása Feb 25, 2013 /
 
Sziasztok!
Ujabb problémába akadtam:
Mindig ezt dobja az MPLAB:
*** Error 71 "temp_ds18b20_7.c" Line 1144(0,1): Out of ROM, A segment or the program is too large SETUP_KEPERNYO
Seg 00800-00FFF, 05B7 left, need 007E6
Seg 01000-017FF, 0800 left, need 00802
Seg 01800-01FFF, 0800 left, need 00802
Seg 00000-00003, 0000 left, need 00802
Seg 00004-00030, 0000 left, need 00802
Seg 00031-007FF, 022C left, need 00802
Seg 00800-00FFF, 05B7 left, need 00802
Ha kitörlök egy sort bárhonnan akkor pedig lefordul igy:
Memory usage: ROM=62% RAM=22% - 31%

Nem értem mi lehet a gond?
A ROM az bizti nem fogyhat el ,akkor a SETUP_KEPERNYO függvényem mérete lehet nagy?
Mekkora lehet maximálisan egy függvény mérete? Eddig még ilyen gondom nem volt ,igaz ASM-ben firkálgattam .Nagyon örülnék ha valaki utba tudna igazitani hogy merre keressem a hibát.
Elöre is köszi.
(#) Hp41C válasza zoox hozzászólására (») Feb 25, 2013 /
 
Szia!
Ha ez egy 16F, akkor a 0x802 és a 0x7E6 utasítás hosszú függvényeket fel kellene darabolni.
A hozzászólás módosítva: Feb 25, 2013
(#) zoox válasza Hp41C hozzászólására (») Feb 25, 2013 /
 
Hu... ezt hogy is lehet csinálni?Hogy találom meg ezeket a hosszu fuggvényeket esetleg a disassembly listában vagy hol keressem?
A hozzászólás módosítva: Feb 25, 2013
(#) potyo válasza zoox hozzászólására (») Feb 25, 2013 /
 
Ránézel a forráskódra és keress egy több oldalas függvényt első körben...
(#) zoox válasza potyo hozzászólására (») Feb 25, 2013 /
 
Ok . Amiért a forditó pofázik az kb 40 sor ,de több függvényt is meghiv ami ujból függvényeket hiv (ez egy több szintü MENU-szerkezet)ezeket gondolom nem egy függvényként kezeli vagy ez is lehet probléma?
Main()
-SETUP_KEPERNYO()
-MANUAL_PRINT()
MENU_AUTO()
...LCD_PRINT_TEXT()...write_lcd()
A hozzászólás módosítva: Feb 25, 2013
(#) Hp41C válasza zoox hozzászólására (») Feb 25, 2013 /
 
Szia!
Egy kis assembly tapasztalattal egyből beugrana, hogy a 16F 2k -s program memória lapokkal dolgozik (0x800 utasítás). A C fordító nem kezeli, hogy egy függvény nagyobb, mint egy programmmemória lap.
(#) zoox válasza Hp41C hozzászólására (») Feb 25, 2013 /
 
Hu... pont ezért kezdtem C-vel foglalkozni mert 2 K fölött kicsit zürös az assembly.
Ha függvényből függvényt hívok azt egynek fordítja ?
A hozzászólás módosítva: Feb 25, 2013
(#) _vl_ válasza zoox hozzászólására (») Feb 25, 2013 /
 
Az is lehet, hogy sok string van abban a függvényben, mert az is kóddá fordul, aztán ki tudja, hogy van-e annyi esze a fordítónak, hogy azt külön is rakhatja.
(#) zoox válasza _vl_ hozzászólására (») Feb 25, 2013 /
 
Hogy tudok röviditeni egy függvényt?Kisebb komponensekre bontom és azokat külön függvénybe rakom amiket azután meghívok az eredetiből?Ez igy járható,vagy ez igy egy függvénynek fordul le és akkor nem csináltam semmit?
A hozzászólás módosítva: Feb 25, 2013
(#) sysy válasza zoox hozzászólására (») Feb 25, 2013 /
 
Itt már többen írták, hogy túl hosszú kódokat írsz.
Megpróbálhatod a #separate direktívát, ami egy szűz blokkba teszi a hosszú függvényedet.
(#) potyo válasza zoox hozzászólására (») Feb 25, 2013 /
 
Én nem emlékszem az előzményekre, de ha már csak 40 sornyi az a függvény, amivel problémázik, akkor megmutathatnád azt a függvényt és akkor többet tudunk mondani. Általánosságban igen, külön függvénynek fordul, az ami külön függvényként van létrehozva.

Idézet:
„Hu... pont ezért kezdtem C-vel foglalkozni mert 2 K fölött kicsit zürös az assembly.”

És pont a CCS-t kellett választani az asm után?
(#) Hp41C válasza sysy hozzászólására (») Feb 26, 2013 /
 
Szia!
A #separate sem tudja a 2K -nál nagyobb függvényt egy 2k -s lapra tenni...
(#) Hp41C válasza zoox hozzászólására (») Feb 26, 2013 /
 
A sokszor ismétlődő részeiből egy másik függvényt csinálsz és csak hívogatod megfelelő paraméterekkel. Egy elszeparálható részéből csinálsz egy másik függvényt. A switch - case struktúrákat if-then-else -re cseréled (nem használ ugrótáblát). Esetleg áttérsz egy lábkompatibilis és feszültségkompatibilis 18F -re. (Az assembly 2 -szer.. 4 -szer (a free XC8 esetében 12 -szer)) rövidebb kódot eredményezne.
A hozzászólás módosítva: Feb 26, 2013
(#) zoox válasza potyo hozzászólására (») Feb 26, 2013 /
 
Itt a "csodálatos" kód:
  1. void main()
  2. {
  3. /*1111111111111111111111111111
  4. 111111111111111111111111111111
  5. 11111  PROGRAM MAG  1111111111
  6. 11111111111111111111111111111*/
  7.                 setup_oscillator(OSC_4MHZ | OSC_INTRC);
  8.                 // TMR 1 modul setup
  9.                 setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_4 );// OSC/4 / DIV_BY_x  azaz 500 khz
  10.         //      setup_timer_1 (T1_DISABLED);
  11.                 enable_interrupts(INT_TIMER1);                 
  12.         //      enable_interrupts(INT_RB5);    
  13. //              enable_interrupts(GLOBAL);
  14.  
  15. //      setup_port_a( ALL_ANALOG );
  16.  
  17.                 delay_ms(400);
  18.                 output_high(LCD_LAMP);
  19.         LCD_INI();    
  20.                 CLS();
  21.    
  22.      while (1)
  23.                 {
  24.   //
  25.         enable_interrupts(GLOBAL);
  26.         TEMP_DS_READ();
  27.         disable_interrupts(GLOBAL);    
  28.        
  29.        
  30.  
  31.  
  32.        
  33.        
  34.         if      (key==KEY_MENU)
  35.         {
  36.         SETUP_KEPERNYO();      
  37.         }      
  38.  
  39.         FOKEPERNYO();
  40.        
  41.                 }
  42.                
  43. }
  44. void    MENU_AUTO(int culsor_poz)      
  45.                         {
  46.                         /*  #####  MENU  #########################
  47.                                 ############  Auto  ##################
  48.                                 ############        ##################
  49.                                 ############        ##################
  50.                                 ######################################
  51.                                 */
  52.                                 /*      LCD_PRINT_TEXT(3,3,'A');
  53.                                 do              {
  54.                                         KEY_READ();                    
  55.                                                 }                                                                              
  56.                                 while(key!=KEY_ESC);
  57.                                 Delay_ms(500);
  58.                                 key=0;
  59.                                 */
  60.                                 AUTO_UZEMMOD_PRINT(3,1);
  61.                                 Delay_ms(1000);
  62.                                 CLS();
  63.                                 key=KEY_ESC;
  64.                         }

Ezzel a függvénnyel van gondja a fordítónak
  1. void SETUP_KEPERNYO()
  2. {
  3. /*  ###########################################
  4.         ###########  SETUP  MENU  ################
  5.         ##########################################
  6.         Menu   
  7.                 Auto
  8.                                                                                         (ESC,<
  9.                                
  10.                 Manual
  11.                                 Gaz             (ON-OFF)
  12.                                 Kazan   (ON-OFF)
  13.                                 Puffer  (ON-OFF)
  14.                 Setup
  15.                                 Gaz             ON       20-99°C       ,OFF    20-99°C , Delay 1s-99s ,Emergaancy temp 50-99°
  16.                                 kazan   ON       20-99°C       ,OFF    20-99°C , Delay 1s-99s ,Emergaancy temp 50-99°
  17.                                 Puffer  ON       20-99°C       ,OFF    20-99°C , Delay 1s-99s ,Emergaancy temp 50-99°
  18.  
  19.                                
  20.                
  21.         */
  22.  
  23.         CLS();
  24.         int culsor_poz=1,ascc,gaz_kazan_puffer_culsor=1;
  25.         do
  26.         {      
  27.         key=0;
  28.         MENU_PRINT      (1,1);
  29.                 AUTO_PRINT      (2,5);
  30.                 MANUAL_PRINT(3,5);
  31.                 SETUP_PRINT     (4,5);         
  32.         KEY_READ();
  33.         if(key==KEY_DOWN)
  34.         {
  35.         delay_ms(500);
  36.         culsor_poz= (culsor_poz<3)      ?       ++culsor_poz    :1;
  37.         }      
  38.         if(key==KEY_UP)
  39.         {
  40.         delay_ms(500)
  41.         culsor_poz= (culsor_poz==1)     ?       3       :       --culsor_poz;  
  42.         }
  43.         if(key==KEY_OK)
  44.                         {
  45.                         CLS();
  46.                                 MANUAL_PRINT    (1,1);
  47.                         switch(culsor_poz)
  48.                                         {              
  49.                                                         case 1  :
  50.                                                         {
  51.                                                         MENU_AUTO(culsor_poz)
  52.                                                         break;
  53.                                                         }
  54.                                                         case 2  :
  55.                                                         {
  56.                                                         MENU_MANUAL(culsor_poz,ascc);
  57.                                                         break;
  58.                                                         }      
  59.                                                         case 3  :
  60.                                                         {
  61.                                                         MENU_SETUP(culsor_poz,ascc);
  62.                                                         break;
  63.                                                         }              
  64.                                         }
  65.                         }              
  66.         LCD_PRINT_TEXT(2,3,ascc=(culsor_poz==1)?126:' ');
  67.         LCD_PRINT_TEXT(3,3,ascc=(culsor_poz==2)?126:' ');
  68.         LCD_PRINT_TEXT(4,3,ascc=(culsor_poz==3)?126:' ');
  69. stop = i;
  70.         }      
  71.         while(key!=KEY_ESC);   
  72.         CLS()
  73. }

Idézet:
„És pont a CCS-t kellett választani az asm után?”


Melyiket ajánlod mert a CCSC-t csak azért választottam mert a help-je az könnyen emészthető volt ,de ugy érzem hogy kellene váltanom ?
(#) zoox válasza Hp41C hozzászólására (») Feb 26, 2013 /
 
Idézet:
„A sokszor ismétlődő részeiből egy másik függvényt”
Igy próbáltam röviditeni de lehet hogy a switch-case lehet a probléma mert van benne bőven ,maj átírom este a kodot.
Idézet:
„(Az assembly 2 -szer.. 4 -szer (a free XC8 esetében 12 -szer)) rövidebb kódot eredményezne”
Ez biztos igy van mert korábban csináltam hasonló projit ASM-be és az elfért 2K -ban csak amikor bővíteni akartam az már nem fért bele és 2K-ba fölött a 16F ASM-ben az
(#) vicsys válasza zoox hozzászólására (») Feb 26, 2013 /
 
Első körben szedd ki a float változókat és a sok printf LCD-t. Látni fogod, hogy drasztikusan lecsökken a méret. Innentől kezdve már tudni fogod, hogy mi az ami ekkora részt foglal le.
(#) sysy válasza Hp41C hozzászólására (») Feb 26, 2013 /
 
Ez igaz, de ha már közösködni kell a blokkban más függvényekkel, akkor még kisebb az esélye annak, hogy elfér.
Abban meg Vicsys-nek van igaza, hogy a printf fügvvényhívással spórolni kell, mert az nagyon brutál tud lenni.
(#) sysy válasza zoox hozzászólására (») Feb 26, 2013 /
 
Nem tűnik bonyolultnak a függvényed, de biztosan lehet egyszerűsíteni.
Én bátorítalak a CCS használatára, mert nagyon kényelmes, jól kitalált és elég hatékony ahhoz, hogy amateur szinten csodákat lehessen vele művelni.
Az XC8 esetében egyszerűen nem igaz, hogy 12x rövidebb kódot generál, pláne nem a nagyon gyengén optimalizáló free verzióval ami még búgos is mellette. Az is elgondolkoztató, hogy assemblyben 4x rövidebb a kód, de XC8 esetén még ennél is harmadával kevesebb.
Légvonalban 3 km, de tudok egy rövidebb utat az erdőn át esete.
Höhö...

Tényleg jobban jársz egy lábkompatibilis 18Fxxx példánnyal. Tisztább, szárazabb érzés és sok nyűgtől megszabadulsz.
(#) Hp41C válasza sysy hozzászólására (») Feb 26, 2013 /
 
Idézet:
„Az XC8 esetében egyszerűen nem igaz, hogy 12x rövidebb kódot generál, pláne nem a nagyon gyengén optimalizáló free verzióval ami még búgos is mellette. Az is elgondolkoztató, hogy assemblyben 4x rövidebb a kód, de XC8 esetén még ennél is harmadával kevesebb.
Légvonalban 3 km, de tudok egy rövidebb utat az erdőn át esete.
Höhö...”

Teljesen félreértve.
A jereváni rádió jut eszembe: Tegnapi hírünk "Leningrádban Mercédeszket osztogatnak." nem teljesen igaz. Nem Leningrádban, hanem Moszkvában, nem Mercédeszeket, hanem Moszkvicsokat és nem osztogatnak, hanem fosztogatnak. Különben a hír igaz."

Ha az assembly elfér 1K -ban, akkor ugyan az az algoritmus átírva free XC8 -re 12k lenne, a full optimalizálással készült kód (995$) csak 3k... Kiróbálva, leméreve, az XC8 uninstallálva...
(#) potyo válasza Hp41C hozzászólására (») Feb 26, 2013 /
 
Biztos vagyok benne, hogy lehet ilyen példakódot írni, de azért nekem jobb tapasztalatom van az XC8-al. Free verziót használom most egy projekthez, kapott kódméret 7k utasítás körül van. Próbára megnéztem, mit tud a 45 napos demó, 4.x k lett a kódméret. Maradok az ingyenes verziónál, mert még a C kódon is tudnék optimalizálni, ha nagyon akarnék, de a 8k kódmemóriába belefér most is, így egyelőre nem foglalkozok vele, van most fontosabb dolgom. Persze nem kételkedek, hogy bele lehetne nyomni az egészet egy 4k kódmemóriás chipbe is, de ilyen kis sorozatnál nem éri meg a ráfordított időt a kettő közötti árkülönbség...
Következő: »»   85 / 118
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