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   56 / 118
(#) szkrep válasza edison14 hozzászólására (») Ápr 4, 2011 /
 
A decimális és hexadecimális számalakok keverednek, meg kell még 1 delay, hogy lásd is a ciklus futását.
Feltételezem, hogy kapcsolgatni akarod a D port 8 lábát.
Az valahogy így néz ki:
  1. void main(void)
  2. {
  3.         set_tris_d(0x00);
  4.        
  5.                 for(;;)  //while(1)
  6.                 {
  7.                         output_d(0x00);  //vagy szemléletesebben (0b00000000) , ahol a 'b' utáni érték a 7.bit
  8.                         delay_ms(1000);
  9.                         output_d(0xFF); //vagy (0b11111111)
  10.                         delay_ms(1000); //enélkül kevés idő telik el bekapcsolt állapotban, nem látod a villogást
  11.                 }
  12. }
(#) G-Lex válasza edison14 hozzászólására (») Ápr 5, 2011 /
 
Fuses sorba én még "PUT" fuse-t beraknám.

ez miért kell?
#byte PORTD = 8

set_tris_d elhagyható, mert nincs bekapcsolva a fastio

egyébként a kimenetek olyan rövid ideig lesznek bekapcsolva hogy észre sem veszed.

Ha ledeket raktál a D portra akkor akkor az output_d(0xFF); után is rakj egy delay_ms(1000)-t

arra figyelj, hogy a 16F877A mind a kettő oldalon megkapja a tápot. Az MCLR láb pedig legyen felhúzva
(#) szkrep hozzászólása Ápr 12, 2011 /
 
Megunva a CCS megbízhatatlan, félkész, bugos FAT32 driverének nyűgjeit felteszem a kérdést: talált valaki megbízhatóan működő megoldást? Az összes bugfixet kipróbáltam, de az nem egy működő kód amihez csak egy megfelelően üresre törölt, szándékosan hibásan formázott kártya használható, de az is csak véletlenszerűen. Meg tudna valaki osztani egy kipróbált, jó kódot?
A PetitFAThoz kilyukadtam én is, az "integer.h" viszont elég sok meglepetést tartogat, így le sem fordul a kód (CCS fórumon lévő ötletek alapján átírtam, ott nem talál hibát, aztán nem ismeri a "char" változót.)... Esetleg erről van valakinek tapasztalata?
(#) potyo válasza szkrep hozzászólására (») Ápr 12, 2011 /
 
Microchip gyári demókódjait nézted már? Nemtudom, hogy van-e köztük FAT32, de mintha láttam volna valamit.
(#) tomat5 hozzászólása Ápr 12, 2011 /
 
Sziasztok

Következő problémába botlottam:
#BYTE-tal létrehoztam egy változót a 0x20 címen. A bitjeit flag-ként használom, megszakításrutinban módosítom őket. Az első megszakítási esemény bekövetkeztekor ahogy kell átbillent a megfelelő bit. Viszont többé nem tudtam törölni a bitet a programban. A megoldás az lett, hogy átraktam a változót a 0x70-re, ami minden bank-ból elérhető. Így teljesen jól működik a program. Bár a probléma megoldódott, azért nagyon kíváncsi vagyok arra, hogy miért csak így működik. Rengeteget kísérleteztem, próbálkoztam mire idáig jutottam. Már azt is kipróbáltam, hogy hátha nekem kell törölni a megszakításbitet mint asm-ben, stb...stb...
Szóval ha valaki fel tudna világosítani azt nagyon megköszönném. Bár működik aminek működni kell, de azért nem hagy nyugton a dolog.

Köszi előre is.
(#) El_Pinyo válasza tomat5 hozzászólására (») Ápr 13, 2011 /
 
A kérdésedre a konkrét választ sajnos nem tudom, de C nyelvű programfejlesztés esetén nem nagyon szokás a memóriabeli elhelyezést kézzel állítgatni (azért akadnak kivételek), helyette használhatnál egy unsigned char változót is, a volatile előtaggal kiegészítve (fordító optimalizálása miatt).
Pl.:
  1. volatile unsigned int8 flag
(#) NgLovi hozzászólása Ápr 13, 2011 /
 
Üdv emberek!

Már láttam a 3. oldal körül, hogy elméletileg jónak kéne lennie a kódom hibás részének, de mégse. A kód:
  1. #device PIC16F688
  2. #include <16F688.h>
  3. #fuses INTRC, NOWDT, PUT, BROWNOUT
  4. #use delay(clock=4000000)
  5. #use rs232(baud=9600, xmit=pin_C4, rcv=pin_C5)
  6.  
  7. void main()
  8. {
  9.         SET_TRIS_A(0x08);
  10.         delay_ms(1000);
  11.         printf("Alive");
  12.  
  13.         while(1)
  14.         {
  15.                 if(INPUT(PIN_A3))
  16.                 {
  17.                         printf("PINA");
  18.                 }
  19.                 putc(getc());
  20.         }
  21. }


A PicKit2 UART Toollal kapcsolódás után a válaz:
  1. AlivePINAText
  2. TPINAePINAxPINAtPINA


Azt várom, hogy ha áramot adok az A3 portra akkor küldje el a PIN_A feliratot. Viszont hiáby nyomkodom nem reagál rá. Amikor Küldtem a Tool-lal egy zöveget "Text" akkor a látható módon felfoghatatlan katyvasz keletkezett. Várom a segítséget, remélem senkinek nem veszi el a kedvét a tréfás A port.
(#) vilmosd válasza NgLovi hozzászólására (») Ápr 13, 2011 /
 
Hali
A getc() fveny var egy karaktert a bemeneten, es addig all a program amig nem jon egy karater.
Idézet:
„This function waits for a character to come in over the RS232 RCV pin and returns the character. If you do not want to hang forever waiting for an incoming character use kbhit() to test for a character available.”
(#) NgLovi hozzászólása Ápr 13, 2011 /
 
Ez itt így működik, hogy addig áll? Nem kéne folyamatosan futnia a while miatt és ellenőrizgetni az A3-at? Elég hülyén hangzik. Hogy oldjam meg, hogy mind a kettő megmaradjon?
(#) tomat5 válasza El_Pinyo hozzászólására (») Ápr 13, 2011 /
 
Köszi
(#) p_istvan válasza El_Pinyo hozzászólására (») Ápr 13, 2011 /
 
A CCS már ismeri a bit típusú változókat is ( int1 flag )
Ha a memóriatakarékosság a célod...
(#) icserny válasza NgLovi hozzászólására (») Ápr 13, 2011 /
 
Nem ismerem a CCS C-t, de rendes helyeken szokott lenni egy kbhit() függvény arra, hogy megnézzük, van-e mit beolvasni. Ha a getc() hívást egy ilyen feltételhez kötöd, akkor nem ragad le a program, és lesz ideje nézegetni az A3 bemenetet is.

  1. if(kbhit()) {
  2.     putc(getc());
  3. }
(#) NgLovi válasza icserny hozzászólására (») Ápr 13, 2011 /
 
A fő gondom kiküszöbölte (rgyébként a füddvény itt is kbhit() ), így már nem ragad le a program. Viszont folyamatosan azt érzi hogy le van nyomva a gomb. Szerintem az lenne logikus ha az input azt nézné meg, hogy input-e és látszatra így is tesz de a dokumentáció szerint így kell megoldani. Nekem az kell, hogy le van-e nyomva. Nagyon köszönöm a segítséget!
(#) icserny válasza NgLovi hozzászólására (») Ápr 13, 2011 /
 
Kár, hogy nem tudom, mit csinálsz az A3 bemenettel! Ha nyomógombot kötsz rá, akkor azt fel kell húzni (pl. 10 kohm-mal VDD-re), de akkor a logikai feltételt meg kellene fordítani (negáció), mert lenyomáskor lesz alacsony. De bármit csinálsz vele, gondoskodni kell róla, hogy ne lebegjen szabadon a bemenet, hanem határozottan alacsony vagy magas szinten legyen.
(#) NgLovi válasza icserny hozzászólására (») Ápr 13, 2011 /
 
Egy egyszerű gomb lenyomóst akarok ahogy mondtad. Érdekes amit írtál, mert először MikroC-ben írtam meg a programom és szépen ment, de összehasonlítottam a Hi-Tech meg a CCS-Cvel és hát úgy döntöttem, hogy jobban járok ezzel, ha már nem ASM. Viszont MikroC-ben egyszerűen csak rákötöttem a VDD-t az A3 inputra és szépen ment, ezt hiányolom innen. Akkor ilyet nem szabad?
(#) icserny válasza NgLovi hozzászólására (») Ápr 13, 2011 /
 
Nem az a lényeg, hogy hová kötöd, hanem az, hogy mindig határozott logikai szinten legyen a digitális bemenet. De ez már nem tartozik a topik témakörébe...
(#) El_Pinyo válasza p_istvan hozzászólására (») Ápr 13, 2011 /
 
Nekem nincs vele semmilyen célom, csak egy példamegoldást mutattam. Egyébként sem lesz takarékosabb, mert így is úgy is 1 bájtot fog lefoglalni. Csak esetleg jobban áttekinthető, de spórolni nem lehet azzal sem. Ha én egy bájtot lefoglalok 8 flagnek, akkor ugyanott tartok, nem? Amúgy meg én nem használok CCS-C-t, csak egy általános, működő megoldást mutattam.
(#) tomat5 válasza El_Pinyo hozzászólására (») Ápr 13, 2011 /
 
Sziasztok

Egy olyan bájtot definiáltam aminek (majdnem) minden bitje flag-ként működik. Valahogy így:

  1. #BYTE WHATTODO=0x70                    
  2. #BIT INCTIME=WHATTODO.0        
  3. #BIT SERDAT=WHATTODO.1           
  4. #BIT TEXT1=WHATTODO.2          
  5. #BIT TEXT2=WHATTODO.3

A cél egyrészt az, hogy minél kevesebb memóriát használjak, másrészt egyetlen vizsgálattal el tudom dönteni, hogy kell -e valamit tenni, vagy mehet tovább minden. Lehet, hogy nem a legjobb megoldást választottam.

Üdv.
(#) vilmosd válasza tomat5 hozzászólására (») Ápr 13, 2011 /
 
Nem latom sok ertelmet az ilyen valtozo deklaralasnak. Helyette egyszerubb megoldast ad a kovetkezo :
  1. int1 INCTIME, SERDAT, TEXT1, TEXT2;
A fordito ugy is egy byte-ba fogja tenni a int1 tipusu valtozokat, ha kevesebb, vagy egyenlo mint 8 bit. Az ilyen fix cimu byte deklaralast erdemes csak a SFR-ekhez hozzarendelni. Pl
  1. #BYTE port_a = 5
  2. #BYTE port_b = 6
  3. #BYTE port_c = 7
  4. #BYTE port_d = 8
  5. #BYTE port_e = 9
  6. #BYTE intcon = 0x0B
  7. #BIT  rtccif = intcon.2
  8. #BIT  rtccie = intcon.5
  9. #bit  AD_CS=port_c.1
  10. #bit  z_led=port_b.4
  11. #bit  t_led=port_b.5
(#) tomat5 válasza vilmosd hozzászólására (») Ápr 13, 2011 /
 
Köszi így fogom csinálni.

Üdv.
(#) Dempsey hozzászólása Ápr 25, 2011 /
 
Sziasztok!
Segítséget szeretnék kérni (kezdő PIC-es vagyok). Nagyon egyszerű programot írtam de nem úgy működik ahogy szeretném. A lényege hogy két bemeneten A0 és A1 ha van jel akkor az ezekhez tartozó kimeneteken villog egy LED. Ha külön külön kapcsolom a rá a jelet akkor jól villog a LED de ha mindkét bemenetre rákapcsolom egyszerre a jelet akkor már nem jó. Gondolom mivel a program soronként fut le. Hogy lehetne megoldani hogy ha egyszerre aktív mind a két bemenet akkor a két LED a saját programba megadott frekvenciáján villogjon? Előre is köszönöm a segítséget.
Üdv: Dempsey
  1. #include "16f84a.h"
  2. #fuses rc,nowdt,noprotect,noput
  3. #use delay(clock=1000000)
  4.  
  5. void main (void){
  6. while (1){
  7.  
  8.         if(input(pin_a1)){
  9.         delay_ms(150);
  10.         output_high(pin_b3);
  11.         delay_ms(600);
  12.         output_low(pin_b3);
  13.         delay_ms(450);
  14.         }
  15.  
  16.         if(input(pin_a0)){
  17.         delay_ms(150);
  18.         output_high(pin_b2);
  19.         delay_ms(1000);
  20.         output_low(pin_b2);
  21.         delay_ms(850);
  22.         }
  23. }
  24. }
(#) Dempsey válasza Dempsey hozzászólására (») Ápr 25, 2011 /
 
Csináltam videót is hogy jobban megértsétek mi a gondom.
(#) sysy válasza Dempsey hozzászólására (») Ápr 25, 2011 /
 
A válasz a kérdésedre: RTOS. (Real Time Operating System) Része a CCS fordítónak. Ezzel meg lehet csinálni, hogy több szálon futkorásszanak a programok egymás mellett, kvázi, egymástól függetlenül. A CCS leírásnak a végén van anyag róla és sok minta program is.
Bár ez nem akkora feladat, hogy RTOS alatt kellene futtatni, de ez a legelegánsabb.
Ha az egyik Timert megszakításos módban futtatod viszonylag sűrű megszakításokkal (200-300Hz) és a megszakítás rutinban két eltérő husszúságú, körbeforgó számláló számolja, hogy meddig kell az egyik, vagy másik LED-nek világítania, megoldható a feladat. És még hab a tortán, hogy egy számlálóval is meg lehet oldani, ha az egyik LED-hez a számláló pl. 7. a másikhoz a 6. bitjét rendeled hozzá és ha ezek a bitek magasak, akkor világítanak a LED-ek, ha alacsonyak, akkor meg sötétek. És még számos megoldás szóbajöhet, de azokat majd a többi fórumozó elmondja.
Remélem érthető voltam.
(#) Dempsey válasza sysy hozzászólására (») Ápr 25, 2011 /
 
Szia!
Köszi érthető voltál. Akkor áttanulmányozom a dolgokat.
(#) szkrep válasza Dempsey hozzászólására (») Ápr 25, 2011 /
 
Azon lehet szépíteni, hogy a ledeket megszakítással és ne delay-el villogtassuk, de akkor is meg kell vizsgálni, hogy mikor van _egyszerre_ lenyomva a 2 gomb. A gombok állapotát megszakításból figyelni, és a led világítási idejét is abból vezérelni egy próba kedvéért aránytalanul sok munkával járhat, ha mostanában kezdted.
Ha a 150ms delay pergésmentesítés miatt van, kevesebb is elég lehet, nekem általában 30-50ms-nél nem kell több.
Nem elegánsan:

  1. while (1){
  2.  
  3.         if(input(pin_a1) && input(pin_a0)){  //a0 ÉS a1
  4.         delay_ms(150);
  5.         output_high(pin_b3);
  6.         delay_ms(600);
  7.         output_low(pin_b3);
  8.         delay_ms(450);
  9.         }
  10.  
  11.  
  12.         else if(input(pin_a1)){  //ha az előző teljesült, ez is igaz lenne, de az ELSE if miatt ezekkel már nem törődik
  13.         delay_ms(150);
  14.         output_high(pin_b3);
  15.         delay_ms(600);
  16.         output_low(pin_b3);
  17.         delay_ms(450);
  18.         }
  19.  
  20.         else if(input(pin_a0)){
  21.         delay_ms(150);
  22.         output_high(pin_b2);
  23.         delay_ms(1000);
  24.         output_low(pin_b2);
  25.         delay_ms(850);
  26.         }
  27. }
(#) Dempsey válasza szkrep hozzászólására (») Ápr 25, 2011 /
 
Köszi a segítséget. Hát most próbálkozgatok az RTOS-al de nem igazán akar összejönni. És még mindig nem futnak a szálak párhuzamosan.
(#) potyo válasza Dempsey hozzászólására (») Ápr 25, 2011 /
 
Inkább a megszakításos dologgal próbálkozz és a számláló növelésével. RTOS nemigazán erre van kitalálva és finoman szólva is ágyúval verébre kategóriás dolog jelen feladathoz...
(#) Dempsey válasza potyo hozzászólására (») Ápr 25, 2011 /
 
Megpróbálom, mert még sose csináltam.
(#) sysy válasza potyo hozzászólására (») Ápr 25, 2011 /
 
Pedig ez szerintem tipikus RTOS feladat. Bár nagyon egyszerű, de valahol el kell kezdeni az ismerkedést az RTOS-as.
Szerintem 10, max 20 sor program.
(#) potyo válasza sysy hozzászólására (») Ápr 25, 2011 /
 
Szerintem először a kontrollerrel kellene ismerkedni és majd utána RTOS-el...
Következő: »»   56 / 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