Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Kérdésem az volna, hogy mikor meghívok egy delay_ms(1000); késleltetést, hogyan reseteljem a wdt-t?
Értem, tehát a mindenkori wdt osztó által beállított késleltetésnél nem használhatok nagyobb időzítést Kár hogy nem tesz a fordító néha clrwdt-t a sorok közé.
Ez nem időzítés, hanem késleltetés, különböztessük meg a kettőt!
Egyébként sem szép dolog ilyen mértékű késleltetést használni, de ha már nagyon ekkorát akarsz, meg közben wdt is kell, akkor konfigurálj be egy timert, hogy 1s után csorduljon túl, és futtass egy akármilyen ciklust, amig nem csordul túl a timer, illetve törölgesd a wdt-t a ciklusban.
Kell ekkora mert a led így villog. Miért nem illik nagy késleltetést használni? Sokat agyaltam már azon, hogy igazán jól használni a wdt-t nagyon nehéz sőt....
Gondoltam, hogy ledhez kell...
Azért nem illik, mert feleslegesen foglalja a kontroller idejét. Amíg ez a delay fut, addig nem csinál semmit (hacsak nem jön be valami megszakítás). A másik, hogy így sosem lehet pontosan 1Hz-es villogást produkálni, ha közben megszakítás is van, hanem csak úgy körülbelül 1Hz-et fogsz kapni. Arra meg egy NE555 is jó, nem kell hozzá PIC... A WDT-t egyáltalán nem nehéz használni, hanem arról nehéz leszokni, hogy ilyen delay() cuccokat használj. Én már csináltam pár programot, de delay-t még sosem használtam. Ha erról leszoksz, akkor már a WDT nem lesz probléma... Ja, ezért se komálom a CCS-t, mert a hozzáadott demókban ilyen delay-eket használnak, ami kezdetben biztosan egyszerű, csak ekkora késleltetéseknél zsákutca lesz, amikor a ledvillogtatásnál bonyolultabb dolgot kellene csinálni... Idézet: „Kérdésem az volna, hogy mikor meghívok egy delay_ms(1000); késleltetést, hogyan reseteljem a wdt-t?” Pl.: #use delay(clock=4000000, restart_wdt) De, vedd elő CCS Reference Manual-t!
Biztos igazad van, de miért használjak 555-öst mikor kétszer ennyibe kerül mint egy pici pic mellette a pic még logikai feltételeket is csinál.Ha nincs közben más feladat úgy gondolom, hogy nyugodtan használhatok ilyen delay-eket (minek bonyolítsam az életem ha nem muszáj ??
A ccs-nek legalább tisztességes helpje van, most kipróbáltam a Mplab C18-át egy istennek nem találom hogyan lehet hivatkozni a PORTA-ra, még jó hogy megvettem a Kónya féle könyv 3. kiadását, de az hogy nincs rendes helpje egyébként egy vicc.
ÁÁÁ egy kalap izé ez az mplab help! Eleve pdf-ekben van, próbáljátok ki, írjátok be a helpbe hogy port, hozza a supportokat is, és ha megnézitek az indexet porta van sima port nuku. Nosza megkerestem az indexben a trist, pofára esés nincs tris az indexben. Azért ez nagyon gáz!
A fenti timeres túlcsordulós időzítés esethez kérném tanácsod.
Hogy csinálak 45 db különböző időzítést eltérő feladatokhoz egy 18F452-ben? Van köztük 10 ms-os és 30 perces is. Létezik erre megoldás ?
Minél tovább nézem ez annál gázosabb.
Van egy user manual chm, hát azt ne tudjátok meg mekkora nulla! Beírtam a témakörökbe, hogy keressen porta-t kihozta a header file-oknál, és ott írta hogy a portabits-el lehet állítani a biteket egyesével. Nosza beírtam a témakörökbe hogy portabits visszahozta azt az oldalt ahol a porta-nal adott egy pici utalást hogy van ilyen is. Azért a ccs helpje meg e között ég és föld a különbség!
Hello,
a Help menü Topics feliratára kattintva találsz olyat, hogy MPLAB C18 users guide, ott megkeresed "processor-specific header files" -t, azon belül gyönyörűen el van magyarázva pont PORTA segítségével, hogy hogyan tudod használni az IO -kat, a topicok között pedig van még egyéb nyalánkság is, példáu a Libraries, ami segít használni a beépített könyvtári függvényeket (példákkal illusztrálva). Egy header filet megnyitva, vagy pedig belenézegetve a Getting Started vagy Users Guide helpekbe meg lehet találni azt a TRIS regisztert is. Kétlem, hogy, ha valaki tudja használni a PORTA -t, akkor a PORTB -t ne tudná, úgyis kénytelen lesz megnyitni az adatlapot plusz a header filet, hogy tudja milyen szimbólumok felhasználásával lehet elérni az egyes funkciókat... Idézet: „most kipróbáltam a Mplab C18-át egy istennek nem találom hogyan lehet hivatkozni a PORTA-ra” PORTA=valami, valami=PORTA, PORTAbits.RA0=1 esetleg if (PORTAbits.RA1) {}? Csak egy demóprogramot kell megnézni, és már világos is minden...
Annyit mondanék, hogy biztosan meg lehet csinálni delay nélkül is, de a feladat ismerete nélkül ettől többet nem tudok mondani...
Az alábbi megoldás nem jó?
Csinálsz egy 10ms-eset és 45db számlálót növelsz 10ms-enként. A timer interrupt 10ms-enként meghívódik növeli a 45 számlálódat és programban figyeled a számlálót is, ha elérte a 30 percet, akkor azt csinálod amit ott kell, ha van egy 10 percesed, akkor azt csinálod amit 10 percnél kell.... és persze ott 0-ázod a számlálót is. Vagy egyet növelsz, és mikor interrupt van, akkor osztod ezt a növeltet az időzítéseddel, ha egésszámmal osztható akkor megvan, persze valahol túl fog csordulni, úgyhogy lehet percesekre másik váltózót kéne növelgetni és ritkábban. pl. egy mp az 1000ms tehát 10ms-enként egyet nőve az 100 interrupt után lesz 100, ha ezt a változót elosztod 100-al, akkor csak 100-nál, 200-nál, 300-nál .... lenne 100-al egésszámszor osztható. Persze 45 ilyen osztásba belegebed a processzor a 45 változó is lehet megfekszi a hasát mire mindet megnöveli, de az még mindíg rövidebb idő mint a 45 osztás. Idézet: „nem találom hogyan lehet hivatkozni a PORTA-ra” Eleve rossz helyen keresed. Nem a C fordító, hanem processzor specifikus header fáljok mondják meg, hogy kit minek hívnak. A fodító erről csak akkor vesz tudomást amikor becsatolod a header fájlt.
De basszus nem demóprogramot akarok nézegetni, hanem a helpet szeretném használni, csak míg a ccs-nek rendes helpje van addig ennek a mplab c18-nak egy hulladék! És ez egy egyszerű példa. Hol van az mplab helb-ben leírva pl. hogy a trisb=0 az a B portot outputnak definiálja? Ezek alapvető infók hogy fogom megtalálni ha valami bonyeszosabb kell? Átnézek 1000 demó programot hátha valahol bekkomentezték az adott rész mire való?
Azért a mikrochip adhatott volna rendes leírást a C-jéhez, bezzeg minden chiphez hozzávágják az assebbly instrukciókat 200 oldalas leírással. Értem én hogy az assembly az alap, de ha csinálnak egy c fordítót olyan nagy megerőltetés lett volna egy tisztességes helpet csinálni hozzá? Mindegy majd olvasom a könyvet, csak zavaró baromira. Idézet: „Hol van az mplab helb-ben leírva pl. hogy a trisb=0 az a B portot outputnak definiálja?” Miért kellene ennek egyáltalán a help-ben lennie? Ja, hogy azért, mert a CCS használóknak nem szokásuk az adatlapot kinyitni? Annak, hogy a PORTB-be nullát írva az kimenetté válik, annak a helye az adatlapban van, nem máshol! Most őszintén, sorolják fel a fordító helpjében az összes kontrollerüknél az összes regisztert, hogy annak melyik bitje mire való? Ugye te sem gondolod komolyan...
Olvastad Te a manualt? A processzor specifikus header file két oldal, slussz passz!
A többit nézegesd a header file-okban. Szerinted ilyen a tisztességes help? 6 helyről kell összevadászni az infót? Nézd meg a ccs helpjét! Ott nincs ilyen hogy nézegesd a header fileokat. Le van írva mi mire való. Idézet: „Le van írva mi mire való.” Ezt csak azért nem hiszem el, mert sacc per kb. 10 000 féle PIC létezik, akkora help nincs a világon, ami összefogja mindegyiket. De még áll a kérdésem, ha tudod használni a PORTA -t, sőt már rájöttél, hogy a bitjeire külön hogy lehet hivatkozni, akkor ezt miért kell még ezt tovább ragozni?
Szerintem meg nem.
Ha ez általános hogy egy adott portra 0-át írva output lesz, akkor annak ott kell lenni a C leírásban. Az mplab C18 nem egy általános fordító, amivel lehet pc-re meg linuxra meg minden szirszarra fordítani! Az mplab C18 fordító az mplab 18-as szériához készült, nem a 16 biteshez, és nem a 32 biteshez, hanem a 8bites 18-as sorozathoz. Ha egy ilyen speciális fordítót csinálnak akkor helpben az általános regiszterek és portok leírásának benne kéne lenni. Szerinted a ccs-ben miért van benne? Azért hogy ne kelljen 6 direktory-ból összevadászni az infókat. Persze biztos vannak olyan speckó 18-as chipek amiben vannak speciális regiszterek, és akkor lehet nézegetni a header file-okat, de C azért terjedt el mert könnyen portolható. Hát ez nagyon nem igaz a microchip esetén. Ha lett volna egy kis eszük, akkor adtak volna egy szabványt a C-hez, de szerintem későn kapcsoltak, igy ahányan c fordítót írtak annyi megvalósítás született a portok, regiszterek és fordítási opciók elérésére. Annyira nem konzekvens, hogy míg a C30-ban _options-al, addíg a C18-ban pragmával kell megadni a konfigurációs biteket, nem beszélve a ccs fuses-ről. Legalább cégen belül tarthattak volna valami szabványt.
Itt a hivatalos microchip hozzáállás:
* MPLAB C18 C Compiler Getting Started (PDF) * PIC18 Configuration Settings Help (hlpPIC18ConfigSet.chm) * COFF File Format Help (hlpCOFFfile.chm) * MPLAB C18 C Compiler User's Guide Help (hlpC18ug.chm) * MPLAB C18 C Compiler Libraries (hlpC18Lib.chm) * Hardware Peripheral Library Function Documention found under the Csak ez 6 file amiből össze kell szedni az infót + a könyvtárakban nézegesd a header file-okat. Köszi nagyon összeszedett infó
A fordítóhoz tartozó help-be nem másolhatja be a negyed adatlapot. Ráadásul vannak eltérések az egyes chipeknél a regiszterek között, akkor azt mind külön másolja be oda (pl. EEPROM-kezelő regisztereket tekintve van háromféle eset)? Érdekes, az említett dokumentumok közül nekem eddig csak egyre volt szükségem rendszeresen a fordítóval kapcsolatban, abból is csak addig, amíg kiírtam, hogy az adott chipnél milyen config bitek vannak. Azonkívül elég az adatlap (szerintem ezzel így vagyunk elég sokan, akik C18-at használunk)...
A C30 és C32 GCC alapú, míg a C18 nem. Ennyit arról, hogy miért különböznek (amúgy meg szerintem 8 bites int után a CCS se nagyon ugrálhat a következetesség mellett)... A C nem azért terjedt el, mert könnyen portolható, hanem azért, mert asm szintű szabadságot nyújt (tehát nem csinál maga semmit, nem akar okoskodni, hanem azt csinálja csak, amire az ember kiadja a parancsot, még ha az hülyeség is), ugyanakkor gyorsabb fejlesztést tesz lehetővé. A portolhatóság a magasabb szintű nyelvek sajátja, a C (főleg a kontrolleres C) pedig nem magas szintű nyelv. Ezenkívül a kontrolleren gyakran szűkös időzítéseket kell betartani, így arra a céleszközre kell az egészet kihegyezni, és ezzel gyakran a portolhatóság meg is bukott... Idézet: „Ha ez általános hogy egy adott portra 0-át írva output lesz, akkor annak ott kell lenni a C leírásban.” Miért kellene? Ennek semmi köze a C-hez! Ennek a mikrovezérlő adatlapjába van a helye, meg a Family Reference Manualban. Próbáld megérteni, hogy a C fordító számára a regiszterek csupán kötött című változók. Nem tartozik rá, hogy melyik adatbitre mit csinál a mikrovezérlő. Mint ahogy az sem, hogy melyik konfig bitnek mi a szerepe.
Valaki magyarázza ezt meg nekem legyen olyan kedves:
A szimulátorban látszik, hogy csak a D port 4. bitjét rakta 1-be, a watch-ban látszik a trisd és a portd is, ott a kódban egy direkt értékadás. A PORTDbits-ek azért vannak kicsillagozva, mert már a hajam téptem miért nem tette a 2. bitet egybe. Ott áll a futás a függvény végén, a PORTD mégis csak 0x10 És a másik kép ugyan ez a megoldás ccs-el, és az meg tökéletes. Biztos én vagyok a tökéletlen csak nem tudom hol.
Le kéne tiltani a komparátort a lábakon, mielőtt digitális célra akarod használni. Adatlap->IO Ports->PortD->Example 9-4
Ja c18 ezt fordította ha a dissassebler listát nézem:
0010 0E12 MOVLW 0x12 0012 6E83 MOVWF 0xf83, ACCESS és miután kijavítottam a ccs-ben az értékadás végéről hiányzó 0-át ezt fordította a ccs: 000E 0E12 MOVLW 0x12 0010 6E8C MOVWF 0xf8c, ACCESS berakja 0x12-őt a work-be és onnan teszi valahova ami mind a 2-nél máshol van, kérdés hogy a ccs miért tudja megcsinálni a microchip saját fordítója meg miért nem. És erről nem szól a help. |
Bejelentkezés
Hirdetés |