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   95 / 118
(#) Hp41C válasza djsms hozzászólására (») Dec 12, 2013 /
 
Nem tudja kiszámolni a dátumból... Pedig nem lehetetlen kiszámolni: A dátumot át kell számítani JDN (Julian Day Nuimber) -re, annak 7 -tel való osztásának maradéke adja a hét napját (1 - hétfő). Ha beállítasz egy dátumot, állítsd be a hét napját is. Ezután a beírt számot naponként növeli (modulo 7).
(#) Dempsey hozzászólása Dec 12, 2013 /
 
Sziasztok!
A következő kódnak elvileg azt kellene csinálnia, hogy pontosan 10 másodperc után bekapcsol egy LED-et. A TIMER1-külső karórából bontott kvarcról megy, ezenfelül van még egy 20MHz-es kvarc a rendszernek. Az a problémám, hogy a 10 másodperc nem 10 másodperc, hanem jóval kevesebb kb 2. Mit rontottam el?
  1. #include "16f877a.h"
  2. #fuses hs,NOWDT,NOLVP,NOPUT,NOBROWNOUT
  3. #use delay(clock=20Mhz)
  4. #define preload 57344
  5.  
  6. int16 i=0,k=0;
  7. boolean j=false;
  8.  
  9. #INT_EXT
  10. void rb0_isr(){
  11. if (!input(pin_B0)){
  12. j=true;
  13. output_high(pin_d0);}
  14. }
  15.  
  16. #INT_TIMER1
  17. void timer1_isr(){
  18. set_timer1(preload);
  19. if(j==true){
  20. i=i+1;
  21. }
  22. }
  23.  
  24.         void main (void){
  25.        
  26.         enable_interrupts(INT_EXT);
  27.         EXT_INT_EDGE(H_TO_L);
  28.         setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT);
  29.         enable_interrupts(INT_TIMER1);
  30.         enable_interrupts(GLOBAL);
  31.        
  32.                 for(;;){
  33.  
  34.                         if (i>=10){
  35.                         k=k+1;
  36.                         i=0;
  37.                         }
  38.                         if(k>=1){
  39.                         j=false;
  40.                         output_high(pin_d1);
  41.                         delay_ms(500);
  42.                         i=0;
  43.                         k=0;
  44.                         output_low(pin_d0);
  45.                         output_low(pin_d1);
  46.                         }      
  47.                 }
  48.         }

Köszönöm a segítséget!
(#) Hp41C válasza Dempsey hozzászólására (») Dec 12, 2013 /
 
A Timer 1 1:1 előosztóval, külső 32.768kHz -es quartz -ról 2 másodperc alatt 0 -ról elér 65535 ig és átfordul...
(#) Dempsey válasza Hp41C hozzászólására (») Dec 12, 2013 /
 
De be van állítva elvileg a preload érték is 57344-re így elvileg az interruptnak 1s-osnak kéne lennie, de mégsem annyi. Mit értelmezek félre? Ezt használom kalkulátornak.
(#) Prendick válasza Dempsey hozzászólására (») Dec 12, 2013 /
 
Külső órakvarcnál nem kell 4-el osztani a frekvenciát. Az csak akkor szükséges, ha a főoszcival hajtod meg a TMR1-et.
Tehát a preload legyen 32768.

Van még egy hiba. Elsőnek lefut a teljes TMR1 ciklus, mert csak ezután adod meg (a megszakításban) a preload értékét. Ettől 11s-es cilusod lesz 10 helyett.
(#) Dempsey válasza Prendick hozzászólására (») Dec 12, 2013 /
 
Beállítottam a preloadot 32768-ra így 8 másodperc után kapcsol a LED.
(#) Prendick válasza Dempsey hozzászólására (») Dec 12, 2013 /
 
Hány kHz-es a kvarc? Ha nincs ráírva semmi, akkor addig kell állítgatni a preload-ot, amíg pontos lesz, mert attól, hogy órában volt, nem biztos, hogy a szokványos 32,768 kHz-es.
Van még probléma. Ha pontos időzítést akarsz, akkor a TMR1-et közvetlenül az rb0_isr()-ben indítsd, mert eddig bármi lehetett az értéke 0-1s között.

  1. void rb0_isr(){
  2. if (!input(pin_B0)){
  3. setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_CLK_OUT);
  4. set_timer1(preload);
  5. output_high(pin_d0);}
  6. }



  1. void timer1_isr(){
  2. set_timer1(preload);
  3. i=i+1;
  4. }


  1. if(k>=1){
  2. setup_timer_1(T1_DISABLED);
  3. output_high(pin_d1);
  4. delay_ms(500);
  5. k=0;
  6. output_low(pin_d0);
  7. output_low(pin_d1);
  8. }


Ettől jóval pontosabb lesz az időzítés. Pont gombnyomásra indul és 10 TMR1 ciklus után megáll. Mérd meg a futási időt és állítsd a kvarchoz a preload-ot.
(#) Dempsey válasza Prendick hozzászólására (») Dec 12, 2013 /
 
Úgy ahogy mondod nincs ráírva semmi. Nekem is megfordult a fejembe hogy lehet nem is annyi az értéke. Köszi a javítást megnézem hogy mit produkál és hozzáfogok állítgatni a preloadot.
(#) Dempsey válasza Prendick hozzászólására (») Dec 13, 2013 /
 
Szia!
Megcsináltam amit írtál még tegnap de már nem volt erőm írni ide a fórumba. El kezdtem bejátszani a preload értékét, de észrevettem hogy többszöri indításra nem ugyan abban az időben kapcsol a LED. Most kicsit félretettem az egészet és megvárom míg lesz rendes órakvarc. De ez a jelenség akkor is furcsa, szerintem valami érték benne marad az i változóba azért csinálja ezt.
(#) Prendick válasza Dempsey hozzászólására (») Dec 13, 2013 /
 
Mivel az i-t nem nullázod az rb0_isr()-ben, ha futás közben megnyomod a gombot, újraindul ugyan a TMR1, de bent marad az i-ben a korábbi érték.
Az sem ártana, ha ugyanott letiltanád az INT_EXT-et és csak a 10 másodperces ciklus után engednéd újra. Ezzel kizárhatod a gomb okozta problémákat.
Ehhez nem kell új órakvarc.
(#) Dempsey válasza Prendick hozzászólására (») Dec 13, 2013 /
 
Oké még megpróbálom majd a délután köszi a segítséget.
(#) ernosz hozzászólása Dec 17, 2013 /
 
Sziasztok!
Saját tudatlanságomon elgondolkodva arra jutottam, hogy tanulni kellene. Talán lehetünk még egy páran, akik nem az iskolapadban tanultuk az ANSI C-t, sőt semmilyen programozási nyelvet nem tanultunk, de mindezek ellenére az a mániánk, hogy mikrokontrollereket kell programozni. Nekem az alapokat a Topi: "Nullától a robotokig" cikksorozat jelentette - köszönet érte - és ha ez a cikksorozat nincs akkor valószínű, hogy nem is találkozok a CCS-C-vel. A kérdés az, hogy van-e valaki, aki elvállalná egy hosszabb-rövidebb továbbképzés megtartását, és vagyunk-e annyian, akiknek ezt érdemes lenne megtartani?
(#) icserny válasza ernosz hozzászólására (») Dec 17, 2013 / 2
 
Idézet:
„Talán lehetünk még egy páran, akik nem az iskolapadban tanultuk az ANSI C-t...”
BRIAN W. KERNIGHAN – DENNIS M. RITCHIE: A C programozási nyelv (Az ANSI szerint szabványosított változat)
(#) ernosz válasza icserny hozzászólására (») Dec 19, 2013 /
 
Köszönöm a linkelt anyagot, hasznos lesz a későbbiekben. Viszont nem kifejezetten ANSI C továbbképzésre gondoltam, hanem a CCS-C hardware specifikus parancsaira. Azokra az utasításokra, amik a mikrokontroller működését állítják be. Egy 16F-es sorozathoz tartozó header file-t sikerült részben visszafejteni abban az értelemben, hogy van kapcsolat egy definiált parancs paramétere és a PIC egy adott regisztere között. Ugyan ez a módszer egy PIC24-esnél már nem segített az UART port beállításában. A kérdésem talán az, hogy hol van elrejtve a CCS-C HW parancsaihoz tartozó, az adott beállítást elvégző értékadás.
(A regisztrációmban javítottam az email címemet egy működőre. - és elnézést kérek, ha valaki nem tudott elérni.)
(#) icserny válasza ernosz hozzászólására (») Dec 20, 2013 /
 
Idézet:
„Viszont nem kifejezetten ANSI C továbbképzésre gondoltam, hanem a CCS-C hardware specifikus parancsaira.”
A CCS C perifériakezelő könyvtárai nem nyílforrásúak, ennélfogva csak annyit lehet róluk tudni, ami a dokumentációban le van írva. Magyarul: ez zsákutca.
(#) ernosz válasza icserny hozzászólására (») Dec 20, 2013 /
 
Köszönöm! Akkor egy titokkal kevesebb, és lehet koncentrálni az éppen aktuális feladat megoldására.
(#) whalaky válasza ernosz hozzászólására (») Dec 21, 2013 /
 
Azért a CCS-ben is el lehet érni az összes regisztert és az adatlap szerint fel lehet konfigurálni....
lehet hogy kevésbé olvasmányos, de némi kommentel megtámogatva tudni fogod mi az és lehet hogy hatékonyabb is mint a CCS belső univerzális cucca.
(#) icserny válasza whalaky hozzászólására (») Dec 22, 2013 /
 
Idézet:
„Azért a CCS-ben is el lehet érni az összes regisztert és az adatlap szerint fel lehet konfigurálni....”
Lehetni lehet, de akkor mi értelme marad a CCS C használatának? Akkor már inkább a C30, amihez nyíltforrású perifériakönyvtárak és mintaprogramok is rendelkezésre állnak. Sőt, tankönyv is... Bővebben: Link
(#) djsms hozzászólása Dec 23, 2013 /
 
Nokia 5510 lcd-t használok, de felmerült egy érdekes igény. El kellene forgatni 90 fokkal az egészet és úgy használni.
Van erre valami egyszerű ötlet?
Egyelőre csak karakteres kiiratások vannak, grafika még nincs.
(#) whalaky válasza icserny hozzászólására (») Dec 24, 2013 /
 
Ha a beépített funkciókkal nem sikerült beállítani, akkor azt megteheti regiszterenként is, és a többi részen nem veszíti el a CCS kényelmes funkcióit.... bár ízlés kérdése, de ha egy funkció nem megy akkor még nem feltétlen kell az egész környezetet lecserélni ha megoldható egy kis plusz munkával.
(#) kormika hozzászólása Dec 25, 2013 /
 
Sziasztok! Nekem egy olyan kérdésem lenne, hogy hogyan tudom rávenni a fordítót, hogy az LCD-n megjelenítse nekem a % jelet? HD47780-as vezérlőjű 2*16-os LCD-ről van szó, és a gyári LCD.c drivert használom.
(#) vicsys válasza kormika hozzászólására (») Dec 25, 2013 / 1
 
Próbáld meg idézőjelek közé tenni.
  1. printf(lcd_putc, "valami %");
(#) kormika válasza vicsys hozzászólására (») Dec 25, 2013 /
 
Működik, köszi szépen
(#) kormika válasza kormika hozzászólására (») Dec 31, 2013 /
 
Sziasztok! Szeretnék építeni magamnak egy többcsatornás rc távirányító rendszert, maga a jelfeldolgozás (a potik állása alapján szervók vezérlése) már működik, ott akadtam el, hogy a 6 változó értékét hogyan juttassam át az adó oldali pic-ből a vevő oldali pic-be. Az adatátvitel egy játékautó rádió adó-vevő párosán alapulna, csak az adó végfokot, ill. a vevő dekóder részét felhasználva, a gyári TX-2/RX-2 párost kidobtam a nyákból. Szóval nekem valami olyan kóder/dekóder mintaprogram kellene, ami a 6 változómat átalakítja egy impulzussorozattá, aztán ebből az impulzussorozatból a másik oldalon megkapom a 6 változót. Nagyon hülyeség amit akarok, vagy megoldható? Az egész egy távirányítású homlokrakodó modellhez kellene, egy 6 csatornás gyári rádiórendszer ára eléggé húzós, és nekem felesleges is akkora hatótáv, a párszor 10 méter, amit tud a játékautó rádiója is bőven elég.
(#) ernosz hozzászólása Jan 1, 2014 /
 
Sziasztok ! A CCS PCD compiler v5.011-est használom, szeretnék 32 bites változót használni. Az alábbiak szerint, és ha jól értelmezem, akkor a 32 és 48 bitre is "long" van definiálva. Na most akkor a "long" változóm hány bites lesz?
A PIC header file-jában a következő van:

#device PIC24HJ128GP502
..
#if !defined(__PCD__)
#define _bif
#define int8 char
#define int16 int
#define int32 long
#define int48 long
#define int64 long long
#define float32 float
#define float48 float
#define float64 double
#define int1 char
#endif
(#) sysy válasza ernosz hozzászólására (») Jan 1, 2014 /
 
Használd azt, hogy int32 és int48. Ez biztosan azt fogja jelenteni, amit.
(#) ernosz válasza sysy hozzászólására (») Jan 3, 2014 /
 
Köszönöm! Nem tudtam, hogy ez így érvényes forma.
(#) ernosz hozzászólása Jan 12, 2014 /
 
Sziasztok ! Szeretnék segítséget kérni abban, hogy rendezzem valahogy a CCS forrás-file-omat. Szeretném az egyes funkciókat tartalmazó függvényeket, programrészeket különálló "___.c" file-ban elhelyezni, és linkelni a fő programhoz. Eddigi próbálkozásaim nem vezettek eredményre.
Egy "alma.h-ban deklaráltam a függvényt, ezt "#include"-oltam a főprogramba. Az "alma.c"-ben megadtam a függvényt, (ebben is include-olni kellett az "eszköz.h"-t) A "főprogram.c"-ben meghívom a függvényt, a fordítás sikerül, de nem sikerül, mert kiakad a CCS. Más ehhez hasonló verziókban sem tudtam ezt megoldani. Lehet erről olvasni valahol, hogyan lehet ezt megcsinálni?
(#) vicsys válasza ernosz hozzászólására (») Jan 12, 2014 /
 
Ugye nem használsz ékezetes betűket?
Idézet:
„"eszköz.h"..."főprogram.c"”
(#) ernosz válasza vicsys hozzászólására (») Jan 12, 2014 /
 
Nem-nem!
Még annyival egészíteném ki az előzőekben leírtakat, hogy korábban a Kónya-Kopják könyvben leírtak szerint próbáltam, de nem sikerült megoldani. A napokban egy C++-ban járatos ismerősöm dobott föl fejből egy vázlatot, de az sem sikerült. Az előzőekben leírtak szerinti kísérletben fordítás után a CCS windows hibaüzenetet adott (memória olvasási hiba), és lefagyott az Mplab is.
Következő: »»   95 / 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