Fórum témák
» Több friss téma |
Fórum » CCS PIC Compiler
Szia!
Jobban megnézve az adatlapot a PIR1 RCIF és TXIF bitjei fölé az "R-0" van írva. Ezek a bitek csak olvashatók. Az PIR1.RCIF -et az RCREG olvasása vagy a PIE1.RCIE törlése, a PIR1.TXIF -et a TXREG írása vagy a PIE1.TXIE törlése állítja 0 -ra. Ezt a kontroller áramköre csinálja (néhány órajel idő alatt) nem a fordító. A bitek programból való írása fölösleges. A soros vevő kettős bufferelésű, így előfordulhat, hogy az RCREG egyszeri kiolvasása nem törli az RCIF -et, ekkor egy második karakter is kész van, azt is ki kell olvasni. Ugyanígy, ha az adó már régen elkészült az adással és beírunk egy karaktert, az átkerül az adó léptető regiszterébe és a TXREG már üres is lesz, a TXIF megint 1 lesz, beírhatunk még egy karaktert. Nagyon forntos (főleg 9 bites átvitelnél): Az RCSTA regisztert az RCREG olvasása előtt kell kiolvasni és karakterenként csak egyszer szabad kiolvasni. Ha a feldolgozáshoz többször is kellene az érték, akkor menteni kell egy változóba.
Sziasztok!
Köszönöm szépen a hozzászólásokat, a kettős pufferelés zavart meg. Másodszor is kiolvasom a vételi regisztert és utána automatikusan törlődik. Üdv: B.
Köszönöm a kiigazítást.
Subi A hozzászólás módosítva: Márc 31, 2014
Hogyan kell letiltani és újra engedélyezni a vevőt?
Az alábbi módszer törli a RCSTA.FERR és a RCSTA.OERR biteket is:
RCSTA.SPEN = 0; RCREG kiolvasása; RCSTA.SPEN = 1;
Ezt értem, de hogyan kell kivitelezni CCS C-ben?
Asszem rájöttem:
#BIT SPEN= 0xFAB.7 ... SPEN=0;
Egy 12f629 es pic hez írtam ezt a programot mircoc pro ban, de nem csinál semmit.
Nem tudjátok mi lehet vele a gond?
Konfigurációs bitek hiányoznak a kódból, de akár az áramkörből is hiányozhat valami.
igen, meglett, a konfigurációk hiányoztak!
Abban tud valaki segíteni, hogyan tudnám megcsinálni azt, hogy egy kapcsoló segítségével változtatni tudjam hogy melyik led villogjon! eddig a kód így néz ki, de nagyon megy, villog az egyik de ha átkapcsolom csak megáll és nem vált át a másikra.
13. sorban az = helyett == kell.
És hiányzik egy delay_ms(f) a 20. sor után.
semmi változás, ugyan az maradt. villog szépen a vörös, de ha átkapcsolom akkor csak olyan mintha megállna a pic ( világít az a led amelyik utoljára) ha lekapcsolom akkor megint villog a vörös szépen tovább. Valamiért nem áll át a fehérre
Hi!
PIC18F2455 ill PIC18F25K20 sleep mode-dal kapcsolatban lenne kérdésem. Sikerült mindkét PIC-et sleep-be küldeni de nem esett jelentősen az áramfelvétel. 2455 run mode 4,5 mA sleep mode 700 uA 25K20 run mode 2,5 mA sleep mode 1,4 mA ennél sokkal nagyobb esést vártam volna ill. azt is hogy a 25K20 XLP kivitel miatt run mode-ban is kevesebbet fogyaszt. Esetleg van valami ötletetek, hogy mi lehet rossz? Feltételezem az igaz, hogy ezek az áramértékek nagyon nem stimmelnek. Köszi! A hozzászólás módosítva: Máj 29, 2014
A lábakra figyelj ( a kimenetek úgy legyenek, hogy ne fogyasszanak /pl. LED bekapcsolva!/, a bemenetek ne legyenek üresen/lebegve!), ill. a szükségtelen dolgokat kapcsold ki a konfigurációs biteknél ( pl. BOR )! Így lemegy ~ 10uA környékére !
Sziasztok!
Beleütköztem egy problémába amit már pár napja nem tudok megfejteni. Van egy 16F628A amiben komparátort szeretnék használni. Ezzel nincs is gond, működik is de nem értem a PORT B3 mért van kimenetként magas szinten ? És nem tudom lekapcsolni sem és nem tudok rájönni mi van vele. Megköszönném ha valaki segítene megfejteni ezt a rejtélyt.
A 16F628(A) -n az RB3 pont a CCP1 modul kimenete.
A hozzászólás módosítva: Máj 10, 2014
PWM modul kimenet, de ha nem használom a CCP1-et akkor is folyamatosan 1 ben van kimenetként.
Tehát ha ezt írom: setup_comparator(NC_NC_A1_A2); Akkor is 1 és nem tudom 0-ra kapcsolni.
Köszönöm a segítséget.
Rávilágítottál a lényegre. setup_ccp1(CCP_COMPARE_INT); Ezzel a konfigurációval már nincs probléma. Így már szabadon használható a kimenet.
Helló kissi!
Köszi a segítséget! 3,3 V-os tápnál és 4MHz-es belső oszcillátor esetén 35uA-re sikerült levinni az áramfelvételt sleep modban. Ez már elfogadható Üdv A hozzászólás módosítva: Máj 29, 2014
Üdv!
Most próbálkozok a megszakításokkal CCS-C-ben de nem boldogulok a külsőkkel(RB0/INT). Ami adott CCS-C+MPLABX 16F887. Ami a probléma: Nagyon szépen működik a megszakítás külső szintváltozásra amíg az lcd.c header segítségével nem írok valamit a kijelzőre, onnantól mintha kikapcsolna. Van valami ötlet, esetleg találkozott valaki ilyennel már?
43. sorban kellene egy vessző az lcd_putc után. Melyik ccs verziód van, mert az 5.011 vagy talán még az előtte lévők is csináltak olyat, hogy a printf "letiltotta" a megszakításokat!
Eddigi programjaimban nem volt vessző, úgy is működött, de most hogy beszúrtam nincs gond a fordításban ugyan úgy, de sajnos az interrupt még mindig nem megy. És sajnos pont a 5.011-es verzióm van nekem.
Lehet, hogy hasonló hibám volt, akkor a megoldás az interruptok külön engedélyezése jelentette.
Nézd meg, hogy az lcd írás után be van-e állítva a megfelelő interrupt, ha nincs akkor állítsd be.
Úgy emlékszem, hogy az 5.015-től már nem volt ez a probléma, ha tudod frissítsd a ccs-t (ha csak nem Torrente nyomozó hozta ).
Sziasztok!
Egy olyan kérdésem lenne, van valakinek tapasztalata dspic33ep512mu810 vagy valamelyik hasonló dspic USB használatára ccs alatt?
Sziasztok!
Szeretnék építeni egy egyszerű fogyasztásmérőt az autómba. A következőképp gondoltam megvalósítani: 1, megmérem az egyik injektor nyitva tartási idejét. Ebből ki tudom számolni, hogy mennyi üzemanyagot nyomott a hengerbe. (gyártó adatlapjáról meg tudom nézni az injektor áteresztési mennyiséget) (Amikor megkapja a tápot az injektor akkor indulna a mérés, amikor megszűnik a táp akkor ér véget) 2, megmérem a sebességmérő jeladója által adott periódusidőt, amiből ki tudom számolni a sebességet. 3, a két adatból megvan a pillanatnyi fogyasztás. Ez eddig szép és jó, de még sosem dolgoztam igazából a timerekkel. Ha valaki írna egy pár soros példát azt megköszönném. Ez csak egy hobbi projekt, tudom hogy nem lesz pontos a mérés stb. Az autó nem obd-s, onnan nem lehet levenni a jelet. Max fordulatszám 7500 1/min -> 125 1/s -> legkisebb periódusidő 8ms Min fordulatszám 600 1/min -> 10 1/s -> legnagyobb periódusidő 100ms Mivel elég nagy a két érték közötti differencia úgy gondolnám, hogy a pontosabb mérés érdekében a timer0-át 8ms-re állítanám, túlfutás esetén pedig egy változó értékét növelném, majd újra indulna a timer0. Ez így jó elképzelés? A hozzászólás módosítva: Júl 22, 2014
Idézet: „Ez csak egy hobbi projekt, tudom hogy nem lesz pontos a mérés stb.” Ez biztos, csak néhány adalék hozzá: - az injektor nyitása és zárása nem a ráadott feszültség "kezdetével és végével" egyezik meg, - az áteresztés mértéke "nem tuti", - a mennyiség függ a rendszer nyomásától is, nem csak az időtől... Tapasztalatszerzésnek persze nem lesz rossz, ha úgy döntesz , akkor sok sikert !
Tudom, ezekkel azért tisztában vagyok. De úgy gondolom az eltérés +- 1-2dl/100km lehet emiatt. Ez meg bőven belefér! (Ennyit a megane-om is téved, sokszor 1 literrel többet tudok beletankolni, mint amit szerinte elfogyasztott az autó)
A mérendő autóban amúgy is már 400e km van, szóval tényleg csak játék és tapasztalat szerzés az egész. Hőmérséklet és fesz mérést már tud, de ezek nagyon egyszerű dolgok voltak (DS18B20)
Én másképp közelíteném meg a dolgot. Van a CCP modul a picekben, annak a capture módja arra való, hogy amikor jelszintváltozás van a lábon, akkor elmentse a hozzárendelt timer pillanatnyi értékét a CCPR1x regiszterpárba. Mivel úgy írod, hogy egyik injektort megcsapolod, ebből úgy sejtem, hogy hengerenkénti injektoros a verda, ekkor egy injektor maximum 16ms (azért 16ms, mert egy injektor nem csak egy fordulat, hanem két fordulat ideje alatt folyamatosan fecskendezhet be egy hengerhez) ideig lehet nyitva, neked tehát úgy kell egy timert beállítani, hogy az épp ne csorduljon túl ennyi idő alatt. Ha mondjuk 32MHz-ről futtatod a kontrollert és 18F-ről van szó, akkor 4MHz-el hajtva a timert, az épp 16,4ms alatt csordulna túl, ami tekintve, hogy az injektorokat egyébként sem illik 80% fölé vinni, bőven jó lesz. Amikor felfutó él van (kezdődik az injektor nyitása), a kontroller elmenti a timer értékét a CCPR1x regiszterpárba, megszakítást is okoz, te ezt akkor eltárolod egy másik változóban, majd amikor lefutó él van (lezár az injektor), akkor meg kivonod a CCPR1x aktuális tartalmából a változód tartalmát, ekkor megkapod, hogy mennyi ideig volt az injektor kivezérelve. Lényegtelen, hogy közben esetleg túlcsordult a timer, a kivonás eredménye stimmelni fog. Az injektor zárt állapotában eltelő idő esetedben lényegtelen, hogy mennyi, akár többször is túlcsordulhat közben a timer - bár persze fel lehet használni fordulatszámmérésre két felfutó él között eltelő időt. Az injektorok nyitási idejének minimuma 2-3ms között szokott lenni, tehát még mindig elég nagy felbontással tudsz mérni terhelés nélküli időszakban is - nyilván itt már többet számít a lineáristől eltérő viselkedésük, erről viszont jó lenne találni valami doksit, hogy mégis hogyan alakul egy injektor szállított mennyisége a nyitási időtől függően.
Nézz utána, hogy a benzinhíd nyomása függ-e a szívócsőnyomástól. Mert ha nem függ, akkor az injektorok szállított mennyisége eltér a különféle üzemállapotokban, hiszen nem mindegy, hogy 3bar vagy 3,8bar a nyomás a két oldaluk között. Ha nem függ a benzinnyomás a szívócsőnyomástól, akkor ismerni kell a szívócsőnyomást is, hogy kompenzálni tudj valamilyen mértékben, ebben az esetben sokat segít, ha MAP szenzoros a levegőmérés, mert akkor annak a jele direktben felhasználható kompenzációra. Ha MAF szenzoros, nos az szívás De nyílván megoldható akkor is, csak nem olyan egyszerű. Ha függ a benzinnyomás a szívócsőnyomástól, az az egyszerűbb eset, akkor csak az injektor nyitási idejétől függ a befecskendezett mennyiség - első körben vehető lineárisnak az összefüggés.
Huha ez elég kimerítő részletességű ötlet
Egyelőre maradok a "kis" pic-ek mellett (12, 16 széria) mert ezekhez vagyok hozzászokva... Van 12f683-am, abban van CCP modul. Gondolom ez is megteszi. Egyelőre csak ezt a részfeladatot oldanám meg, nem egy teljes autó vezérlést Ezt 16MHz-en kergetve a timer1-et 16,3ms-re tudnám beállítani. Ez az érték majdnem az, mint amit te is írtál. A timer1 16 bites, vagyis 65535 részre bontom ezt az időintervallumot. Vagyis a kivonás eredménye * 16,3/65535 ideig volt nyitva az injektor. Ebből pedig ugye már számítható a liter/óra (álló autó) Ez így jó logikailag? A verda hengerenkénti injektoros valóban (Daihatsu Charade 1.3i) A 16ms maximumot honnan számoltad? Idézet: „azért 16ms, mert egy injektor nem csak egy fordulat, hanem két fordulat ideje alatt folyamatosan fecskendezhet be egy hengerhez)” Na ezt viszont tényleg nem értem, miért is? Kompenzációval egyelőre nem foglalkoznék, majd ha már működik valamennyire a "műszer" majd pontosítom. Egyelőre vegyük lineárisnak a rendszert. A hozzászólás módosítva: Júl 22, 2014
|
Bejelentkezés
Hirdetés |