Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
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:
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
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?
Microchip gyári demókódjait nézted már? Nemtudom, hogy van-e köztük FAT32, de mintha láttam volna valamit.
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.
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.:
Ü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:
A PicKit2 UART Toollal kapcsolódás után a válaz:
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.
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.”
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?
A CCS már ismeri a bit típusú változókat is ( int1 flag )
Ha a memóriatakarékosság a célod...
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.
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!
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.
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?
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...
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.
Sziasztok
Egy olyan bájtot definiáltam aminek (majdnem) minden bitje flag-ként működik. Valahogy így:
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.
Nem latom sok ertelmet az ilyen valtozo deklaralasnak. Helyette egyszerubb megoldast ad a kovetkezo :
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
Csináltam videót is hogy jobban megértsétek mi a gondom.
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.
Szia!
Köszi érthető voltál. Akkor áttanulmányozom a dolgokat.
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:
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.
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...
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.
Szerintem először a kontrollerrel kellene ismerkedni és majd utána RTOS-el...
|
Bejelentkezés
Hirdetés |