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   67 / 118
(#) sysy válasza messer hozzászólására (») Dec 7, 2011 /
 
Használd a #separate direktívát.
Nagyon hasznos.
(#) whalaky hozzászólása Dec 7, 2011 /
 
Üdv mindenkinek!

Már fél napja kinézem a szemem és nem látom mi a hiba.

Topi mester féle dcf dekódolóval küzdök, de a paritás ellenőrzés valahogy nem kakar összeállni.
  1. case 20: ParityOK = b;
  2.          parity_cou = 0;
  3.          #ifdef RS_232
  4.          fprintf( serial, "--- start --- \r\n" );
  5.          if (ParityOK) { fprintf( serial, "Start bit OK\r\n" ); }
  6.          else { fprintf( serial, "START BIT ERROR - %u\r\n", b+parity_cou ); }
  7.          #endif
  8.          break;   /* ez mindig 1 ez a start */
  9.       case 21: dcf_time.minute = b;    if(b)  parity_cou++;       break;
  10.       case 22: if(b) {dcf_time.minute += 2;   parity_cou++;}      break;
  11.       case 23: if(b) {dcf_time.minute += 4;   parity_cou++;}      break;
  12.       case 24: if(b) {dcf_time.minute += 8;   parity_cou++;}      break;
  13.       case 25: if(b) {dcf_time.minute += 10;  parity_cou++;}      break;
  14.       case 26: if(b) {dcf_time.minute += 20;  parity_cou++;}      break;
  15.       case 27: if(b) {dcf_time.minute += 40;  parity_cou++;}      break;
  16.       case 28: ParityOK &= (b+parity_cou)%2==0;
  17.          #ifdef RS_232
  18.             fprintf( serial, "ParityOK = %u\r\n", ParityOK );
  19.             if (ParityOK) { fprintf( serial, "Min CRC OK - min: %u\r\n", dcf_time.minute ); }
  20.             else { fprintf( serial, "Min CRC ERROR - %u\r\n", b+parity_cou ); }
  21.             fprintf( serial, "(b+parity_cou) mod 2 = %u,  b = %u,  parity_cou = %u\r\n", (b+parity_cou)%2, b, parity_cou );
  22.          #endif
  23.          parity_cou = 0;
  24.          output_bit(LED_CRC, !ParityOK );  
  25.          break;
  26.  
  27.       case 29: dcf_time.hour = b;      if(b)  parity_cou++;       break;


és a kimenet:
DCF bit 19 - 0
DCF bit 20 - 1
--- start ---
Start bit OK
DCF bit 21 - 0
DCF bit 22 - 1
DCF bit 23 - 1
DCF bit 24 - 0
DCF bit 25 - 1
DCF bit 26 - 0
DCF bit 27 - 0
DCF bit 28 - 1
ParityOK = 0
Min CRC ERROR - 4
(b+parity_cou) mod 2 = 0, b = 1, parity_cou = 3
DCF bit 29 - 1
DCF bit 30 - 0

Valamit nem látok..... de mit?
(#) whalaky válasza whalaky hozzászólására (») Dec 7, 2011 /
 
OK, ne keressétek, meggyógyult.
Hogy mitől azt ne kérdezzétek, mert fogalmam nincs, a sokadik build után egyszercsak jó lett..
(#) sysy válasza whalaky hozzászólására (») Dec 8, 2011 /
 
Annak ellenére, hogy neked működik, sajnos a Topi mester féle dekódoló nem jó. Innen látszik, hogy a paritásbitet nem jól kezeli. Topi mester szerintem nem próbálta ki a függvényét és sajnos így lökte oda a koncnak a többieknek. De hát, mint tudjuk, minden ingyen programban van legalább egy hiba szívatásnak.
(#) foxi63 hozzászólása Dec 8, 2011 /
 
Hali mindenkinek!
Segítséget szeretnék kérni. Pic 16f88 programozok ccs compillerrel. A fordítás a programozás minden rendben megy, azonban bármilyen .h fájlt hozzáadok a projecthez egyből hibaüzeneteket ordibál a fordító.
PL stdlib.h csatolása is hibát okoz.

error1.JPG
    
(#) sysy válasza foxi63 hozzászólására (») Dec 8, 2011 /
 
A project ablakban töröld ki a 16F88.h filét, mert kétszer akarja includolni a programodba.
Ugyanez a hibája a stdlib.h esetében is.
Elég ha te includolsz.
(#) subi válasza sysy hozzászólására (») Dec 8, 2011 /
 
Sziasztok!
A Topi féle DCF77 dekódoló rutin szerintem ötletes, elegáns. Egy kis átfésülés után nekem a teljes adatfolyamot kifogástalanul visszafejti. Íme:
  1. //DCF77 dekódoló unit by TOPI
  2.  
  3. #define DECODE_DATUM    // dátum változók nincsenek aktiválva
  4. extern int16 TickCount;
  5. extern short volt_mar_dcf;
  6. extern short Parity_Date_OK;
  7.  
  8. int parity_cou = 0;
  9. int  dcf_index = 0;
  10.  
  11. struct Tido {// sruktura definíció
  12. unsigned int perc,ora,masodperc
  13. #ifdefDECODE_DATUM
  14. ,ev,nap,honap,het_napja
  15. #endif
  16. ;
  17. short UjIdo;
  18. short isSummer;
  19. short TimeZoneChg;
  20. short ReserveAntenna;
  21. };
  22. struct Tido IDO;
  23.  
  24. short ParityOK;
  25.  
  26.  
  27. void dcf77_alt_decode(boolean b){// DCF77 decodoló rutin
  28.  
  29. switch(dcf_index)
  30. {
  31. case 0:  IDO=0; parity_cou = 0;break;
  32. case 15: IDO.ReserveAntenna = b;break;
  33. case 16: IDO.TimeZoneChg = b;break;
  34. case 17: IDO.isSummer = b;break;
  35.  
  36. case 20: ParityOK = b;break;// ez mindig 1 ez a start  
  37. case 21: if(b){IDO.perc = b;parity_cou++;};break;//aktuális perc értékek jönnek
  38. case 22: if(b){IDO.perc += 2;  parity_cou++;}break;
  39. case 23: if(b){IDO.perc += 4;  parity_cou++;}break;
  40. case 24: if(b){IDO.perc += 8;  parity_cou++;}break;
  41. case 25: if(b){IDO.perc += 10; parity_cou++;}break;
  42. case 26: if(b){IDO.perc += 20; parity_cou++;}break;
  43. case 27: if(b){IDO.perc += 40; parity_cou++;}break;
  44. case 28: ParityOK &= ((b+parity_cou)%2==0);break;// páros vagy páratlan szám viszgálat %2 == 0 páros %2 != 0 páratlan
  45.  
  46. case 29: if(b){IDO.ora = b;parity_cou++;}break;// aktuális óra értékek jönnek
  47. case 30: if(b){IDO.ora += 2;  parity_cou++;}break;
  48. case 31: if(b){IDO.ora += 4;  parity_cou++;}break;
  49. case 32: if(b){IDO.ora += 8;  parity_cou++;}break;
  50. case 33: if(b){IDO.ora += 10; parity_cou++;}break;
  51. case 34: if(b){IDO.ora += 20; parity_cou++;}break;
  52. case 35: ParityOK &= ((b+parity_cou)%2==0);break;
  53.  
  54.  #ifdefDECODE_DATUM// amennyiben a dátum változók definiáltak, lekérjük az értékeket
  55. case 36: if(b){IDO.nap = b;parity_cou++;}break;// aktuális dátum - nap értékek jönnek
  56. case 37: if(b){IDO.nap += 2;  parity_cou++;}break;
  57. case 38: if(b){IDO.nap += 4;  parity_cou++;}break;
  58. case 39: if(b){IDO.nap += 8;  parity_cou++;}break;
  59. case 40: if(b){IDO.nap += 10; parity_cou++;}break;
  60. case 41: if(b){IDO.nap += 20; parity_cou++;}break;
  61.  
  62. case 42: if(b){IDO.het_napja = b;parity_cou++;}break;// aktuális hét napja értékek jönnek 1-Hétfő ...... 7-Vasárnap
  63. case 43: if(b){IDO.het_napja +=2;parity_cou++;}break;
  64. case 44: if(b){IDO.het_napja +=4;parity_cou++;}break;
  65.  
  66. case 45: if(b){IDO.honap = b;  parity_cou++;}break;// aktuális dátum - hónap értékek jönnek
  67. case 46: if(b){IDO.honap += 2;  parity_cou++;}break;
  68. case 47: if(b){IDO.honap += 4;  parity_cou++;}break;
  69. case 48: if(b){IDO.honap += 8;  parity_cou++;}break;
  70. case 49: if(b){IDO.honap += 10; parity_cou++;}break;
  71.  
  72. case 50: if(b){IDO.ev = b;  parity_cou++;}break;// aktuális dátum - év értékek jönnek
  73. case 51: if(b){IDO.ev += 2;  parity_cou++;}break;
  74. case 52: if(b){IDO.ev += 4;  parity_cou++;}break;
  75. case 53: if(b){IDO.ev += 8;  parity_cou++;}break;
  76. case 54: if(b){IDO.ev += 10;  parity_cou++;}break;
  77. case 55: if(b){IDO.ev += 20;  parity_cou++;}break;
  78. case 56: if(b){IDO.ev += 40;  parity_cou++;}break;
  79. case 57: if(b){IDO.ev += 80;  parity_cou++;}break;
  80. case 58: ParityOK &= ((b+parity_cou)%2==0);break;
  81.  #endif
  82. }
  83. }
  84.  
  85. void dcf77_isr(){
  86.  
  87. if(TickCount > 1500){//ha kimaradt egy... vagyis ez már az új perc első tick-je
  88.  
  89. TickCount = 0;//először ez kell, mert ezutáni is idő... talán
  90. dcf_index = 0;
  91. if(!volt_mar_dcf) IDO.masodperc = 0;
  92. if((IDO.perc > 59) || (IDO.ora > 24))  ParityOk = false;
  93. #ifdefDECODE_DATUM
  94. if((IDO.nap > 31)|| (IDO.nap < 0))ParityOK = false;
  95. if((IDO.nap < 1) || (IDO.het_napja > 7))ParityOK = false;
  96. if((IDO.honap > 12) ||(IDO.honap < 1)) ParityOK = false;
  97. if((IDO.ev < 6) || (IDO.ev > 99))ParityOK = false; //2006 előtti
  98. #endif
  99.  
  100. IDO.UjIdo = ParityOK;
  101. ParityOK = false;
  102. }
  103. else if(TickCount > 300){//ilyenkor már nincs semmi adat
  104. TickCount = 0;
  105. }
  106. }
  107.  
  108.  
  109. void dcf77_get_input(){
  110.  
  111. //150 ms-enként hívódik meg. Ha akkor 1-es akkor 1-es jött
  112. //ha 0-ás lenne, akkor ilyenkor az már 0 lenne...
  113. //ezután hagyjuk a timert tovább ketyegni
  114.  
  115. dcf77_alt_decode(DCF77_ADAT);
  116. dcf_index++;
  117. }
(#) foxi63 hozzászólása Dec 8, 2011 /
 
sysy!
A válasz gomb sajna nem működik...

Tehát : Töröltem a projectből az include fájlokat, de sajna így sem jó...
Az MPLAB 8.1 van fenn, meg a plugin, és a 4.108-as verzió
(#) sysy válasza foxi63 hozzászólására (») Dec 9, 2011 /
 
Küld el magánban a projectet, mert annak működnie kell.
(ha nem titkos)
(#) messer válasza icserny hozzászólására (») Dec 9, 2011 /
 
Köszönöm válaszodat.
(#) messer válasza sysy hozzászólására (») Dec 9, 2011 /
 
Köszönöm válaszod ki tudnád nekem kicsit fejteni, hogy mit is jelent ez a parancs és hogyan kell használni?
(#) sysy válasza messer hozzászólására (») Dec 9, 2011 /
 
A C fordító szegmensekben helyezi el a ROM-ban a programot. Ha valamelyik (vagy több) függvényed nem fér már bele az adott szegmensbe, akkor szokott ilyen hibákat írni, hogy nincs elég memória. A #separate utáni függvényt áthelyezi egy másik szegmensbe. Sajana ez több stackot igényel, de szokott működni. A hibaüzenetből néha rá lehet jönni, hogy melyik függvénye(i)d nem fér bele a memóriába. A prototipusoknál is a direktívával együtt kell leírni a függvény nevét, ha prototipust használsz. A hatásköre arra a függvényre vonatkozik, ami rögtön alatta van. Engem néha kihúzott a sz@rból. Ha ez sem segít, akkor fogadd meg az icserny fórumtársunk javaslatait.

Használata:

#separate
void
függvény()
{
...
...
...
}
(#) messer válasza sysy hozzászólására (») Dec 9, 2011 /
 
Köszönöm, már megfogadtam kicsit össze nyomtam a programot így már bele-bele fér, de ezt is nagyon jó tudni amit ti javasoltatok biztosan alkalmazni fogom.
(#) Dempsey hozzászólása Dec 25, 2011 /
 
Sziasztok!
Szeretnék egy LED fényerejét PWM-el vezérelni, úgy hogy folyamatosan növekedjen a fényerő. Tudnátok segíteni, hogy hogyan csináljam? Már írtam egy keveset, de nem tudom hogyan hivatkozzak egy kimenetre.
  1. # include "18f45k20.h"
  2. #fuses hs,nowdt,noprotect,noput,nomclr
  3. #use delay (clock=20000000)
  4.  
  5. void main () {
  6.  
  7. int i,value;
  8. setup_ccp1(CCP_PWM);  
  9.  
  10. setup_timer_2(T2_DIV_BY_16, 255, 1);
  11.  
  12. while(TRUE)
  13. {
  14. for (i=0;i<255;i++){
  15. set_pwm1_duty(i);
  16. delay_ms(100);
  17. }}
  18. }

Köszönöm a segítséget!
(#) szkrep válasza Dempsey hozzászólására (») Dec 25, 2011 /
 
Jelenleg csak 25% -ig növeled a kitöltési tényezőt. A változó legyen "unsigned int16" és a ciklusban 1024-ig engedd fel. Ha a delay túl nagy, lehet hogy túl lassan fut fel, ha túl kicsi, akkor nem is látod mi történik. A FOR ciklus elé írj egy olyat, hogy "i=0;" különben csak egyszer fog lefutni. Egyéb hibát én nem látok, itt máshogy nem kell a kimenetre hivatkozni -csak biztosan azon legyen a LED.
(#) Dempsey válasza szkrep hozzászólására (») Dec 25, 2011 /
 
Köszi a segítséget, de még mindig nem tudom, hogy hogyan hivatkozzak a LED-re mondjuk ha azt a D0-ás portra akarom tenni?
(#) potyo válasza Dempsey hozzászólására (») Dec 25, 2011 /
 
A ledet muszáj a CCP1 lábra tenned, ha a hardveres pwm-et akarod használni. Vagy esetleg CCP2 láb, de akkor azt a modult kell a kódban beállítanod (gondolom setup_ccp2 és set_pwm2_duty kellene)
(#) Dempsey válasza potyo hozzászólására (») Dec 25, 2011 /
 
Aha értem. Megpróbálom működik-e.
(#) Dempsey válasza Dempsey hozzászólására (») Dec 25, 2011 /
 
Köszi szépen a segítséget mindkettőtöknek működik!
(#) icserny válasza Dempsey hozzászólására (») Dec 26, 2011 /
 
Ha lineárisan növeled a kitöltést, az nem lesz jó, mert a szemünk nem lineárisan növekvőnek érzékeli a fényerőt. Bár nem PIC, de az MSP430 mikrovezérlőkről szóló cikksorozatomba érdemes belenézni, mert a PWM hardveres támogatással c. részben ismertetek olyan algoritmust (Rusty Haddock nyomán), ami négyzetesen növekvő/csökkenő kitöltést állít elő szorzás és osztás nélkül (a négyzetszámokat a páratlan számok felösszegzésével, a skálázást pedig léptetéssel oldjuk meg).
(#) Dempsey válasza icserny hozzászólására (») Dec 26, 2011 /
 
Szia!
Ebben igazad van mert elég furcsa lett a fényerő növekedése, ilyen ugrálás szerű. Belenézek abba amit küldtél. Igazából RGB LED vezérlést szeretnék csinálni, találtam is egy példaprogramot hozzá (szoftveres PWM) ezzel kínlódok. Köszi a segítséget.
(#) nagy_david1 hozzászólása Dec 26, 2011 /
 
Üdv!

Nekem is lenne egy kezdő kérdésem. Tegyük fel a uC 4MHz-en ketyeg. Nekem van egy pl. 50 soros kódom ami tartalmaz pl. egy 1 másodperces "delay"-t valahol és mondjuk növelek 1-el mindig egy változót ez a késleltetés után majd a program fut tovább. Ki lehet jelenteni, hogy a változó az eltelt másodpercek számát fogja számolni vagy rá fog ere tevődni még az az idő is amíg a program többi részével "végez" a uC. Pl. 10 napja fut a program és "i"-nek 60*60*24*10 másodpercnek kéne lennie. Ennyi lesz vagy nem? Előre is köszi és elnézést az esetlen kérdésért. További kellemes ünnepeket.
(#) potyo válasza nagy_david1 hozzászólására (») Dec 26, 2011 /
 
Rá fog tevődni. Szimulátorban meg birod nézni, hogy mennyi tevődik rá, de úgy általában ilyen célra a timerek valók, azok hardverből futnak, és mindig pontosan ugyanannyi idő alatt csordulnak túl, nem befolyásolja a futásukat az épp futtatott kód.
(#) nagy_david1 válasza potyo hozzászólására (») Dec 26, 2011 /
 
Szóval akkor mindenképpen timer alkalmazása javasolt és nem érdemes "függvényt" írni ennek kikalibrálására Nagyon szépen köszi a gyors választ.
(#) nagy_david1 válasza potyo hozzászólására (») Dec 27, 2011 /
 
Elgondolkozva a dolgon. Ha timer-t használok akkor ott is nem számítódnak rá pl a túlcsordulásért felelős részek vagy a változókkal való dolgozás? Elég kezdő vagyok.
  1. setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2|RTCC_8_BIT);
  2. set_timer0(0);
  3. time=get_timer0();

CCS könyvből lett kivágva.
(#) nurseboy hozzászólása Jan 15, 2012 1 /
 
Sziasztok.

Nagyon kezdő vagyok. Segítsetek! Hohyan és milyen progival lehet átkonvertálni .c (main.c) állományt beégethető hex-é. Ha valaki tud segítsen?

main.c
    
(#) subi válasza nurseboy hozzászólására (») Jan 15, 2012 1 /
 
Szia! Gondolom az MPLAB alatt írtad. Nos, itt a menőbar - Project fület lenyitva találod a Build All parancsot. Ezzel készíthetsz hex -t.
(#) subi válasza nurseboy hozzászólására (») Jan 15, 2012 /
 
Ja, és még a forrásba bele nézve, kellenek az include filek is mellé.
(#) subi válasza nurseboy hozzászólására (») Jan 15, 2012 1 /
 
Még egy kis segítség. Szóval, ha jó include filoket találtam, akkor itt küldöm lefordítva a main-t.

main.hex
    
(#) icserny válasza nurseboy hozzászólására (») Jan 15, 2012 /
 
Lehetőleg csak egy topikban tedd fel a kérdésedet!
Következő: »»   67 / 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