Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Az A4-gyes és az A3-mas lábra van beállítva.
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).
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.
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
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.
Idézet: Az rendben van. Ezeket add meg a #use i2c() sorban, vigyázva, hogy melyik az SDA és melyik az SCL.„az A4-ről és A5-ről van szó.” Az EEPROM 7 bites címe pedig tudtommal 0x1010000. Idézet: 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. „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”
Egy hibás kódrészlet:
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)
Nekem a driverben 2048 van, megnéztem az eredetit is és abban is.
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.
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.
Rendben, akkor ennek még utánaolvasgatok egy kicsit..
Sziasztok!
Nincs valakinek egy olyan új CCS C fordítója, ami támogatja a PIC12F1822 tipust? Kössz. Üdv: B.
Sonsivri-nek van 4.119. Valoszinu benne van.
Ü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.
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?
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.
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
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.)
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.
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.
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.
É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.
Pontosan! Nem kell ehhez RTOS, az csak nagyon kiveteles esetekben kell amugy is...
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.
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.
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!
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
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.
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. |
Bejelentkezés
Hirdetés |