Fórum témák

» Több friss téma
Fórum » PIC programozása C nyelven, C-Compiler
Lapozás: OK   96 / 153
(#) kissi válasza Hp41C hozzászólására (») Ápr 18, 2014 /
 
Ott nekem nem volt eredetileg semmi ( biztos van valami alapértelmezett, mert nem pampogott ! ), most meg az emlegetett 18f24k22_g.lkr-t raktam oda be, de nem változott!
Ebben egyébként ez van:
Idézet:
  1. #IFDEF _CRUNTIME
  2.   #IFDEF _EXTENDEDMODE
  3.     FILES c018i_e.o
  4.     FILES clib_e.lib
  5.     FILES p18f24k22_e.lib
  6.  
  7.   #ELSE
  8.     FILES c018i.o
  9.     FILES clib.lib
  10.     FILES p18f24k22.lib
  11.   #FI
  12.  
  13. #FI


A "_CRUNTIME"-t az MPLAB-C18 definiálná vagy nekem kellene ?!

Adatlap szerint :
Idézet:
„The
default linker scripts provided by MPLAB C18 link with either the c018i.o or
c018i_e.o module depending on whether Non-extended mode or Extended mode is
being utilized, respectively”
A hozzászólás módosítva: Ápr 18, 2014
(#) Hp41C válasza kissi hozzászólására (») Ápr 18, 2014 /
 
Az lkr -t neked kellene megítni illetve a meglevők közül kiválasztani és esetleg módosítani. A <telepítési könyvtár>/lkr tele van állományokkal. A e végyődés az Extended mode -ra utal. Válassz onnan egy a kontrolleredhez való i -t tartalmazót, módosítsd, tedd bele a projectbe.
(#) kissi válasza Hp41C hozzászólására (») Ápr 18, 2014 /
 
Szia!

Írtam, hogy csak a 18f24k22_g.lkr van, ezt hogyan használjam ?!
C18 v3.40 .

Köszönöm, hogy próbálsz segíteni, mert itt nem látom a fényt az alagút végén !

szerk.: A "_CRUNTIME"-al mit kezdjek ?!
A hozzászólás módosítva: Ápr 18, 2014
(#) icserny válasza Hp41C hozzászólására (») Ápr 19, 2014 /
 
Idézet:
„A e végyődés az Extended mode -ra utal. Válassz onnan egy a kontrolleredhez való i -t tartalmazót, módosítsd, tedd bele a projectbe.”

Nincsen már külön _e és _i változat, helyette _g van, amelyikben feltételes linkelési direktívák választják ki a megfelelő változatot:
  1. #IFDEF _CRUNTIME
  2.   #IFDEF _EXTENDEDMODE
  3.     FILES c018i_e.o
  4.     FILES clib_e.lib
  5.     FILES p18f14k22lin_e.lib
  6.   #ELSE
  7.     FILES c018i.o
  8.     FILES clib.lib
  9.     FILES p18f14k22lin.lib
  10.   #FI
  11. #FI
(#) kissi válasza icserny hozzászólására (») Ápr 19, 2014 /
 
Igen, de ezt a "_CRUNTIME"-t a fordító hozza létre vagy nekem kell tenni valamit a cél érdekében , illetve kell-e nekem és mikor szerkesztenem a c018x.c fájlokat ?!
A hozzászólás módosítva: Ápr 19, 2014
(#) Hp41C válasza kissi hozzászólására (») Ápr 19, 2014 /
 
Ez akkor megint egy saját magunkkal való inkompatibilitás a MicroChip -től a MpLabX környékéről. Elvárható lenne egy ekkora cégtől, hogy körültekintően jár el és gondol azokra is, akiknak temérdek már elkészült projectje van C18 (vagy egyéb fordítójukkal). Belőlük élnek / éltek eddig....
C18 V3.35 -ig úgy volt, ahogy leírtam...
Ezek szerint a _CRUNTIME és az _EXTENDEDMODE az MpLab -ban nem állítodnak be rendesen...
Idézet a "Release Notes for MPLINK™ Object Linker and Utilities v4.35" -ből
Idézet:
„Generic Linker Scripts:
Using the conditional directives, now a single generic linker script, per device, replaces the various existing linker scripts, eliminating the need for an explicit selection of a linker-script inside the MPLAB projects. Through the /p and /u command-line flags, the IDE communicates the part number and different debug and part specific information to MPLINK. Accordingly, MPLINK selects the proper generic linker script and uses it to link the entire project. Any combination of the following build possibilities will automatically be handled without the user needing to worry about linker scripts:”

A legjobb, amit ajánlani tudok:
Másold át a general linker scriptet a projectedbe, töröld ki belőle a felesleget, tedd be a módosított scriptet a liker scripts alá. Az idézett bekezdés előtt azt írták, ez működni fog.
A hozzászólás módosítva: Ápr 19, 2014
(#) Saggitarius válasza Brienter hozzászólására (») Ápr 19, 2014 /
 
A kerdesre a megoldas: File >> Project properties >> Categories > General > Source folders > Add > valaszd az aktualis projeckthez valo konyvtarat. >> Apply (ennek hatasara a Source folders ablakban megjelenik egy pont) >> OK es voila eltuntek a hibauzenetek.
(#) kissi válasza Hp41C hozzászólására (») Ápr 19, 2014 /
 
Köszönöm, majd próbálom ( jelenleg szétszedtem a kapcsolást, mert protoboard-on volt !) !
(#) tamasati hozzászólása Máj 17, 2014 /
 
Üdvözletem minden fórumozónak!

Abban szeretném kérni a segítségeteket, hogy piklab-ban Hi-Tech fordítót szeretnék használni úgy, ahogy egy rendes fordító működik, nevezetesen több .c és .h állománnyal. Jelenleg csak úgy hajlandó nekem működni, hogy van egy .c állományom ami main, a többit pedig csak .h-nak fogadja el. Láttam a manualban hogy van valami driver amit be kellene állítani, mert több üzemmódban is képes működni, de őszintén szólva nem tudtam kiokoskodni hogyan kell konfigurálni a fordító és a linker parancssorát. Tudnátok adni valami ötletet?
(#) kit6263 hozzászólása Máj 23, 2014 /
 
Erra talát már valaki megoldást ?
sprintf COFF Error
PICC 9.80-at használok és csak a az sprintf kellene a lebegő pontos számok kiírásához, de lassan a halálba kerget, hogy állandóan felhoz egy hibaüzenetet.
Köszi...
(#) kit6263 válasza kit6263 hozzászólására (») Máj 23, 2014 /
 
Megnéztem és a 9.65 nem csinálja !
(#) Wudoou hozzászólása Jún 3, 2014 /
 
Sziasztok!

MODBUS protokollt szeretnék megvalósítani RTU-t, 0x03 funkciókódra válasz csomagot egyenlőre.
A MODBUS-t sikeresen megírtam, szépen működik, válaszolgat, de néha timeout-om van, és még ritkábban Invalid response is modscan-nel tesztelve.
Körülbelül 150.000 üzenetből kevesebb, mint 1000, vagyis még 1 % sem, de annak sem kellene lennie. Még a timeout elképzelhető is, ugyanis emellett 1wire protokol is fut, mégpedig ds18b20 hőmérés 24 darab érzékelővel és ugye a 1wire kritikus részein tiltom a megszakítást, így elképzelhető, hogy pont akkor jön egy kérés, mikor tiltva van. Ám szeretném fejleszteni, ahogy tudom persze. Mi a javaslatotok?
A struktúra pillanatnyilag a következő:
A main függvényben kontrol flageket vizsgálok, amennyiben igaz, úgy végrehajtom, egyébként nem. A flageket a megszakításban engedélyezem bizonyos számú megszakítás esetén.
Amennyiben jön egy karakter uarton, a megszakítás megvizsgálja, hogy az 1. bájt-e, vagyis egyezik-e a PIC címmel. Ha igen, bevár még további 7 bájtot, emellett párhuzamosan fut egy timer is, ha egy adott idő alatt nem érkezik be a 7 bájt, akkor kilökjük a buffer tartalmát. A további hét bájt:
1 funkciókód, 2 start address, 2 quantity, 2 crc.
Ha megjöttek (megszakításban nem vizsgálok minőségre, csak mennyiségre, kivétel az első bájt, a cím), akkor modbus flag=1, amit a főprogram kiértékel. Ha minden adat stimmel, akkor válaszol, amúgy nem.
A kiértékelés közben létrehozok egy másik buffert, amibe átmásolom a bejövő usart tartalmát, így a vizsgálat alatt nem lesz foglalt a bejövő bufferem, elvileg jöhet újabb üzenet is. Valamit ennek ellenére nem jól csinálhatok, mert van úgy, hogy Invalid response jön a modscan-en, ami nem jó üzenetet jelent. Hogyan szervezzem át a kódot?
Talán szervezzem át úgy, hogyha bejött az első bájt, akkor utána ne csináljon semmit a program, hanem várja meg a többit is? Válaszokat előre is köszönöm!
(#) watt válasza Wudoou hozzászólására (») Jún 4, 2014 /
 
Az mindenképpen problémás, ha 1 karakteridőnél hosszabb ideig tiltod a megszakítást.
(#) Wudoou válasza watt hozzászólására (») Jún 4, 2014 /
 
Értem. Azt viszont nem akarom, hogy akkor addig meg ott álljak a megszakításban, míg be nem jön a további 7 bájt. Az sem jó, nem?
(#) icserny válasza Wudoou hozzászólására (») Jún 4, 2014 /
 
Nem kell ott állni, csak ne tiltsd le a megszakítást, amíg a csomag véget nem ér.
(#) Wudoou válasza icserny hozzászólására (») Jún 4, 2014 /
 
Akkor ha jól értem:
Fut a program.
  1. void main(void)
  2. {
  3.        
  4.         pic_init();
  5.         initUART();
  6.         lcd_init();
  7.         lcd_init_cgram();
  8.         lcd_clear();
  9.         CLRWDT();
  10.         T0IE=1;
  11.         start_allds1820();
  12.         while(1)
  13.         {
  14.                 if (kijelzo_frissites_flag)     // öt másodpercenként fut ide bele
  15.                 {
  16.                         kijelzo_frissites_flag=0;
  17.                 }
  18.  
  19.         CLRWDT();
  20.  
  21.                 if (meres_flag) // egy másodpercenként fut ide bele
  22.  
  23.                 {
  24.                         if(Erase_ROM_flag)
  25.                         {
  26.  
  27.                                 Erase_ROM_flag=0;
  28.                         }
  29.                         if(Finddevices_flag)
  30.                         {
  31.  
  32.                                 Finddevices_flag=0;
  33.                         }
  34.                         start_allds1820();
  35.                         meres_flag=0;
  36.                 }
  37.  
  38.                 if (soros_flag)
  39.                 {
  40.                         MB_control = ReadMBFrame();
  41.  
  42.                         if (MB_control == 0)
  43.                                 readRegResponse(&atlag);       
  44.                        
  45.                         else
  46.                                 writeBadRequest(MB_control);
  47.  
  48.                         soros_flag=0;
  49.                 }
  50.  
  51.                 if (kimeno_puffer.hatralevo && TXIF)   
  52.                 {
  53.                         RTS_ON();
  54.                         TXREG = kimeno_puffer.kimeno_adat[kimeno_puffer.hossz-kimeno_puffer.hatralevo];
  55.                         TXEN = 1;
  56.                         while (!TRMT);
  57.                         RTS_OFF();
  58.                         kimeno_puffer.hatralevo--;     
  59.                 /*
  60.                         if(kimeno_puffer.hatralevo==0)
  61.                         {
  62.  
  63.                         }
  64.                 */
  65.                 }//end if
  66.        
  67.         }       //end while
  68. }


A megszakítás:
  1. void interrupt isr(void)
  2. {
  3.         BYTE cgetchar;
  4.        
  5.         static u16 kijelzo_idozito=4500;
  6.        
  7.         static u16 meres_idozito=4500;
  8.  
  9.         static BYTE Modbus_timeout=0;
  10.                
  11.         static BYTE Seged_idozito=0;
  12.  
  13.  
  14.         if (T0IE && T0IF)       // 65ms idonkent jon ide a vezerles. De akar lehet hosszabb ido is, pl. 10s is, vagy amit a hardverben be lehet állítani
  15.         {
  16.                 T0IF=0;
  17.                
  18.                 kijelzo_idozito++;
  19.                 if (kijelzo_idozito==5700)      // 1ms időalap esetén
  20.                 {
  21.                         kijelzo_idozito=4000;
  22.                         kijelzo_frissites_flag=1;
  23.                 //      RA0^=1;
  24.                 }
  25.                
  26.                 meres_idozito++;
  27.                 if (meres_idozito==5500)        // szintén 1ms időalap esetén
  28.                 {
  29.                         meres_idozito=1000;
  30.                         meres_flag=1;
  31.                 }
  32.                
  33.                 if (!Finddevices_Search)
  34.                 {
  35.                         Seged_idozito++;
  36.                         if(Seged_idozito>=3)
  37.                           {
  38.                                 Seged_idozito=0;
  39.                                 Finddevices_flag=1;
  40.                                 RA0=1;
  41.                           }
  42.                 }
  43.  
  44.                 if (!Erase_ROM)
  45.                 {
  46.                         Seged_idozito++;
  47.                         if(Seged_idozito>=3)
  48.                           {
  49.                                 Seged_idozito=0;
  50.                                 Erase_ROM_flag=1;
  51.                                 RA0=1;
  52.                           }
  53.                 }
  54.  
  55.                 if (!PLUS)
  56.                 {
  57.                         CCPR1L++;
  58.                         if(CCPR1L>=253)
  59.                           {
  60.                                 CCPR1L=253;
  61.                           }
  62.                 }      
  63.  
  64.                 if (!MINUS)
  65.                 {
  66.                         if(CCPR1L!=0)CCPR1L--;
  67.                         else CCPR1L=0;
  68.                 }
  69.  
  70.                 if(MB_start_flag)
  71.                 {
  72.                         Modbus_timeout++;
  73.                         if(Modbus_timeout==2)
  74.                         {
  75.                                 MB_start_flag=0;       
  76.                                 Bejovo_puffer.hossz=0;
  77.                                 Modbus_timeout=0;
  78.                                
  79.                         }
  80.                 }
  81.         }
  82.        
  83.         while (RCIF)    // soros port dolgai
  84.         {
  85.                
  86.                 if (OERR)
  87.                 {
  88.         // overrun - eldobáljuk a puffer tartalmát, majd reset
  89.                  while (RCIF)
  90.                         {
  91.                          (void)RCREG;
  92.                      CREN = 0;
  93.                      CREN = 1;
  94.                      continue;
  95.                         }
  96.             }
  97.                 frameerr = FERR != 0;
  98.                 cgetchar = RCREG;
  99.             if (frameerr)
  100.                 {
  101.                 // frame error - karakter eldobása    
  102.                   (void)RCREG;
  103.                   MB_start_flag=0;
  104.                   Modbus_timeout=0;
  105.                   Bejovo_puffer.hossz=0;
  106.                 }
  107.                 else
  108.                 {      
  109.                         if ( MB_start_flag == 0 && soros_flag == 0 && cgetchar == SLAVE_ADDRESS )
  110.                         {
  111.                                 MB_start_flag=1;                //ezzel elindítunk egy timert, ha lejár, akkor reseteli a vételi puffer hosszt                                                                              
  112.                                 Bejovo_puffer.hossz=0;//ezzel jelezzük, hogy megjött az első karakter, vagyis a cím
  113.                                 Bejovo_puffer.adat[Bejovo_puffer.hossz++]=cgetchar;     //cím mentése
  114.                                 // ürítjük a fogadó puffert
  115.                         }
  116.                         else if ( MB_start_flag == 1 && soros_flag == 0 )       //itt már meg kellett jönnie e címnek
  117.                         {
  118.                                 Bejovo_puffer.adat[Bejovo_puffer.hossz++]=cgetchar;
  119.  
  120.                                 if(Bejovo_puffer.hossz == 8)
  121.                                 {
  122.                                         soros_flag=1;
  123.                                         MB_start_flag=0;
  124.                                         Modbus_timeout=0;
  125.                                 }       //end if
  126.                         }               //end else
  127.                 }                       //end else
  128.         }                               //end RCIF
  129. }                                       //end ISR



Vagyis az a baj, hogy ha éppen le van tiltva a megszakítás, mert hőt mérek, akkor nem tudom fogadni a karaktert. Tehát ha jön egy karakter és éppen nincs letiltva a megszakítás, akkor mit csináljak a mérés flag-el, kijelző flag-el?
A hozzászólás módosítva: Jún 4, 2014
(#) potyo válasza Wudoou hozzászólására (») Jún 4, 2014 /
 
Mikor tiltod le pontosan a megszakítást és engedélyezed újra a mérés folyamán?
(#) watt válasza Wudoou hozzászólására (») Jún 4, 2014 /
 
A megszakítást csak nagyon indokolt esetben, nagyon rövid időre illik letiltani. Nem látok olyan okot, hogy a hőmérés miatt le kéne tiltani bármilyen megszakítást. Te milyen indokot látsz erre?
(#) icserny válasza Wudoou hozzászólására (») Jún 4, 2014 /
 
Idézet:
„Tehát ha jön egy karakter és éppen nincs letiltva a megszakítás, akkor mit csináljak a mérés flag-el, kijelző flag-el?”
A kijelző flag nem gond (feltételezem, ott nincs letiltva a megszakítás). A mérés flag viszont az üzenetcsomag első bájtjától a befejezésig ne billenjen be (majd csak a csomag beérkezte után).

Egyébként bölcsebb lenne valamilyen hardveres megoldást találni a hőmérők beolvasására, hogy egyáltalán ne legyen letiltva a megszakítás.
(#) potyo válasza watt hozzászólására (») Jún 4, 2014 /
 
DS18B20-nál egy bit átvitelének idejére általában le kell tiltani, mert az időzítés nem timerrel van megoldva, hanem néhány NOP-al (60us a bitidő). Én arra gondolok, hogy nem csinálta meg azt, hogy minden bit elején letiltja, és a végén engedélyezi, hanem a teljes mérési eredmény olvasása előtt tiltja le, és csak a legvégén engedélyezi. Vagy esetleg csak az egyes bájtok olvasása előtt tiltja le, és a bájt olvasása végén engedélyezi újra. Ha tényleg úgy van, ahogy gondolom, akkor ez legalább 5,3ms (gyakorlatban inkább >6ms), illetve ha bájtonként, akkor 480us (gyakorlatban >550us) időt jelent, amikor a megszakítások ki vannak kapcsolva. Most hogy a modbus milyen sebességgel megy, azt nem tudom, de a 6ms az 4800bps sebesség mellett is túlcsordulást okoz.
(#) watt válasza potyo hozzászólására (») Jún 4, 2014 /
 
Nem használtam megszakítás tiltást DS18B20-hoz, jól működött. Sima várakozásokkal működik, amiket megszakít a megszakítás ha kell. Nyílván a megszakítás nem vehet el sok időt, de ez szervezés kérdése. Ettől eltekintve biztosan van olyan, amikor ez nem megfelelő, de elég extra eset lehet.
(#) potyo válasza watt hozzászólására (») Jún 4, 2014 /
 
És nem fordulnak elő CRC hibák?
(#) watt válasza potyo hozzászólására (») Jún 4, 2014 /
 
Hát nem nagyon, de ha van lekezelem.
(#) Wudoou válasza watt hozzászólására (») Jún 4, 2014 /
 
1wire protokoll ajánlása.
(#) Wudoou válasza potyo hozzászólására (») Jún 4, 2014 /
 
Tökéletes volt a kifejtésed. Úgy írtam meg a programot, ahogy leírtad.
(#) Wudoou válasza icserny hozzászólására (») Jún 4, 2014 /
 
Igen, ott nincs. Akkor kipróbálom, ahogy írtad.
(#) potyo válasza Wudoou hozzászólására (») Jún 4, 2014 /
 
Tehát minden bit előtt tiltod és utána engedélyezed a megszakítást? Akkor elvileg nem marad le a soros megszakításról. Esetleg a 1-wire Reset ideje alatt? Mekkora kommunikációs sebességet használsz?
(#) potyo válasza Wudoou hozzászólására (») Jún 4, 2014 /
 
Ajánlást azt végülis nem kötelező betartani...
(#) Wudoou válasza potyo hozzászólására (») Jún 4, 2014 /
 
Nem, bájtonként van tiltva.
Idézet:
„Vagy esetleg csak az egyes bájtok olvasása előtt tiltja le, és a bájt olvasása végén engedélyezi újra.”
(#) watt válasza Wudoou hozzászólására (») Jún 5, 2014 /
 
Ennek ellenére sokan nem tiltogatnak, csak CRC ellenőriznek és ha hiba van kidobják az értéket. pl. a FlowCode 1wire moduljában sincsenek megszakítás tiltások, igaz nem referencia, de működik...
Következő: »»   96 / 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