- for(;
{
- if1 ha igaz megy tovább, megcsinálja a dolgát.
- Ha hamis break.
- if2 ha igaz megy tovább, megcsinálja a dolgát.
- Ha hamis break.
- ...
- }
Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Sziasztok!
Pár napja kezdtem el foglalkozni az USB és PIC kapcsolatával. Kezdésnek gondoltam megfelel a „ex_usb_serial.c” példa program. Az XP felismerte a hardvert és telepítette a drivert „cdc_NTXPVista.inf”. A problémám hogy Vista (64bit) sajnos nem ismeri fel. Tudna valaki segíteni hogy miként lehet 64bites Vista alá feltelepíteni . Előre is köszönöm.
A C18 fordítóhoz íródott USB csomagban is van CDC demó, próbáld meg azt is, hátha az menni fog.
Szia!
Sajnos érdemben nem nagyon tudok segíteni, USB- vel kapcsolatban nincs komolyabb tapasztalatom. Ránéztem azért a CCS honlapjára, azon belül is a fórumra és találtam valamit, ami használható lehet. Bővebben: Link Üdv.
Szia!
Kipróbáltam a C18-hoz a CDC demót. Tökéletesen működött XP és Vista (64bit) alatt is. Sajnos a C18 nem nagyon ismerem. CCS fordítót használok már rég óta. Ezért gondoltam hogy ehhez a fordítóhoz tartozó demót tanulmányoznám. WinXP alatt tökéletesen megy a bootloader része is de valahogy a Vistával nem tudom megetetni a hardvert. ![]() ![]()
Szia!
Köszönöm a linket. Délután megnézem hogy mit szól hozzá a Vista. Szerintem a C18 "mchpusb.inf" drivere van átírva. Remélem jó lesz.
Üdv mindenkinek!
Most ismerkedek a CCS vel komolyabban és belefutottam két problémába. Az első az, hogy nem tudom hogy kell megoldani a több feltétel egybe rakását (A=1 ha B=0 és C>5). Jelenleg két If van betéve egymásba. A másik gond a Watch Dog Timer. Hogy működik? Úgy tudom van egy számláló amit időnként törölni kell, ha ez elmarad akkor reset. Hol és mit kell megadni neki? Ha lehet kicsit szájbarágósan, ez lenne az első progim a ledvillogtatás után. Előre is köszönöm.
Szia!
Az első kérdésedre a válasz: logikai ÉS (&&) operátor használatával. Pl.:
A WDT használatában pedig segít a CCS-C Helpje, elég jól le van benne írva a használata, és példa program is van hozzá. Egyébként nem feltétlenül szükséges a WDT engedélyezése, le is tudod tiltani a config- ban. Üdv.
Üdv!
Köszönöm a gyors segítséget! A WDT azért kellene mert egy folyamatot kell figyelnem. Ha minden rendbe megy akkor kezdődik előlről, ha viszont megakad akkor jól jönne valami ami kibillenti ebből az állapotból. Jelenleg ki van kapcsolva.
Inkább a programot kellene olyanra megírni, hogy sajátmaga felismerje, hogy megakadt a folyamat. A WDT az nem arra van, hogy a hibásan megírt programot javítsa!
A WDT-vel csak óvatosan, főleg a fejlesztés alatt. Csak ha már minden tökéletesen megy, akkor szabad elővenni.
A WDT-ről:Bővebben: Link A ccs Reference Manual-ja a Functional Overviews részben leírja hogyan használható (a PIC16-nál és a PIC18-nál eltérő módon!) és néhány pre-processort is meg kell hozzá nézni.
Üdv!
A program kész de időnként leáll. Köszönöm a segítséget, olvasgatok.
Meg kell találni, hogy mitől áll le. Ha létre tudod hozni azt, amitől leáll, akkor az a program vagy az az áramkör még nem kész!
Üdv mindenkinek!
Tudom nem szép utasítás de szükségem lenne GOTO ra. próbáltam keresgélni de hiába, nem működik.
Így próbáltam. Mi lehet a gond?
Szia! A GOTO utasítás használata nemcsak hogy "nem szép", hanem az álmoskönyvek, no meg a CCS Reference Manual szerint is távolról kerülendő!! Az ilyen "nyom nélküli" ugró utasítást szinte minden struktúrált programozás nyelv, - ha nem is tiltja, de semmiképpen sem javasolja - ugyanis mint szerkesztés, mint végrehajtás szempontjából rettenetes módon összekuszálja a programot. Azt nem tudom, hogy speciel a Te esetedben miért nem működik (magam anno a Commodore Basic időkben használtam utóljára), de én mindenképpen óvnálak a használatától. Próbáld megoldani a problémát ciklussal, függvényhívással vagy más hasonló módszerrel, amit aztán hibakeresés alkalmával is tudni fogsz követni.
![]()
Üdv!
A progiba mindig az elejére kellene visszalépni, feltételfüggően. A leg egyszerűbbnek a goto tűnik, mivel mindig azonos helyre kell visszatérni, így nem lesz kusza. A gond az, hogy nem működik valamiér, idő pedig kevés van más megoldásra. A progi végén jött elő a visszaugrás igénye.
Ha kevés az idő, akkor sem kell szükségszerűen rossz megoldást választani. Ez a probléma pl. szépen megoldható egy WHILE ciklussal, amit kiértékelhetsz a ciklus elején (WHILE), de megteheted a ciklus végén is(do WHILE) és annak megfelelően a végrehajtás visszakerülhet a progi elejére, ami a ciklus eleje is egyben. (Lásd. Ref. Manual)
![]() Pedig ez lett volna a leg jobb/egyszerűbb megoldás. A progi szinte végig IF ből átt, ha igaz megcsinálja a feladatát, ha hamis akkor előlre kellett volna ugrani. Sajna nincs fent a gépen a doksija, csak a progi megy minimális részekkel, súgó sincs se példatár. Ciklust ha lehet hanyagolnám, egy utasítás helyett. A progi saját cucc lenne, kb 1 órát kellene kibírnia, utána akár le is fagyhat, összeomolhat, amit akar, csak ne késsen a vége. A goto lenne a megoldás.
Üdv! A progi felépítése:
for(; ![]() eleje: if1 ha igaz megy tovább, megcsinálja a dolgát. Ha hamis goto eleje if2 ha igaz megy tovább, megcsinálja a dolgát. Ha hamis goto eleje És így tovább. Biztos vagyok benne, hogy lehetne más megoldást is alkalmazni, de sajnos se időnk nincs se komolyabb programozási ismeret. Már annak is örültünk ha elindult a cucc, finomítani fogjuk később és ha lesz rendes ismeretünk a CCs ből akkor nem használjuk a goto t. Idézet: „for(; ![]() A for ciklus törzse körül azért van egy kapcsos zárójelpár, ugye? Goto helyett így miért nem jó? Idézet: „sajnos se időnk nincs se komolyabb programozási ismeret.” Erre hol adnak diplomát? :no:
Üdv!
A progi végül nem lesz befejezve ![]() Nem diplomára kellett volna hanem egy végső próbálkozás lett volna a mars küldetésre mert a "profi" programozók otthagyták a dolgot mint eb a ...... . Mivel a csapat többi tagjának nem volt semmiféle programozási tudása így azt próbáltuk írni ami ismerős volt. Régebben önerőből pascaloztam, utána delphiztem, pár dolog jól jött belőle, pl goto. Köszönöm a segítséget, legközelebb fogom alkalmazni. Idézet: „Nem diplomára kellett volna hanem egy végső próbálkozás lett volna a mars küldetésre” Ja, akkor ezer bocs! Azt hittem, ez is egy "sietős algoritmussal" megvalósított diplomamunka lesz (annak van most a szezonja). Sajnálom, hogy most nem jött össze, pedig a CCS-nek nagyon barátságos Help-je van.
Szevasztok,
lenne egy kérdésem a CCS Compiler működésével kapcsolatban. Az adattípusok terén van némi homály a fejemben. példa: int32 a; int16 b; b = 50000; a = (int32)b * 2); ez helyes. eredménye 100000. a = 2 * (int32)b; helytelen. eredmény: 100160 hogyan van ez? Egy ilyen elég nagy kavarodást tud okozni a kódban. Hol lehetne utánaolvasni annak, hogy a kasztolás hogyan működik a ccs-ben? Köszi! Üdv: P
Pontosan miért is akarsz kasztoli, mikor a baloldal értéktartományába illeszkedik a jobboldal értéktartomány és nem kell konvertálni.
sysypet
A C mindig a legmagasabb cast-al rendelkező operandus alapján végzi a műveleteket. Tehát ha összeszorzol két 8 bites számot, annak az eredménye is 8 bites, hacsak nem volt valamelyik tényező castolva. Hiába áll a kifejezés bal oldalán 16 bites változó, akkor is levágja a felső 8 bitet. Ezért kell castolni 32 bitesre a két szám egyikét legalább.
Idézet: „Hol lehetne utánaolvasni annak, hogy a kasztolás hogyan működik a ccs-ben?” Csakis a CCS-hez adott súgóban, illetve a honlapjukon. Pl. nézd át innen: Link
Helló!
az általam írt példában mindenképpen szükség van kasztolásra, mivel egy unsigned int16 0 és 65535 közti értéket vehet fel. Így az eredmény (100000) int16-on nem ábrázolható. Az teljesen világos, hogy két int8 szorzata int8-ként fog ábrázolódni. Ezért kell a kasztolás, ami számomra érthetetlenül forcsán működik. Az in32-ben tárol érték attól függ, hogy az szorzás operátor mely oldalán mely operandus áll! Szerintem ez így nem OK. P
Így próbáld meg:
Eredmény: a=700000 b=950000 |
Bejelentkezés
Hirdetés |