- .cinit 0x000e
- .code_vfprintf.o 0x0c22
- .code_DS1307.o 0x02a0
- .code_main.o' 0x023c
- -------------------------------
- 0x110C
Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Periódusidőmérés jobb választás. CCP modul Capture módja erre van kitalálva, nézd meg az adatlapban.
Ha kitoltesi tenyezot nem kell merni akkor talan egyszerubb ha azt mered bizonyos ido alatt hanyszor ment felfele a jel. Pl. 1s alatt szamolsz, es akkor nagyjabol 1Hz tol mar mukodokepes a muszered...
Masik modszer mikor az elvaltas ill a ket emelkedes kozotti idot mered. Ilyenkor alacsonyabb frekinel 1 emelkedest varsz meg, tehat elso emelkedesre indul a szamlalas, masodikra leall... magasabb frekiken pedig egyszeruen lehet novelni, hogy 10-et mersz, 100-at stb stb stb... Kodmegdobas: Googlizz ra, tuti ezer szam vannak hasonlo projectek a neten... Idézet: „Szerintem párszáz nF párhuzamosan vele megoldja ezt a problémát is.” Van aki 1µF-osat tesz mindenhova hidegitonek -- de keramiabol es lehetoleg SMD kivitelben. Adatvonalra az adatsebesseg figyelembevetelevel lehet csak kondikat elhelyezni, ezert javasoltam az 50pF koruli erteket oda.
Közbe rájöttem, hogy a periódusidőmérés lesz a jó, mert nemjó ha a program "áll" akár fél mp-re is.
Megnézem ezt a CCP-t, aztán ha nem jön be akkor maradok az élfigyelésnél, és a timernél. Nemakartam guglizni, pont azért mert 10000 ilyen projekt van, és bevallom most kicsit lusta vagyok bogarászni Köszönöm a segítségeket.
Nézegettem az adatlapot.
Szóval akkor ezt kéne csinálnom: Az első le/felfutó élre (CCP jelzőbit 1) törlöm a TIMER1 regisztert, a capture jelzőbitjét, megvárom amíg a bit 1 lesz, és akkor kiolvasom az eredményregiszterből az értéket, és ezzel továbbszámolok? Ennyi? Bocs ha hülyeséget írok, első programom
Most nincs a kezemben adatlap, de ha a CCP lábon bekövetkezik a jelváltozás, akkor a Timer1 aktuális értékét áttölti valamelyik regiszterbe, nevezzük ezt UJ-nak, amit te ezután szépen elmentesz magadnak mondjuk REGI néven. Legközelebb ismét áttölti a Timer1 aktuális értékét, ekkor fogod, és egyszerűen kivonod az UJ-ból a REGI-ben eltárolt értéket, és megkaptad, hogy hány órajelciklus futott le a két jelszintváltás között. Ezután az UJ értékét ismét átmásolod a REGI-be, hogy legközelebb ismét legyen mit kivonnod. Ezért jó a CCP modul, mert csak felfutó (vagy lefutó) élre reagál, és így periódusidőt mér, nem zavarja a kitöltési tényező. Ezután a periódusidőből meghatározod a frekvenciát, és kiírod LCD-re, hétszegmenses kijelzőre, elküldöd usb, ethernet, stb.
A dolgot még megfűszerezheti, hogy a Timer többször is túlcsordulhat két felfutó él között, de ezen gondolkozz egy kicsit, hogy kellene lekezelni
Pont a Timer1 túlcsordulása miatt aggódok, hogy megfűszerezi a dolgot, ezért is gondoltam az első élnél való nullázásra
A másik meg , hogy a túlcsordulás miatt a kivonásra is külön algoritmus kellene nem? Nem egyszerű az élet... 12Mhz es kvarc esetén 5,41msecenként csordul túl, ami 184 hz... ennél kisebbet úgyse akarok mérni. Kocsiba lesz fordulatszámmérőnek Köszönöm a helpet Üdv! Szerk: Ok , rájöttem ... tényleg ki lehet vonni... negyed kettőkör mér nemmegy a számolás 2bájtos változókkal
Szerintem ez a számolás nem jó, 12MHz -nél 1 utasításciklus az kb.~ 333ns, tehát így kb. 45Hz lesz nekem a mérés alsó határa. (1/65536*333ns). De lehet én számoltam el így fél kettő fele.
12000000/4/65536=45,77Hz
Nemtudom, hány hengerről van szó, meg hogy milyen jelet mérsz, de ha négyhengeres és a gyujtótrafó primeréről viszed a jelet, akkor a 45Hz kb. 1350-es fordulatnak felel meg. Ezt ha még osztod az előosztóval mondjuk 1:4 arányban, akkor már használható lesz fordulatszámmérésre, ha négyhengeres a motor és a trafó primerjéről veszed a jelet.
Ahányszor túlcsordul a Timer1(Beállítod a timer1 megszakítását, és növelsz egy változót ha megtörténik) annyiszor 65536-ot hozzáadsz a kivonás eredményéhez. Nem túl komplikált.
Nemvettem figyelembe, hogy 1 ciklus 4 órajel
wattnak igaza van, az a legegyszerűbb ha deklarálok egy long int-et aztán abba számolok. 4 bájt csak elég... Köszönöm segítséget mindenkinek, mostmár el tudok indulni
1µF-os kerámia kondi? Sose láttam olyat még. főleg nem SMD-be.
Azt hittem a kerámia kondik kb 470nF ig vannak. Max ha kettőt össze teszek akkor nagyjából kijön az 1uF.
Pedig a legtöbb kis SMD kondenzátor kerámia. Csak persze a kerámia dielektrikumok közt is van különbség, vannak egész pontosak, kevéssé hőfüggők és olyanok is, amilyeneknek a hagyományos kerámiakondikat megszoktuk, hogy pl. nagyon hőmérsékletfüggő a kapacitásuk. 1µF-osakat már én is vettem és használom is őket, pl.:
Bővebben: Link Nézd meg az adatlapot is, X7R-eseket lehet sok helyen kapni, az már egy elég jó kompromisszum a relatíve hőmérsékletfüggetlen viselkedésre.
Pedig létezik, egyszer valamiért én is vettem. Ugyanúgy néz ki, mint a 100nF-os, csak minden irányban kétszer-háromszor akkora. Bár ez nem smd, az igaz.
SMD kerámiában még 10µF-os is van. Csak sokkal magasabb, mint a sima 1206-os.
Ugyan úgy néz ki, de nem smd. Akkor mi? Huzalos?
A lábas 1µF kerámia ugyanúgy néz ki, mint a lábas 100nF kerámia, csak a fizikai méretei mások. Lábas=átdugjuk a panelon, és a túloldalon forrasztjuk, szóval nem smd.
"1ľF-os kerámia kondi? Sose láttam olyat még. főleg nem SMD-be."
Az erre adott válasz pedig: "Pedig létezik, egyszer valamiért én is vettem. Ugyanúgy néz ki, mint a 100nF-os, csak minden irányban kétszer-háromszor akkora. Bár ez nem smd, az igaz." Azért kérdeztem, hogy smd kerámiáról beszéltek, aztán ugyan úgy néz ki, de mégsem smd. Na mindegy. Idézet: „Azért kérdeztem, hogy smd kerámiáról beszéltek, aztán ugyan úgy néz ki, de mégsem smd. Na mindegy.” Teljesen mindegy, a kondenzatorok eleg sokat fejlodtek az elmult 10-15 evben. Allandoan csokkentik a meretet es javitjak a tulajdonsagokat ahogy az egesz ipar fejlodik es ahogy egyre nagyobb szukseg van a nagy integraltsagu eszkozokre -- elegendo csak a mobil telefonokra gondolni. Ma mar olyanokat is figyelembe szoktak venni, hogy a kis meretu SMD kondiknak jobbak az egyeb parametereik -- minel kisebb annal jobb, hasonloan az ellenallasokhoz. Ma mar nem ritka, hogy 0201-es meretekkel talalkozik az ember...
Hmm, ugy tunik a mid-range-eknek is letezik "klonjuk" a Microchip-en belul:
HA2089 Kivancsi vagyok a 18F-eknek is van-e valami olcsobb valtozatuk
Hehe! Én még nem is hallottam ilyenekről!
De nem semmi ez a kis mikrovezérlő(cske)..
Ez ránézésre olyasmi, mint a 16F684. Vajon lehet rendelni is belőle a MC-től, vagy csak akkor, ha 10-100ezres tételben gondolkozom?
Újra itt vagyok a problémámmal. Próbáltam minimalizálni a kódot és szétdaraboltam a nagyobb részeket kicsi eljárásokra, de sajnos nem oldódott meg a dolog:
Említettétek, hogy a Linker scriptet kellene esetleg módosítgatni. Még sohasem nyúltam hozzá, így nem tudom mire gondoltatok. Esetleg konkrétumot tudnátok mondani, hogy mit növeljek mire a 18f1220-as lkr-jében? Mit lehetne még egyébként megpróbálni, hogy megoldódjon a probléma? Köszi Zoli
Használj 18f1320-at. Az teljesen ugyanaz mint a 1220 csak nagyobb a program memóriája. Ha nem megoldható akkor a kódodban nézd meg hogy mi foglal el akkora helyet, és ott próbálj meg optimalizálni. Ha használsz sprintf vagy hasonló könyvtári függvényeket, akkor váltsd ki sajáttal.
A fordító által generált .map fájl első két táblázatát (Section Info és Program Memory Usage) légy szíves megmutatni! Az, hogy a main mérete mekkora, nem sokat mond, hiszen nem tudjuk, hogy milyen sallangok kerülnek mellé.
Jó lenne ha maradhatna a 18f1220, abból van itthon néhány darab...
Mellékelem a map fájlt. Köszi Zoli
Számoljuk össze a részleges MAP fájlban található helyfoglalásokat, és adjuk hozzá a main méretét, ami már nem fért be (itt page 0x002a - 0x0fff az a terület, ahová a kód elhelyezhető):
Ez nyilvánvalóan nem fér bele a 4 kilobájtos memóriába (pontosabban a 0x0026-0x0fff kódterületre). Az is látszik, hogy a memória legnagyobb részét (75 %-át!!!) a vfprintf könyvtári modul viszi el. Erről vagy le kell szokni, vagy keress egy nagyobb memóriájú mikrovezérlőt!
Sziasztok!
Segítségeteket szeretném kérni! CCSC fordítót használok mplab-ban, és 12f508 al szeretnék megvalósítani egy kapcsolást. valamiért a GP2-es portot nem tudom írni. A forrás: #include <12F508.h> #zero_ram #fuses INTRC,NOWDT,PROTECT,NOMCLR #use delay(clock=4000000) #define XTAL_FREQUENCY 4000000 //kristály frekvenciája Hertzben int flag; #use fast_io (B) //============================================================= void init(void){ //============================================================= set_tris_b(0b00000000); //portok definiállása 1-bemenet, 0-kimenet //output_b(0b00000000); //PORTOK törlése (ellenörzött indulás) flag=0; //flag törlése } //============================================================ void main(){ //============================================================ init(); //debug for (; { output_bit (PIN_B2,1); } } Segítségeteket előre is köszönöm!
Tisztelt fórumtársak!
Sajnos nem tudok programozni viszont a PARSIC nevű pic programnyelvet már valamennyire ismerem.Letölthető innen:http://rapidshare.com/files/193400110/Parsic_3.56.zip A ds1820 as hőszenzort szeretném a parsicban használni ehhez viszont asm kód kellene.Ha lenne kedvetek ránézni a PARSIC programra és esetleg beleirni egy kiolvasó rutint a ds 1820-hoz azt sokan megköszönnénk a PARSIC-os fórumról! |
Bejelentkezés
Hirdetés |