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   59 / 118
(#) hadnagyakos válasza vicsys hozzászólására (») Júl 5, 2011 /
 
Az A4-gyes és az A3-mas lábra van beállítva.
(#) icserny válasza hadnagyakos hozzászólására (») Júl 5, 2011 /
 
Szerintem nem ez volt a kérdés, de a választ önmagában sem értem. Nem 12F675-ről van szó? Annak a GPIO3-as lába legfeljebb bemenet lehet (ha az MCLR funkciót letiltod).
(#) hadnagyakos válasza icserny hozzászólására (») Júl 5, 2011 /
 
Bocsánat, az A4-ről és A5-ről van szó. Én más cím beállítást nem látok a driver programban, hol találom? Elnézést a hülye kérdésért, de eddig csak PICkit2-vel olvastam illetve írtam őket, mikrovezérlőből még nem.
(#) whalaky válasza hadnagyakos hozzászólására (») Júl 5, 2011 /
 
Az EEPROM A0 A1 A2 (1,2,3) lábak lebegnek?
Itt a "Not Connected" azt jelenti hogy a kontrollerhez nem csatlakozik, de attól határozott L vagy H szinten kell lennie (a "gyári" 2416.c-hez L-re) mivel ezek a bitek állítják be az EEPROM címét (több is lehet belőlük egy i2C buszon és valahogy meg kell őket szólítani.

Hogy mi van az EXT_INT-en nem tudtam rájönni....

Ha a drivert megnézed
  1. #define EEPROM_SIZE    1024

Itt már valami kufircolás van, és ez végig kísér az egész programon. A 2048 helyett használd inkább az EEPROM_SIZE értéket (1024). Ha a 2048. byte-ra akarsz írni az nem fog sikerülni.

Van még egyéb kivetni való is a dologban, de attól elvileg el kéne hogy induljon.
(#) icserny válasza hadnagyakos hozzászólására (») Júl 5, 2011 /
 
Idézet:
„az A4-ről és A5-ről van szó.”
Az rendben van. Ezeket add meg a #use i2c() sorban, vigyázva, hogy melyik az SDA és melyik az SCL.

Az EEPROM 7 bites címe pedig tudtommal 0x1010000.
(#) icserny válasza whalaky hozzászólására (») Júl 5, 2011 /
 
Idézet:
„Itt a "Not Connected" azt jelenti hogy a kontrollerhez nem csatlakozik, de attól határozott L vagy H szinten kell lennie (a "gyári" 2416.c-hez L-re) mivel ezek a bitek állítják be az EEPROM címét (több is lehet belőlük egy i2C buszon”
Az adatlap szerint ennél a típusnál ezek nincsenek használatban és csak egy IC lehet a buszon. A legalsó három címbit ugyanis blokkválasztásra van felhasználva. A blokkon belüli címzés pedig 0- 255 lehet.
(#) icserny válasza hadnagyakos hozzászólására (») Júl 5, 2011 /
 
Egy hibás kódrészlet:
  1. #int_EXT
  2.    float temperature;
  3.    int16 eepromaddress;
  4.    int16 seconds;
  5.  
  6. void  EXT_isr(void)


Az #int direktíva és a függvény fejrésze közé ne tegyél semmit! (Magyarán: az #int direktívát tedd közvetlenül a függvénydefinícó elé, a változódeklarációk után)
(#) hadnagyakos válasza whalaky hozzászólására (») Júl 6, 2011 /
 
Nekem a driverben 2048 van, megnéztem az eredetit is és abban is.
(#) hadnagyakos válasza icserny hozzászólására (») Júl 6, 2011 /
 
Igen, valami változott, most nem fér bele a program a PIC-be.

Valahol karcsúsítok rajta egy keveset és jelentkezem, mi lett.
(#) icserny válasza hadnagyakos hozzászólására (») Júl 6, 2011 /
 
A 2048mint méret (8x256 bájt) stimmel. Mint cím viszont nem használható, mert a cím lineáris címzés esetén is csak 0-tól 2047-ig mehet.
(#) hadnagyakos válasza icserny hozzászólására (») Júl 7, 2011 /
 
Rendben, akkor ennek még utánaolvasgatok egy kicsit..
(#) Buddha hozzászólása Aug 4, 2011 /
 
Sziasztok!
Nincs valakinek egy olyan új CCS C fordítója, ami támogatja a PIC12F1822 tipust?
Kössz.
Üdv: B.
(#) vilmosd válasza Buddha hozzászólására (») Aug 5, 2011 /
 
Sonsivri-nek van 4.119. Valoszinu benne van.
(#) sysy válasza vilmosd hozzászólására (») Aug 5, 2011 /
 
Miért ezt a régi verziót ajánlgatod?
(#) nagy_david1 hozzászólása Aug 13, 2011 /
 
Üdv!

Valakit megkérek nézze meg ezt a problémám. Milyen lehetőségeim vannak akkor? Előre is köszönöm.
(#) Zsora válasza nagy_david1 hozzászólására (») Aug 13, 2011 /
 
A másik helyen már válaszoltam.
Miért kell neked két független végtelen ciklus? Nem lehet máshogy megoldani?
Egyébként mi a konkrét feladat?
(#) nagy_david1 válasza Zsora hozzászólására (») Aug 13, 2011 /
 
Tőled is elnézést kérek. Tényleg kezdő vagyok ezért kicsit keringek itt mint gólya ... a levegőben. Elolvastam amit írtál ott és köszönöm válaszod.

Egy egyszerű példát írok, remélem nem érthető félre. Ha lehet ne azt írjátok, hogy ezt másképp is meg lehet oldani mert ezt a feladatot csak egy egyszerű példának szánom.

Tegyük fel szeretnék egy-egy LED-et villogtatni egy-egy pin-en. Na mármost a LED-eknek külön-külön ciklus adná meg a villogás paramétereit. A két ciklus nem tudná egymásról, hogy mikor villantják fel a LED-eket. Lehet ha egyszerre gyulladnának ki, lehet késéssel vagy épp ellentétes időben. Véletlenszerű lenne mindkét ciklus. Remélem ez az "egyszerű" példa segít megérteni kérdésem.
(#) Zsora válasza nagy_david1 hozzászólására (») Aug 13, 2011 /
 
Nincs miért elnézést kérned tőlem.
Az általad leírt példa többféleképpen megoldható.
Az igazi párhuzamos feldolgozás egy mikrovezérlővel semmiképp sem megoldható, mert az egy időben csak egy feladatot ill. utasítást képes feldolgozni. Amit tehetsz:
- két független mikrovezérlőt használsz
- két független időzített megszakítást használsz, és a megszakításkezelő rutinok vezérlik a LED-eket
- multitask rendszerrel vezéreled a két külön feladatszálat
- ciklikus végrehajtást használsz, ahol az egyes feladatok körről-körre egymásután időt kapnak
(#) Zsora válasza nagy_david1 hozzászólására (») Aug 13, 2011 /
 
Ha csupán két LED-et kell eltérő frekvenciával villogtatni, akkor csak annyi a teendő, hogy fogsz két számlálót, amik a villogási késleltetéseket tárolják. Folyamatosan csökkented őket, majd mikor valamelyik eléri a nullát, újratöltöd azt és a hozzátartozó LED-et invertálod. Ezt a folyamatot a végtelenségig ismétled. Így még az egymáshoz viszonyított fázisukat is kezelni tudod. Ehhez nem kell semmilyen bűvészmutatvány.
(Ez a fenteb említett 4. mód.)
(#) nagy_david1 válasza Zsora hozzászólására (») Aug 13, 2011 /
 
A vilmosd ajánlott "rtos" függvényeket is most nézem éppen át. Kicsit még kínai de majd megpróbálkozok a megismerésükkel.
A kezdő fejemben még problémát az jelent, hogy tegyük fel a két ciklus között lépkedek és így mindkettőt futtatom. Csak, hogy oldjam meg azt, hogy mikor egyikből átlépik a másikba és vissza akkor megint ne elölről kezdje hanem folytassa ahol abbahagyta. Nem tudom érthető-e a gondom. Ha az első LED 1s-ig kéne világítson de közben megnézném a másik ciklust aztán visszatérnék az elsőhöz akkor folytassa a számolást 1s-ig és megint ne kezdje elölről. Esetleg valami pár soros példát tudnál mellékelni ha megkérlek?


u.i: nagyjából pont az előző válaszodra tért ki ez a kérdésem De ez a megoldás menne többel is nem? Nem látom akadályát.
(#) Zsora válasza nagy_david1 hozzászólására (») Aug 13, 2011 /
 
Ha megszakítást használsz, akkor a megszakítási rutinra történő lépést megelőzően a proci elmenti az utasításszámláló és az állapotregiszter értékét, így később pont oda és úgy tud visszalépni, mint ahol és ahogy a megszakítás előtt volt.

A fentebbi példámnál pedig még erre sincs szükség, mert mindkét (vagy akárhány) számlálót (és LED-et)ugyanaz a program vezérli.

ui.: Iden. Bármennyivel menne.
(#) nagy_david1 válasza Zsora hozzászólására (») Aug 13, 2011 /
 
Az első bekezdésedre: Ha jól értem ez az rtos "művelet". Ennek vannak korlátai? Mármint, hogy hány task-ot tudok "egyszerre" futtatni, sorra folytatni?

A második bekezdésre:Értem is meg nem is amit mondasz. Ha nem nagyon megterhelő pár sorban C nyelven le tudnád írni? Csak a lényeget.

Bocsánat a kezdő kérdésekért. Eddig csak analóg és digitális (IC-k) világgal foglalkoztam.
(#) Zsora válasza nagy_david1 hozzászólására (») Aug 13, 2011 /
 
Én sosem használtam RTOS-t, így nem tudok hozzászólni. A C nyelvű példával is gondban vagyok, met én Basic-ben és Assembly-ben programozok, a C-t csak felületesen ismerem. Írok egy példát nyelvfüggetlenül:

kezd:
számláló1=kezdőérték1
számláló2=kezdőérték2
ciklus:
számláló1 csökkentése
számlálo2 csökkentése
ha számláló1=0 akkor számláló1=kezdőérték1 : LED1=/LED1
ha számláló2=0 akkor számláló2=kezdőérték2 : LED2=/LED2
ugrás a ciklus-ra

A két LED így egymástól független gyakorisággal fog villogni.
(#) trudnai válasza Zsora hozzászólására (») Aug 13, 2011 /
 
Pontosan! Nem kell ehhez RTOS, az csak nagyon kiveteles esetekben kell amugy is...
(#) trudnai válasza nagy_david1 hozzászólására (») Aug 13, 2011 /
 
A RTOS nem muvelet, hanem egy operacios rendszert takar. Noha annak is megvannak a szepsegei, jelen esetben teljesen elbonyolitanad vele a helyzeted. Azt akkor erdemes megtanulnod, ha a C-ben mar nagyon otthonosan mozogsz es egy ilyen apro feladat nem okoz neked nehezseget.
(#) vilmosd válasza nagy_david1 hozzászólására (») Aug 14, 2011 /
 
Nem volt idom ma, de most valaszolok. En szoktam csinalni ilyen idozitoket ahol 2-3 vagy tobb idozito is futhat egyszerre. A lenyege a TMR0 IT. Mikor beindulsz akkor betoltod a TMR0 erteket, majd engedelyezed az IT-t. Ez ugye a beallitastol fuggoen IT-t fog generalni. Na itt a lenyeg. Most nem fogom az egesz IT rutint bemasolni csak a lenyeget.
  1. #int_rtcc                          // This function is called every time
  2. void clock_isr()
  3. {                                                       // the RTCC (timer0) overflows (255->0).
  4.     set_timer0(116);                // For this program this is apx 116 times for 10 ms int.
  5.         clear_interrupt(int_timer0);
  6.         if(l_timer)
  7.         {
  8.                 l_timer--;
  9.                 if (!l_timer)
  10.                 {
  11.                         output_low(LED);
  12.                 }
  13.         }
  14.         if(s_timer)
  15.         {
  16.                 s_timer--;
  17.                 if (!s_timer)
  18.                 {
  19.                         duty=0;
  20.                         set_pwm1_duty(duty);
  21.                 }
  22.         }
  23.         if(t_timer)
  24.         {
  25.                 t_timer--;
  26.                 if (!t_timer)
  27.                 {
  28.                         output_low(ACT);
  29.                 }
  30.         }
Itt mint lathato eloszor is ujratoltom a TMR0-t majd utana megvizsgalom a 3 szamlalom allapotat. Amikor nem nulla dekrementalom, es ha elerte a "0" erteket elvegzem a kijelolt muveletet. A program masik reszeben, bizonyos feltetelek teljesulesekor ujra toltom a megfelelo szamlalot es az ido elteltevel megint megcsinalja a megfelelo muveletet, es ez addig megy igy amig le nem merul az elem, vagy ki nem rantjuk a konnektorbol. A szamlalok toltese termeszetesen lehet direkt a nulla eleresekor is, akkor minden egyes ciklos azonos ideju lesz.
  1. #define L_TIME 50
  2.  
  3. #int_rtcc                          // This function is called every time
  4. void clock_isr()
  5. {                                                       // the RTCC (timer0) overflows (255->0).
  6.     set_timer0(116);                // For this program this is apx 116 times for 10 ms int.
  7.         clear_interrupt(int_timer0);
  8.         if(l_timer)
  9.         {
  10.                 l_timer--;
  11.                 if (!l_timer)
  12.                 {
  13.                         output_toggle(LED);
  14.                         l_timer = L_TIME;
  15.                 }
  16.         }
(#) watt válasza nagy_david1 hozzászólására (») Aug 14, 2011 /
 
Szia!
Első körben meg kell értened, hogy egy mikrovezérlő feladatvégrehajtó központja egyszerre egy utasítást hajt végre. Ugye ezt nem nehéz. Az is fontos, hogy ez mennyi időbe telik neki. A 12..18F PIC-ek esetében ez a sebesség az egy programlépés alatt végrehajtható(van olyan ami kettő, van ami vagy egy, vagy kettő attól függően milyenek a feltételek) utasítások esetén a kristály, vagy a belső oszci sebességének a negyede. pl. 40MHz esetén 10MHz. Tehát az említett utasításból 10milliót tud végrehajtani másodpercenként. Ha a két LED-edre osztjuk szét a 10MIPS-es, akkor egyre 5 jut. Talán elég eldönteni mikor égjen, mikor ne és mennyi ideig. Persze ez a feladattól függ! Ha arra van szükség, hogy 10ns alatt el kell dönteni, hogy égjen vagy ne, akkor sokkal gyorsabb eszközre lesz szükség(mondjuk egy 1GHz-el pörgő eszköz tíz lépésben talán el tudja dönteni és mást nem is tud csinálni!). De az a gyanúm, hogy itt erről nem lesz szó egy ideig!
Szóval számolj és meglátod mi minden fér bele egy kiválasztott PIC sebességébe. Szépen sorban végrehajtod ami a villogáshoz kell az egyik, majd a másik LED-en, és meglátod, lassítanod kell majd a folyamatokat, hogy egyáltalán villogást láss! De mégegyszer javaslom, értsd meg a processzorok és a mikrovezérlők logikai működését, utána látni fogod mennyire levegőben lóg a jelenlegi kérdésed! Annyira, hogy válaszolni is nehéz rá, hogy megértsd.

Az RTOS-t pedig felejtsd el egyelőre és talán örökre!
(#) icserny válasza vilmosd hozzászólására (») Aug 14, 2011 /
 
Szinte szóról-szóra ugyanezt csináltam meg MSP430-ra, annak szemléltetésére, hogy az MSP430-nál a WDT használható intervallum időzítőként (periodikus megszakítás).

Bővebben: Link
(#) nagy_david1 hozzászólása Aug 14, 2011 /
 
Először is köszönök mindenkinek mindent. Nekem valahogy az nem világos, hogy tegyük fel én 2 időzítőt szeretnék egyszerre futtatni. Persze gondolom az is egy megoldás, hogy összemérem a két időzítő idejét és először a rövidebb idejűt futtatom le de most nem erre gondoltam. Tegyük fel a két ciklus között lépkedek nagy sebességgel. De ugyanakkor egyértelmű, hogy az időzítők hosszabb ideig lennének működésben mint ez a váltás közöttük. Ezért mindig az időzítés abba maradna és újra kezdődne amikor váltok. Az egy megoldás lehet, hogy egy változóban tárolom az időzítés állapotát majd kivonom ebből a váltási időt ami konstans és ismert majd innen folytassák a ciklusok. Nagyon nagy zagyvaságot beszélek azon túl, hogy a magamnak kitűzött feladat nagy falat? Kicsit még elgondolkozok az egészen és átrágom magam a példákon. Még egyszer köszönöm.
(#) Zsora válasza nagy_david1 hozzászólására (») Aug 14, 2011 /
 
Túlbonyolítod a dolgot. Az a két-LED-es dolog pofon egyszerű. Nem kell ide-oda lépkedni a feladatok között, egyetlen végtelen ciklus és két változó (számláló) elég hozzá.
Kérdés: programoztál már valaha számítógépen, valamilyen nyelven? Szerintem neked a programozástechnikai alapismereteket kellene elsajátítani először, és akkor mindent máshogy látnál.
Következő: »»   59 / 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