Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Azt nem árultad el, hogy a
"Ilyesmi a skálázásom: ha érték 10-12 -ig akkor..., ha érték 12-14,4, akkor...., ha érték nagyobb mint 15, akkor... etc."-ban az értékek milyen típusúak. Ha valami egész, akkor vilmosd megolgása megoldás lehet. Kb olyan mint pascalban a case 10..12: case 13,14,4: ... case 15: ... bár nem tudom mennyivel memória kímélőbb.... "Ha nem megy erőltesd! Ha ekkor sem megy, vegyél elő nagyobb kalapácsot!" (esetünkben PIC-et)
Hali
Pl van egy 8 bites szamod, az ugye 0-255 koze esik. Kellene elagazast csinalni 12, 58, 92, 146, 222, nel. Meghatarozzuk a legnagyobb kozos osztot, majd elosztjuk az erteket a kozos osztoval. Kapunk valamilyen szamot, majd azt az elozo pelda alapjan odaadjuk a "switch-case" -nek elbiralasra. Persze ha sok a feltetel, es meg raadasul "float" tipusu a valtozonk, ez azert bonyolult.
Köszi!
Csak a játék kedvéért: Hogyan adsz meg vizsgálatot a case-ben? Legyen például az ha érték 12,3 és 13,8 között van, akkor... Ezt szeretném látni, If nélkül a case-ben. Van egy olyan érzésem, hogy ez több vizsgálat esetén, csak if-el fog menni. Most a mem. méretétől egyenlőre tekintsünk el.
Rátapintottál az érzékeny pontomra, -képletesen szólva... (sok vizsgálat és lehetőleg float)
Már bocs, hogy én is bele... de tudjuk a switch-ről:
"Az utasítás úgy működik, hogy összehasonlítja egy kifejezés értékét több egész értékű állandó kifejezés értékével, és az ennek megfelelő utasítást hajtja végre. " És, ha egészeket csinálnál a nem egészekből?
Miert ertelmetlen a switch..case? Annak amugy nem a memoria sporolas, hanem a futasi sebesseg az ertelme... Mert ahogy mondtam egy jo C fordito ha csak egy mod van ra a switch..case-bol ugrotablat general, igy nem kell neki gondolkodnia, csak ugrania...
De ha egy peldaval leirnad milyen feltetelek ill lehetseges ertekek lehetnem a valtozodban, akkor lehet konkretabban tudnank segiteni
switch..case csak egesz tipussal fog menni... Tehat eleve bukta, hacsak at nem alakitod egessze ahogy ez mar elhangzott.
Pl. felszorozzuk 10-es es vesszuk az egesz reszet, ekkor:
Pont erre a megoldásra gondoltam! :kalap: csak én hagytam volna vicsys-t agyalni...
Ha memoria sporolos kell, akkor pl:
Hangulyozom nincs letesztelve, lehet rossz, lehet le sem fordul, csak gondolat ebresztonek szantam!
Tudom, csak mar itt agyal rajta ket napja (vagy csak en vagyok turelmetlen es raadasul tul sok idom van )
Ezt olvastam a fránya CCS manualban : "The compiler does not permit pointers to functions so that the compiler can know at compile time the complete call tree."
Ertem, akkor marad ez a megoldas?
Köszönöm mindenkinek! Ez a megoldás tettszik és frappáns! Na ez nem jutott volna eszembe. Le voltam ragadva az if/else -nél....
Orulok neki, ha segitett Amugy meg csak annyi, hogy ebben sima szekvencialis kereses folyik a tablan belul. Ha nagyon nagy a tabla akkor erdemes elgondolkodni, hogy binaris fa keresest csinaljon az ember -- az nem egy tul nagy valtoztatas ehhez kepest.
UI: Csak nem hagyott nyugodni ez a manualisan felallitott kiegyenlitett binaris fa otlet Meg sohasem csinaltam ilyet, de nem veletlen! A kod, mint lathato annyira bonyolult lesz a vegen, hogy nagyon nehez modositani rajta, vagy akar hibat keresni is... Ennek a 13 erteku lekerdezesnek az osszeallitasa eltartott egy darabig, elkepzelheted, hogy pl egy 100 elemu lekerdezes mennyi ideig tartana... Cserebe valoszinuleg ez a legoptimalisabb amit el lehet erni. Ahogy lathato a tesztelesi eredmenybol (a forras file legaljan), a 13 elem mindegyik erteket 4 (ill. nehany esetben 3) lekerdezessel eleri. (A kod amugy gcc-re lett irva csupan a teszt kedveert es Linux alatt probaltam ki) Ha a binaris keresest a tablara valositod meg, akkor hasonlo lekerdezes szamot erhetsz el, szemben a szekvencialistol ahol ha szerencsed van 1, ha nincs akkor 13 lekerdezest hajtasz vegre a kereses soran. Amiert a tablas megoldas picit lassabb lesz az ugye abbol adodik, hogy ott meg van a switch..case ugye, amit azert illene megnezni vajon ugro tablat fordit-e belole a CCS avagy if..else szekvenciakat...
És egy kicsit továbbgondolva mi mindenre jó a rekurzió...
10 sorral minden meg van oldva.
így az elemek száma elvileg korlátlan, egyszerűbb a kód, a bővítéshez és módosításhoz nem kell hozzányúlni mert gond nélkül bővíthető, az egyetlen megkötés hogy a teszt[] rendezett legyen, de ez gondolom nem okoz nagy fejfájást.
Hoppá, most nézen, ha a legkisebb értéknél kisebb akkor hibás....
így már jó.
Ebben tokeletesen igazad van, csak abban nem voltam (vagyok) biztos, hogy a CCS-ben vajon mekkora a stack, es hogy milyen szintu rekurziot engedelyez meg (ha egyaltalan megenged).
Amugy van meg egy masik vonzata beagyazott forditok eseteben a rekurzionak. Sok C fordito (es itt most megintcsak nincs eziranyu tapasztalatom CCS-ben) nem hasznal igazi stack-et, hanem szimulalja azt indirekt memoria cimzo utasitasokkal (mivel pl 16F PIC-ben nincs memoria stack csak program szamlalora). Namost ez eleg nagy kodot general ha sok a lokalis valtozo, emiatt trukkoznek egyet, es meg csak szoftver stacket sem csinalnak ha nem szukseges. Egeszen pontosan azt csinaljak, hogy un. pseudo-staket csinalnak, ami nem mas mint egy overlay-ed memoria terulet a lokalisok es fuggveny parameterek szamara. Ez azt jelenti, hogy nem kell stack frame-et lefoglalniuk a fuggveny belepesekor, es a valtozok hozzaferesenel is direkt cimzest tudnak hasznalni ami joval gyorsabb es kisebb kodot general. Egy-egy ilyen teruletet azonban mas fuggvenyek is hasznalhatnak, es a fordito gondoskodik arrol, hogy amig a fuggveny el (nem leptunk ki belole) addig a valtozok ne legyenek felul irva. Ezt ugy erik el, hogy a forditas soran felterkepezik ki kit hiv, es igy a fuggvenyvaltozok reszere ugy jelolik ki a teruleteket, hogy azok soha ne tudjanak felul irodni egy masik fuggveny altal, mivel az sohasem hivodhat meg mikor meg a fuggvenyunk el. Namost, emiatt sok kompromisszumot kell kotni. Pl ahogy mar szo volt rola a CCS nem enged fuggveny pointereket -- tobb, mint valoszinu, hogy ez is ennek koszonheto, hisz akkor nem tudna a fordito, hogy az adott fuggveny honnan hivodik meg. A masik pedig a rekurzio, nem tudom CCS engedi-e vagy sem, de nem csodalkoznek rajta, ha nem, hiszen akkor nem lenne lehetseges ez a fajta technologia. Az egyetlen lehetoseg akkor lenne, ha erre a fuggvenyre megiscsak szoftveresen emulalt stack-et alkalmazna, de akkor a futasi segessegen es a kodmereten ez rogton meg is latszana -- ki kell probalni persze. Viszont ezt a binaris fa keresest amit leirtal meg lehet oldani rekurzio nelkul is.
Szervusz!
Szép, de a CCS ismeri a rekurziót? Más C-ben ugyan rövid lesz a kód, de igen nagy memória kell a veremhez, amiből a PIC nics túlságosan eleresztve... Bocs, hogy beleszóltam: István
Igazatok lehet, PIC-ben nem próbáltam, de szerintem nem kéne hogy pampogjon miatta. Ha pedig már annyira kevés a program memória hogy az if-ek már nem férnek bele megoldás lehet.
Úgy gondolom egy próbát megér.
hi
ha a rekurzív függvényhívásra gondolsz, arra hibát dob. üdv
Nagyon sokat tanultam most Tőletek! (Na meg szép kis lavinát indítottam) Mégegyszer köszi a "brainstorming"-ot és segítséget!
Való igaz, nem tűri a rekurziót. Bocs!
Nincs meg valakinek a CCS PICEEC development kit rajza?
Hiába keresem, földön égen nem találom.....
Az új változat engem is érdekelne, de sajna nincs 30MB-os leveles ládám.
Nincs feltöltve valahová esetleg?
Sziasztok!
Egy használattal, vagy Mplab-bal, (vagy nem is tudom, hogy fogalmazzam) kapcsolatos kérdésem lenne. Kicsit zavart, hogy a könyvtár tele van mindenféle fájlokkal, ezért gondoltam csinálok egy külön könyvtárat, és egy párat átpakoltatok oda. Több helyen láttam, hogy a kimeneti fájloknak lehet külön könyvtár, no, ezt próbáltam össze hozni. Be is állítgattam, ahogy a mintákból kilestem. Tulajdonképpen működik, csak közben meg meg áll. Először egy :"pic c compiler I/O error 103." hibaüzenet. Leokézom. A compiler ablak csak a tálcán van, nem látni, azért alt+F4-el bezárom. Újabb hibaüzenet:"Mplab ide Fajled to load". Leokézom. Output ablakban pedig minden ok. Le is fordult. Mi az ami nem tetszik neki? Ja, a project menü, build options, directories- ban állítottam át az output directorit. Vagyis létrehoztam. Előre is köszi a válaszokat!
Szervusztok! Megint gondom van az adc-vel.
Az a bajom, hogy egyrészt nem sok köze van a valósághoz amit kiszámolok, másrészt a potit tekergetve szépen változik a másik érték is. A lábon mérve műszerrel természetesen stabil.
A 4,76 a pic tápja. Mit nem jól teszek? És, hogy lehet mind a 10 bitet kiolvasni? Előre is köszi!
így első ránézésre az hiányzik
#device adc=8 ezt pedig így setup_adc_ports(sAN0|sAN2|VSS_VDD); aztán próba cseresznye
Rögtön a legelső sor alá tedd be, hogy "#device adc=10", így 10 bites lesz a mérés (-> int16-ba fér bele).
A csatornaváltás és a mérés közé kell kb 10-20us delay (nem próbáltam kevesebbel), akkor csak az fog változni, aminek kell. Azért számolsz fura dolgokat, mert "poti*4,76" az "integer*float". Próbáld úgy, hogy
|
Bejelentkezés
Hirdetés |