Fórum témák
» Több friss téma |
Olvass már légyszíves vissza. Biztos megtalálod a szokásos, lenéző megnyilvánulását. Nem ártana a magas lóról leszállni...
Bocs az OFF-ért..
Szerintem senki nem nez le senkit, azert pic KEZDO a forum cime. De ugye van olyan szint, hogy PIC-et akar programozni, de azzal is gondban van, hogy az elem + veget hova kosse. Nem hiszem, hogy ebben a topicban kellene mondjuk a 'kis hengeres csikos ize ket vegen drot log ki belole' c. alkatreszt es annak hasznalatat neki megtanitanunk.
Ha valaki nem tud kapcsolasi rajz alapjan aramkort kesziteni (es itt nem egy bonyolult dologrol van szo), akkor vegye meg, vannak keszen remek cuccok. Azon kivul kb 600x leirtuk, hogy a 16F84-es mar elavult dolog, tehat nem olvasott vissza.
És utoljára....
Akkor több mint 1 éve ezek szerint én is eltévesztettem a topic cimét, ugyanezeket a lehúzó kijelentéseket kaptam meg ebbe a topicban. Nos akadt egy fórumtárs aki magánban segített linkekkel, példákkal. Csak azért nem ide írta mert a sok észosztó belekavart volna. Azóta önállóan programozom a PIC-ket, áramköröket tervezek és örülök hogy ezt a sokrétű alkatrészt tudom használni minden célra. Mindenki valahogy próbálja az első lépéseket megtenni kiinduló pontokat keresve. Sok utánna olvasás és türelem kell, nameg olyan fórumtársak akik valóban segíteni akarnak megfelelő hozzáállással. Sajnos ezt akkor és most is hiányolom. Minden elismerésem Nekik a tudásuk lényegesen nagyobb mint az enyém, Ők megtehetnék hogy türelemmel, lépésről lépésre segítséget adjanak azoknak akik valóban szeretnék megtanulni a PIC belő lelki világát. Ebben az se megoldás hogy vásárold meg a cuccot... A 16F84 valóban elavult, de véleményem szerint mindenképp első lépésnek kiváló (vagy a 16F628). Majd ha azon mennek az alapok jöhet pl a 18F4520 és az ettől jóval nagyobb tudású PIC-kek programozása. Moderátoroktól és azoktól akiket esetleg megbántottam ezúton elnézést kérek csak a véleményemet írtam le.
A kerdeses kerdezonek nem a PIC-el volt gondja, hanem az elektronikaval ugy altalaban.
A 16F84-es ara ugyanannyi, mint egy fejlettebbe (valoszinuleg csak kegyeleti okokbol forgalmazzak ) A Ferrarival tudsz menni 40-el, de a Trabival nem tudsz menni 200-at. Egy 18F-eshez nem feltetlenul kell pl. kvarc, ami egyszerusiti az aramkor epiteset es kezdokent nem kell bankolni, ami egyszerusiti a programozast. Nekem sem es masnak sincs kedve olyannak magyarazni ingyen, aki a valaszokat sem erti meg. Arra valo a sima kezdo kerdesek topic, ahol valoban a 'mire valo a tranzisztor?'-szeru kerdesek kerulnek elo es lam, megis valaszolnak nekik. En is szoktam. A te esetedben bizonyara volt egy eros szandek, amit a kerdeses kerdezoben nem latok. Ha a szamitogep elott ulsz es egy ismeretlen kifejezessel talalkozol, akkor te beirnal egy forumba, hogy mondjatok meg, mi az? En siman beutnem a keresobe... Az embernek a sajat korlataival tisztaban kell lennie, ha pl. egy bukfencet sem tudok megcsinalni, akkor nem kezdek mindjart a tripla szaltoval... Szoval nagyon elegem van azokbol, akik massal akarjak megoldatni a lustasagbol fakadoan hianyos tudasuk miatt keletkezo problemaikat.
Sziasztok!
Egy fordulatszámmérőt (frekvenciamérőt) építek PIC-ből. (Kezdő vagyok, azért írok ide és nem a ford.számmérős topikba). Elakadtam.. A timer0-t (számlálót) és timer1-et (időzítőt) használom. Pic16F628A, RA4 a bemenőjel. Led kijelző van még, aminek a digitjei az RA0-RA3-ra van kötve, a szegmens pedig a PORTB. A kijelző működik (ha fix értéket írok be, akkor szépen kiírja). Ha mérnék, akkor nem jutok előre, írogat ki dolgokat, de nem jövök rá, hogy hogy kéne egyáltalán beállítani, hogy megfelelően működjön a timer0 és timer1.
10 Mhz quartz, 4 ütemű motorhoz. Egyenlőre csak azt szeretném, ha a 0-255-ig kiírná, hogy mennyit számol, de vagy 255, vagy hülyeség vagy pedig 0-1-3 között ugrál. Legalább azt szeretném, hogy a timer0-timer1 beállítása ok és nem azt kellene piszkálnom. A teljes forráskódot azért nem teszem be, mert eléggé teli van szemetelve és még nem takarítottam ki. Esetleg be kellene még vonnom a timer2-t, hogy az multiplexeljen, a timer1 időalapon és timer0 pedig számolna? Hogyan kell beállítanom, hogy helyesek legyenek az időzítések? Ha lehet binárisan, hogy egyszerűen lássam mit mire állít be. Köszi előre is!
Szerintem csatold a kódot, amivel mérni szeretnél és írj egy kicsit arról, milyen algoritmussal próbálkozol a mérésre. Két dolgot látok, egyik hogy a Timer1 külső oszcillátort engedélyezed, viszont az órajelét meg a belső órajelről adod neki, a másik meg hogy a Timer1-et engedélyező bit nullába van írva. Tehát inkább 00010001-el próbálkozz a T1CON-ba. Viszont hogy a te algoritmusodhoz ezek a prescaler beállítások megfelelnek-e, azt csak akkor tudjuk megmondani, ha látjuk a mérés algoritmusát is.
A Timer2-t felesleges bevinni, viszont nézz utána a CCP modul Capture módjának, mert az elég jól használható ilyen tipusú mérésekre. Ha gondolod, előkotrom a kódot, amit én írtam nemrég, igaz más chipre volt, meg C nyelven volt írva, de ötletadónak megfelel.
Nem akarom elvenni a saját alkotás örömét, de ha könnyíteni szeretnél a dolgodon, akkor tekintsd meg ezt, értsd meg a forráskódot, utána már könnyedén átírod 4T-re. De vigyázz, az asm 16F84-hez íródott, 16F628-hoz még le kell tiltani az analóg bemeneteket!
Mindenképpen magam szeretném megoldani, még ha külső segítséggel is. Most eljutottam odáig, hogy 10-11 között ugrál. Ha jól sejtem, akkor a Timer0 előosztója a tmr0-hoz csatlakozik és az előosztás 1/256.
A timer1 pedig 1/8-ad osztással megy. Hogy most mit értem el, még elmélkedem rajta, hogy mi az a 10-11. Az elmélet pedig a következő. A timer1-nek adott időt kéne futnia (amit ki kéne tudnom számolni, de még nem tudom), ez alatt az idő alatt megszámoljuk, hogy a timer0-ba (RA4)-re hány impulzus ment. Aztán a kapott értéket felszorozzuk és valahogy így kéne mennie. Jelenleg egy asztali lámpa 12V-ról szedem a jelet (a pic is erről megy), ami elméletben kb. 50Hz. Mellékletben a forráskód. Köszi az eddigi tippeket.
A mérési módszerrel az a probléma, hogy négyütemű motornál túl kevés számú szikra jelenik meg azon idő alatt, amennyi ideig számolod a bejövő szikrák számát, emiatt a mérésed eredménye mindig ugrálni fog két érték között, még ha a motor állandó fordulaton is jár. Ha pl. másodpercenként ötször számolsz, akkor 1200-as fordulatszámnál 40/5, azaz nyolc szikrát számolsz meg 0,2 másodperc alatt. A 8 szikrát megszorzod 1200/8 azaz 150-el, akkor kapod meg a fordulatszámot. Ez eddig jó, csak az a baj, hogy ha a motor pl. 1150-es fordulaton jár, akkor egyik 0,2 másodperc alatt 8 szikra jön be, másik 0,2 alatt 7 szikra, vagyis a kijelzésed ugrálni fog 1200 és 1050 között, ami szerintem nem megengedhető.
Ehelyett a mérésnek úgy kellene kinéznie, hogy két szikra között eltelő időt méred és abból számolod ki a fordulatszámot Pl. úgy, hogy a bejövő szikra megszakítást okoz, ekkor kiolvasod a Timer1 értékét és eltárolod valahová ideiglenesen, majd nullázod a Timer1-et, és a letárolt értékből meg kiszámolod a fordulatszámot és utána kijelzed. Ez így egy picit bonyolultabb, viszont a mérésed nem fog ugrálni. Timer1-et úgy kell beállítani, hogy az alapjárati fordulatszámnál számoljon el a lehető legtovább anélkül, hogy túlcsordulna. 600-as fordulatszám másodpercenként 20 szikrát jelent, vagyis két szikra között maximum 50ms idő telhet el. A Timer1 oszcillátort a főoszcillátorról futtatva 2,5MHz-el számol, vagyis 400ns egy számolás periódusa. 50ms/400ns=125000, vagyis ennyi órajelet kap a Timer1 két szikra között. Ez nagyobb, mint a Timer1 maximális értéke, ezért 125000/65536=1,90 vagyis 1:2 arány prescalert kell elétenni, hogy ne csorduljon túl alapjáraton sem. Ekkor az említett 600-as fordulatszámnál a Timer1-ből 125000/2 azaz 62500-at olvasnál ki. Itt egy apró probléma, hogy a Timer1 értékéből a fordulatszám visszaszámolásához osztást is kell csinálni, erre viszont vannak a neten kész rutinok, vagy pl. watt holnapján találsz leírást rá, hogy hogyan kell csinálni. A lényeg, hogy 600*62500=37500000-t kell osztani a kiolvasott értékkel, és az adja a fordulatszámot. Tehát ha pl. 19000-t olvasol ki, akkor 37500000/19000=1973-as fordulatszámon jár a motor. Ha a motor mondjuk 6000 fordulaton jár, még mindig 6250 lesz a Timer1-ben, innen láthatod, hogy igen nagy számú "bejövő" jeled lesz két szikra között, vagyis a +-1 elcsúszás itt igen kis mértékben fogja befolyásolni a kiejlzett értéket, gyakorlatilag 0,2 ezrelék pontosságot tudsz kapni. Azután még ezen is lehet reszelni, hogy mondjuk minden nyolc szikra után átlagot számolsz, és azt adod át a kijelzésnek, így még stabilabb kijelzést fogsz kapni anélkül, hogy nagyon lelassítanád a kijelző frissítését (itt nem a multiplexelésre gondolok, hanem a kijelzett érték frissítésére). Érdemes úgy csinálni a programot, hogy csak a bejövő szikra lekezelése és a Timer1 kiolvasása, értékének letárolása és a Timer1 nullázása legyen megszakítási rutinban, hogy annak a késése a szikra megjelenéséhez képest mindig állandó legyen. Minden más, tehát az osztásos számolás és a kijelző multiplexelése pedig a főprogramból történjen, megszakítási rutinban beállítasz valami bitet, amit a főprogram folyamatosan figyel, és amikor volt megszakítás, akkor kiszámolja, amit kell. Tehát szerintem a következő lépésekben haladj: - kijelző multiplexelés főprogramból megszakítás használata nélkül (főprogramból figyeled pl. a Timer0-hoz tartozó Flag bitet és ha bebillen, akkor ugrasz a hozzá tartozó rutinra) - külső megszakítás engedélyezése és a Timer1 értékének letárolása, majd főprogramból a letárolt érték kiírása a kijelzőre. Ekkor már ha kipróbálod a motoron, akkor már az értéknek változnia kell a fordulatszámtól függően - a letárolt értékből az osztással a valós fordulatszám kiszámolása és annak kijelzése - esetleg az átlagolás megoldása
Ez aztán a segítség, köszönöm...Ez inkább gúnyosan hangzik, pedig ellenkezőleg!
Ezt még emésztenem kell, de az elképzelés tetszik. Első dolog amit nem tiszta, hogy ha jól értelmezem, akkor ha a timer0 RA4-re bejövő jel (szikra) érkezik, akkor kellene interruptolni, és kiolvasni a timer1-et, de eddigi tudásom alapján a timer0 akkor lép megszakításba, ha túlcsordul és az nekem már nem jó. Tehát nem is kell megszakítás, hanem a főprogramban figyelem a tmr0-t és ha változott (volt szikra), akkor nullázom és timer1-et nézem (és nullázom). Vagy van valami beállítás, ami arra vonatkozik, hogy akkor legyen a timer0-n megszakítás, ha jel érkezik, csak átszaladtam rajta! Ma megyek haza és nem tudok foglalkozni vele, de viszek egy adag doksit és olvasgatok,tervezgetek, jövőhéten pedig nekiugrom!
Timer0 nem tudom, hogy hogy jön a képbe, amikor arra nincs is szükséged. Ha a szikrák keltenek megszakítást (pl.az INT0 külső megszakítás bemenet segítségével), akkor az INT0 megszakítással kell foglalkozni, nem timer0-val.
A Timer1 pedig folyamatosan számolja a CPU órajeleit, s ez lesz az időinformáció.
Sziasztok!
Ha a CCP modult használná a program, nem kellene nullázni sem. A CCP bemenetre érkező jel hatására a Timer1 értékét maga a modul átmásolja a CCPR1H:CCPR1L regiszterekbe. Ha a számlálás nagyobb frekvenciás órajellel történik, és a Timer1 túlcsordulhat két impulzis között, a túlcsordulás a megszakítási rutinban lekezelhető. Nem kell nullázni, elég az új tartalmat a régiből kivonni. A Timer1 írása sok kontrollernél problémás (ld. Timer1_errata)...
Hali.
Tudnátok segíteni egy programrészlet megértésében? Pontosan a késleltetéssel van a gondom.
Nos a program elején létre lett hozva 3 változó (T1,T2,T3) és most azok értékeit bizonyos számra beállítjuk. Most nekem az nem világos hogy ebből hogyan lehet megkapni azt, hogy hány másodpercig fog tartani a késleltetés? Egyáltalán minek ide 3 változó miért nem lehet egy változóval megcsinálni? A segítségeteket előre is köszönöm.
Hali!
Mivel egy változóba maximum 255 érték kerülhet (1 byte-os változókat lehet létrehozni), ezért ha nagyobb számokra van szükségünk, akkor több változó kell. Ebben a kódban pedig egymásban lévő ciklusok vannak, tehát először a belső mag fog végrehajtódni, vagyis a NOP-ok, amik 4 órajel időt foglalnak, tehát 4MHz-es kvarccal 1us alatt hajtódik végre 1 ilyen NOP. Tehát ha végrehajtódik a 10 NOP, az már 10us. Ezután csökken 1-el a T3 változó, egészen addig amíg 0 nem lesz. Ha elérte a nullát, akkor T3 megint 20 lesz, de csökken a T2 értéke is 1-el. Vagyis nem csak 20x játszódik le a 10 NOP, hanem 255x, sőt, mivel van még egy másik ciklushéj, ezért összesen 100x255x20=510000-szer! fog végrehajtódni a NOP, ami bő fél másodperc, de itt nem számoltuk be azt az időt, amíg végrehajtódnak a cikluson belüli "DCFSZ" és egyéb utasítások, amiknél ugyancsak idő telik el, amíg végrehajtódnak. szerk.: a NOP (No OPeration) egy "üres" utasítás, vagyis látszólag nem csinál semmit, csak eltelik x idő.
Szia!
A három változó felhasználását megmagyarázta az előbbi hozzászólás. A programrészlet futási ideje az MpLab szimulátorával mérhető: - tegyél egy töréspontot a DELAY címke utáni utasításra, egy másikat a részlet végén levő return -re, - állítsd be a szimulátornak az órajel frekvenciáját, - Jelenítsd meg a stopper órát, - inditsd el a programot a szimulátorral, - Amikor megáll a program a DELAY utáni utasításon, nullázd le a stoppert, - Amikor a return - on áll meg, a stopperről leolvasható a részlet futási ideje...
Nagyon szépen köszönöm a bő válaszokat. Már megértettem az egészet. Mindkettőtöknek még egyszer köszönöm.
Üdv. edison14
Sziasztok
Csináltam egy PIC-es áramkört (sörkollektore vezérlő) Valamiért könnyen zavarba jön pl. ha felkapcsolom a villanyt az egyik szobába leáll majd újraindul. PC tápról megy, 100 nanos a pic lábain. Lehetséges, hogy a hőérzékelő hosszú vezetékén szed össze valami zavart? (12F683-ról van szó) Van valakinek ötlete, hogy lehetne stabillá tenni? üdv
Ha van szkópod, vagy kölcsönbe digit tárolós szerkezet, akkor lehetne például méregetni és figyelni kicsit.
Szerintem tutira a tápból szed össze valamit, rakj bele több (nagyobb) pufferkondit a tápba!
Szerk.: milyen tápról megy a PIC? Van benne stab. IC?
Hali
Esetleg lathatnank valami doksit? Akkor esetleg tobbet mondhatnanak.
Köszi a tippeket szerintem is kondik kellenének még bele, mert a PC tápról megy direktbe az ő 5V-járól.
Doksi az nincs róla, mert saját tervezés papíron, de ha holnap se boldogulok akkor beszkennelem. Üdv mindenkinek.
Ha tudod, próbáld ki egy mezei tápról (trafó, graetz, pufferkondi (pl. 2200uF), és 100nF-al egy 7805.
Persze a WDT és BOR -t se felejts beállítani. (Ettől szép a szakma, hogy a szoftver és hardver már erősen összefügg!) Bocs! Zsoltinak akartam címezni...
köszi a tippeket a kondi megoldotta a problémát
üdv
sziasztok!
majdnem elkészült a fordulatszámmérőm. Timer1 számol, RB0-ra megy a jel. Osztás működik, BCD-be váltás megy. PIC-be még nem volt égetve. Szimulátorba úgy néz ki, hogy megfelelően számol. Egyedül a multiplex-el szívok. Sehogy sem akarja az igazságot. A Kónya (2000-es kiadású) IC mikrovezérlők alk... könyvből néztem ki a 7 szegmenses kijelző vezérlését, az hat digitre készült. Belefutottam a pclath addwf problémába, amit azt hiszem, sikerült megoldanom, de a multiplex nem megy. DIGIT1-4 ig érkeznek a kijelzendő számok (BCD-ben). Próbálkozom már vele egy ideje, de valahogy nem akar jó lenni. A Kónya könyvben JNZ-t használ a Digit ugrásokra, ezt átírtam BNZ-re (gondolom nyomdai hiba). Valaki átnézné, hogy mi lehet a gond? Köszi előre is! Mellékletben a program.
Hello!
A PCLATH-t a Call utasítás kiadása előtt kell feltölteni (nem amikor már a rutin elején állsz), mert a hívás, így megy arra a memória lapra ahol a rutin van. A RET, meg majd visszatölti a régit. (Persze ha a hívás és a rutin azonos lapon van, akkor nem változik, ilyenkor még nem veszed észre..) üdv! proli007
Szia!
Nézd meg jobban "kiiras" rutinodat: - A "NEXT_DIG" változó kezdetben 0. - A követekzó kódrész a 0..3 értékeket 4 -re alakítja:
- Ha az eredmény nem 0, akkor meghívódik a "UGRO_TBL" eljárás, ami csak 0..3 étrékekre van felkészítve. A 4 érték hatására a vezérlés a "kiiras" -ra kerül ismét. - Elég hamar eléri a "NEXT_DIG" változó a 4 értéket, ekkor, törlődik és az "digit1_ki" rutin fut le. - A kiiras rutin a következőre egyszerűsíthető:
Ha indirekt elérést használnál, a "kiiras" funkció megoldható lenne kiszámított ugrás nélkül... Érdemes lenne a BCD -be váltáshoz az ezen a lapon található rutint felhasználni.
Működik! 50hz-ről próbapanelon! Egy asztali lámpáról szedem a jelet (és a táp is erről megy).
Itt is ugrál egy kicsit 1499-1500 között. Most gondolkozom az átlagoláson és azon, ha nincs jel, akkor túlcsordul a timer1 így ezt is le akarom kezelni, egy kis animációval (semmi csicsa, egyszerűen). Szeretném még, hogy bizonyos fordsz. felett villogtatni a kiírást és a maximális fordulatszám eltárolásán, de ez már csak a jéghegy csúcsa lenne. a Ha végleg elkészül felteszem a teljes kapcsolást! Köszönöm az eddigi segítséget: potyo, icserny, proli007, Hp41C!
Tisztelt Urak! /Hölgyek/
Van valahol olyan felület valahol, ahol a megfelelő Pic típust ki lehet választani a szükséges perifériák, sebességek stb alapján? Köszi előre is!
|
Bejelentkezés
Hirdetés |