Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Köszi a gyors választ.
Hiába változtatom a fuse-t mclr->nomclr az eredmény mindig ugyanaz.
Kedves emberek,
Ha a CCS.ben a következőt írom: #define ketto 1+1, akkor a fordító az "1+1", vagy a "2" értéket helyezi el a kódban?
Az attól függ, hogy milyen környezetben lesz a ketto a kódban. Mert ha pl. ezt írod, hogy a=b*ketto, akkor annak az eredménye végül az lesz, hogy a=b*1+1 vagyis a=b+1. Ha viszont úgy csinálod, hogy
#define ketto (1+1), akkor mivel zárójelben van, így a kódba az fog kerülni, hogy a=b*(1+1), ami tényleg a=b*2 lesz. És ekkor a fordító tényleg egy kettest tesz oda, mivel az (1+1) az mindig kettő.
A #define utasítás az egy makró, vagyis sima szöveg belyettesítést végez el, Tehát a makró hívásánál képzeld a "ketto" szöveg helyére az "1+1" szöveget. Ezt fogja lefordítani a fordító.
Kipróbáltam és az MPLAB 8.86 / CCS 4.134 verziók mellett szépen működik. Ha nem írod bele a #fuses sorba az MCLR szöveget, akkor lehet, hogy az alapértelmezett értéket fogja befordítani neked. Ha szerencsés vagy, akkor lesz reset funkciód.
Szia
Köszi a segítséget, kipróbáltam de semmi. Azóta nem működik jól a mióta áttértem WIN7-re. Az MPLAB-om 8.85 a CCS pedig 4.114. Próbálok frissíteni aztán majd meglátjuk.
Sziasztok!
Egy kis segítséget szeretnék kérni az alábbi problémához: Attempt to create a pointer to a constant if(fatopen(fileName, "a", &stream) != GOODEC) fatputs("\r\n", &stream); strcat(dir, "/"); if(fatopen(fileName, "r", &stream) != GOODEC) Szerintem az idézőjelben levő adatokkal van a probléma de nem tudom hogy mi. A fordító mindig a második idézőjel utáni karakterre mutat. Köszi a segítséget.
A CCS-hez értők szerint az ex_fat.c elején van egy olyan globális beállítás, hogy
Ez azt mondja, hogy RAM-ban történik az adatok átadása. Ha viszont direktben írod be az "r" paramétert, azt a fordító a ROM-ban szeretné elhelyezni. Erre utal az "Attempt to create a pointer to a constant" üzenet. Ez a Harvard felépítés diszkrét bája... Ha megtalálod a programodban a fenti direktívát, akkor vedd ki!
Igazából az volt a baj, hogy az én kódomban nem volt benne, mert ráparázott, hogy nagyon messze van a header file-tól, ezért kivettem...
És csak így fogadta el: #include <18F2550.h> #device PASS_STRINGS = IN_RAM Mostmár sikeresen lefordul, az SPI-on a jelek megvannak, már csak a szintillesztő IC hiányzik és jön az első próba. Köszönöm a segítséget!
Na szóval: Szeretném komolyabbra venni a PIC mikrovezérlők programozását C nyelven, PIC CCS fordítóval. Nagyon tetszik a kurzusod Vic, de sajnálom, hogy nem folytattad több mint egy éve.
Szeretnék magyar leírást valahonnan CCS-hez, vagy legalább sok programot amiben minden meg van magyarázva magyarul . Rendelkezésemre áll: PK2 Debug express csomag a fejlesztővel természetesen, 28lábú házi készítésű fejlesztő Vilmosd féle, 1-2 mikrovezérlő. Már írtam 2-3 programot Vic C kurzusa alapján, legutóbb egy önállóan elkészített Knight-Rider villogót a Debug Express panelra. Az a lényege, hogy lépeget 50ms-ként a LED-sor, és ez ismétlődik. Szóval várom a sok-sok jó tanácsot, hogyan tovább. Ezt elég ovodás szinten kéne elmagyarázni, mivel elég nehezen értem meg a dolgokat(szerintem legalábbis) Mondjuk gyors fejlődést nem várhattok, kezdődik a suli, nekem max hétvégén lesz most már időm programozni, meg emellett tanulni kell, meg van forrasztani való is mindig.
Segítünk. (Remélem, hogy a sok profi nevében is szólhatok)
Nos, konkrétan mit szeretnél? Valami nyomógombot emlegettél...
Köszönöm!
Igen. Van az új programom, a bizonyos Knight Rider, és szeretném azt is megtanulni, hogy mit kell a programba beillesztenem ahhoz, hogy pl a demo boardon lévő nyomógombot lenyomom, csak akkor menjen a led csóva, vagy a trimmer potit hogyan tudom lekezelni, hogy ha tekerem , a sebesség változzon.
Nézd át a demopaneled. Elvileg kell lennie egy felhúzó ellenállásnak a lábon és ezt a lábat a kapcsoló húzza le testre. Így 2 állapot érhető el: Ha a kapcsoló nincs lenyomva, akkor a PIC lábát közel tápfeszre húzza fel az felhúzó ellenállás. Ekkor a láb értéke 1 lesz. Ha lenyomod a gombot, akkor ugyanezt a lábat lehúzza testre. Ekkor a láb értéke 0 lesz. Most már csak a láb állapotát kell figyelni:
Ha nyomógombot használsz, figyelni kell a prellegésre is.
Egy kis magyarázat:
Az input szócska a láb irányát adja meg. Az if (angol ha vagy azonban) szócska, maga feltétel figyelés. PIN_A3 pedig a PIC A portjának a 3. tagja. (egy egy port, általában 1 bájtos és 0-tól 7-ig van számozva). A == operátor pedig az egyenlőség vizsgálat. Ha csak egy darab = jel lenne, az merőben más, mert az értékadás lenne. Magyarázat: kutya=3; // a kutya nevű változó értéke innentől három lesz kutya=1+4; //a kutya nevű változó értéke innentől öt lesz kutya==5; // a kutya nevű változó értéke, egyenlő 5-tel vagy nem? ...
Huh, köszönöm mind a 2 leírást. Eléggé érthető, főleg a kutyás rész elmond mindent.
Így van, van a nyomógombom. Rá van kötve egy 1k-s ellenállás, ami az RB0-ra van kötve, valamint van egy 10k-s, az pedig a +V feszültségre csatlakozik. Most jön a láb figyelése, ami szerintem akkor így kell kinézzen, hogy :
Jól értelmezem? Annyira nem is bonyolult, ha jól írtam, akkor élesben is tesztelni fogom. Gondolom a potméteres már bonyolultabb, mert ott már biztos van analóg/digitál konverzió.
Kipróbáltam az előbbi ötletem alapján, lefordította, hibát nem jelzett, de nem akar működni. Csak akkor rakom be a C filet,ha nem a gondolat menetemben lesz a hiba, hiába nem akarom az oldalt előre teletömni.
Szia!
Az if -s programrészed valójában ekkor fut le, ha a B0 port nulla értékű. Csak azt kellene megnézned, hogy bemenetnek van e setupolva a B port. Egyébként 'kutya' (ha már az a szemléltetés volt használva) kötelessége működni. Üdv. Subi A hozzászólás módosítva: Szept 9, 2012
Igazad van, ezt elfeljtettem megnézni, mert még ilyet sose csináltam. A konfigurálásnál mindig máshogy van kapcsolva egy-egy láb..
A hozzászólás módosítva: Szept 9, 2012
Sajnos nem jó. A B0 Inputon volt, meg kipipáltam, hogy a PULLUP-ot engedélyezze (ha jól értem a felhúzást), de semmi. Nem működik a program. Hibát megint nem dob ki. Így néz ki a program, belinkelem, hátha itt van a gond.
Nos először is, ha a port egyik kimenetét, mondjuk a B0 -t szeretnéd belső felhúzó ellenállással tápra kapcsolni, akkor 'port_b_pullups(0x01);' utasítás elég. Amennyiben mondjuk a B0 és B1 -t akarod felhúzni, akkor a 'port_b_pullups(0x03);' utasítás kell, és így tovább.....
A másik, nem látom igazából a B0 -t setupként bemenetnek állítani. Én ezt javaslom: set_tris_b(0b00000001). Így most, a B0 egyedül bemenet. Értelem szerűen a többi port is átállítható. A hozzászólás módosítva: Szept 9, 2012
Szia !
Ha egy portláb kimenetnek van állítva, akkor nem működik a felhúzóellenállás ( felesleges fogyasztást okozna! )! Ennek csak bemenetnek definiált lábnál van értelme ( lehet, hogy így gondoltad, de Janinak pontosan kell leírni, mert még kezdő és elbizonytalanodik, ha ellenkező dolgokat olvas vagy hall!). Steve
Rendben, köszi. Akkor a programban pontosan mit változztassak, és hogyan? Mit hova írjak?
A konfigtól eltekintve, szerintem jól működik a programod, csak kb 1 mikrosecundumod van arra, hogy megnyomd a gombot. Figyeltél arra amit vicsys írt az "if"-ről? Most azt csináltad a programban, hogy először megvizsgálod a gombot, és hanem teljesül a feltétel, vége a programnak. Ha azt akarod, hogy várja meg a gombnyomást, használd az if helyett a while utasítást.
Jaj, most már egyáltalán semmit sem értek.
Esetleg így módosíthatnád a programodat
az előző részek maradnak.... set_tris_b(0b00000001); // B0 -bemenet port_b_pullups(0x01); // B0 felhúzva while(1) { If (!input (PIN_B0) ) { ide rakod a programodat......... } delay_ms(300); // egy kis várakozás }
Hogy értsd is pontosan: amit Te csináltál az az init rész után megnézi, hogy nyomva van e a gomb, ha igen akkor elkezdi a ciklust, ha nem akkor átugorja és a program végét jelző end-re ugrik, onnan pedig nincs tovább. Amit Subi írt neked, az pedig a cikluson belül figyeli a gombot, így ha nincs megnyomva akkor újra és újra "megnézi", ha meg van nyomva akkor megcsinálja amit kell neki, majd ha végzett egy ciklussal újra megnézi a gombot és ha meg van nyomva... vagy ha nincs megnyomva... Remélem érthető voltam
Most működik már. A set_tris.. és a port_b.. nem használtam, mert azokat már konfiguráltam. Az volt a gond az egészben, hogy nem tudtam, hogy a while függvényen belül, vagy a while függvényen kívül kell hogy legyen a nyomógomb beállítása. A várakozásra semmi szükség, mert így nem tud a programom úgy futni, ahogy szeretném, mert megáll.
Mindenkinek köszi, egy lépéssel előrébb vagyok. Üdv!
Így igen, mivel közben megoldódott a gond.
|
Bejelentkezés
Hirdetés |