Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Bocs, lehet nem kristalytiszta a fogalmazasom, a lenyeg, hogy megirok egy programreszletet nevezzuk "egysegnek" ami egy adott (gyakorta elofordulo) feladatot vegez, pl kijelzot frissit, vagy egy kapcsolo rovid/hosszu megnyomasat figyeli stb . Ezt legkozelebb fel tudom hasznalni mashol, az uj projecthez valo hozzaadassal, csupan a globalis valtozokat/cimkeket kell "osszefesulnom". Sokkal baratibbnak tunik mint keresgetni egy hosszu, regen irt main-ben azt a program reszletet ami most pont kell. Hangsulyozom megegyszer, csak hobbi szinten muvelem ezt a mufajt, de erre a tobbszori felhasznalhatosagra / attekintheto program letrehozasara nekem szimpatikus ez a modszer.
Csak a feladatban foglalt regiszterektől függ, hogy más PIC-en is tudod-e használni, vagy nem. Egy projecten belül nem lehet gond, de akkor ez nem nevezhető előre megírt rutinok felhasználásának, mert több száz PIC létezik, amik között sok az eltérés. De pl. matematikai rutinokat meg lehet írni, azok kompatibilisek lehetnek, bár 16F-18F között már az sem biztos.
Igazából nem azárt javítottalak ki, mert neked ez nem lesz jó arra amire akarod használni, inkább azért, hogy ha valaki olvassa az írásod, hogy milyen jó ez a módszer erre-arra, akkor nehogy elhiggye, hogy ez abban a formában ahogy leírtad igaz. Ennyi és nem több...
Oke, ertem. A felreertes ott volt, hogy ahogy irtam is kezdo leven egyetlen PIC-cel foglalkoztam eddig (16f877) es mivel eddig mindenben megfelelt nem is akarok egyelore masikkal kezdeni. Szoval mindaz amit irtam egy ugyanazon PIC tipusra irt programok relaciojaban ertendo. Remelem igy jo.
Hello trudnai!
Akkor úgy fogom megoldani hogy amikor belép a megszakítás által kezdeményezett alprogramba akkor ott munkálatok végén megadom hogy mondjuk goto main most csak így egyszerűen írva vagyis akkor a mainban meg úgyis ez lesz az első utasítás hogy delay. És én így józan paraszti ésszel arra következtetek hogy előről kezdi futtatni a delay parancsot. Jól tévedek? Lehet ezt így vagy másként ki lehet esetleg nullázni a delay-t még az alprogiban?
Mondjuk úgy, hogy rosszul akarod felépíteni a programot. A megszakítási rutinból nem ugrálunk ki sehová. A rutinnak vége van egy RETFIE utasítással (ezt a C fordító odateszi a rutint jelképező függvény(function) végére, nehogy mégegyszer odatedd - bár valószínűleg semmi gondot nem okozna), és pontosan ugyanott folytatódik a főprogram, ahol a megszakítás előtt tartott. Esetleg be lehet billenteni valami jelzőbitet a megszakítási rutinból, és a főprogram meg ha arra ráfut, akkor végrehajt valamit.
De ehhez az kell, hogy leszokj a delay_ms használatáról, és timerrel időzíts. Nem timer megszakításról beszélek, csak timerről!!!
Lehet nem fogalmaztam érthetően,úgyhogy inkább rajzolok.
adott egy 18f452 és egy motorvezérlő IC, aminek 4 bemenete van.A PIC-ből a 17,16 lábon jön ki a PWM jel, és az inverterrel és az ÉS kapukkal oldom meg, hogy a vezérlőjelektől függően (35,36) melyik bementre jusson a PWM jel.Na ezeket a TTL kapukat szeretném elhagyni, és szoftveresen megoldani a dolgot.Nem szeretnék a vezérlőbe plusz két IC-t betervezni. Erre nincs ötletem, akinek van az ne tartsa magában köszönöm
Nem vagyok nagy guru eddig csak a timer megszakítást láttam és delay funkciót ilyen dolgok megvalósításához. Esetleg simán a timer funkcióról kaphatnék némi információt? Egy progi részlet vagy bármi jó hogy megértsem működését.
Számomra ismeretlen okból az emberek nagy része (ahogy nézem, te is) egyenlőségjelet rak a timer és a megszakítás közé. Pedig a kettőnek csak annyi köze van egymáshoz, hogy amikor a timer túlcsordul, akkor tud megszakítást okozni. A timer az egy hardveres számláló, ami a processzor órajelével (vagy annak valahanyad részével) számol felfelé. A kezdőértékét be lehet állítani, és figyelni, hogy túlcsordul-e. A figyelés az, ami történhet megszakításból, de nem muszáj, hogy abból történjen. Ha nincs engedélyezve a timer számára a megszakítás, akkor a főprogramból kell figyelni a hozzá tartozó jelzőbitet (pl. T0IF, TMR1IF), és amikor az bebillent, akkor nullázni a bitet, és végrehajtani, amit akarunk.
Pl.
Persze ennek a pontos működéséhez az kell, hogy semmi se akassza meg a program futását, tehát az egész programot ennek észbentartásával kell felépíteni. Ha valami hosszabb időre megakaszthatja a futást, akkor az if (T0IF) {} blokknak át kell kerülnie megszakításba, hogy ne történhessen meg, hogy esetleg nem kezelődik le a túlcsordulás, de már újabb túlcsordulás jött. Idézet: „Ha valami hosszabb időre megakaszthatja a futást, akkor az if (T0IF) {} blokknak át kell kerülnie megszakításba, hogy ne történhessen meg, hogy esetleg nem kezelődik le a túlcsordulás, de már újabb túlcsordulás jött.” Hasonló okok miatt én a (d==100) feltételt is átirnám, pl. így:
ez természetesen a
sort helyettesíti. Ezzel a megoldással nem fenyeget az veszély, hogy interrupton növeled d értékét, a főprogram meg esetleg lemarad róla (jártam már így). Idézet: „Egy progi részlet vagy bármi jó hogy megértsem működését.” Ha minden igaz, hétvégén készítek egy cikket autó belső világításának vezérléséről, abban lesz egy kód, amiből szerintem sokmindent meg fogsz érteni.
Rendben potyo majd akkor elolvasom. Ahogy nézem nekem Mate78-cal kellene felvegyem még a diplomáciait mert énis cnc-vezérlőt építek.
Én csak mikrosteppes léptetőmotor vezérlést szakdolgozathoz.De mint látod vannak kérdéseim.
Sajnos nincs azon kívül, hogy keress olyan mikrokontrollert, aminek négy pwm kimenete van. Vannak ilyenek, csak az a baj velük, hogy többlábú smd tokban laknak.
Akkor megnyugodtam hogy szoftveresen nem oldható meg egyszerűen.
Végülis jó így is, működik, csak a konzulensem belekötött. köszi szépen üdv Idézet: „Például az egyik PWM modul kimenete az RC1 láb, ez eddig rendben, de egy másik alprogramban arra van szükségem, hogy a PWM jelet máshonnan vehessem le.” Az adatlap alapján úgy néz ki, hogy kizárólag CCP2 esetében van mód más láb választására (RC1/RB3), de ez is csak a megfelelő konfigurációs bit beégetésével válható, azaz programfutás közben nem lehetséges.
Ha mégis nagyon kell, akkor még egy olyan hajmeresztő megoldást tudok elképzelni, hogy a PWM-et szoftveresen, interruptokkal valósítod meg.
Iniciáláskor a CCP modulokat compare módban, "szoftver interrupt" módba kellene állítani, CCPR1/2-be pedig beírni a kívánt impulzusszélességet. Timer1 es 3 legyen kinullázva, de letiltva (TxCON bit 0 = 0). A periódusidőt timer2-vel állítod be (tulajdonképpen PWM módban is ez történik...), s a timer2 interruptok jelentik az új ciklus kezdetét. Interrupt esetén indítani kellene az előzőleg kinullázott timer1-et és timer 3-at, s 1-be állítod a neked tetsző lábakat (erre ment ki a játék, ugye?). Timer1 és Timer3 interrupt esetén pedig 0-ba állítod a megfelelő lábat, s leállítod, és kinullázod az interruptot okozó timert. Nagy vonalakban ennyi, s természetesen a szoftveres kezelés miatt nem lesz olyan pontos, mint egy hardveres PWM. Neked kell végiggondolnod, hogy az alkalmazás elbír-e ennyi pontatlanságot? Idézet: „Timer1 és Timer3 interrupt” Hülyeséget írtam: természetesen "CCP interrupt" értendő, azaz a CCP modulok által generált interrupt kiszolgálásáról van szó!
Üdvözlök mindenkit,még csak egy napja vagyok tag, és már egy csomó mindent átnyálaztam, de nem találtam a kérdésemre a válszt, ha valahol már leírtátok akkor bocs:
Mit csináljak, ha "csináltam" egy áramkört, de az ón kicsit szétfolyt, és így nem működig, mert áthidalta a szigeteléseket, és nem áll a rendelkezésemre ónszippantó... Előre is kösz! ÜDv.: K.B. Shul
Szia!
Ennek nem teljesen itt van a helye, vannak forrasztásos illetve NYÁK-készítéses topicok is jópáran. A problémára meg megoldás lehet akár egy kis gyanta külön, attól a szigetelőrészről "leugrik" a cin, ha megmelegíted, vagy használhatsz ünszívó harisnyát is. Az ónszívó harisnyát, ha nincs, lehet jobb híján helyettesíteni árnyékolt vagy koax vezetékről lefejtett rézharisnyával. Ezt kell a megtisztítandó felületre felfektetni, és pákával átmelegíteni, hogy a cin felfusson a harisnyára (ehhez a művelethez is célszerű extra gyantát használni).
Igen, pontosan erre ment ki a játék.Köszönöm, hogy foglalkozol a kérdésemmel.Nagyon tanulságos a megoldásod.
Ami gondot okozhat talán még az, hogy a programban van már egy másik, (magas szintű) megszakításom, Timer0 megszakítása, ezt használom fel a motor léptetésére. De ez már részletkérdés, a problémámra megadtad a választ. Plusz előny,ha jól értem, hogy ezzel a megoldással 16 biten tudom leírni a PWM kitöltés értékét. üdv Idézet: „ezzel a megoldással 16 biten tudom leírni a PWM kitöltés értékét.” Ez csak abban az esetben lehetséges, amikor timer2-nél 16-szoros elő-és utóosztást használsz, és timer2 FF-ig számlál. Minden más esetben csökken a felhasználható bitek száma, a kitöltési idő ugyanis nem lehet hosszabb a periódusidőnél. Idézet: „Plusz előny,ha jól értem, hogy ezzel a megoldással 16 biten tudom leírni a PWM kitöltés értékét.” Gondold végig! Ha 16bites a felbontás, akkor 1Hz-es PWM-hez 65.536kHz frekivel kell hajtani egy számlálót. Ha 1kHz PWM frekit akarsz, akkor már 65MHz!!! Ha 256(8bit) lenne a felbontás, akkor 1kHz PWM frekihez 256kHz kell. 10kHz PWM-hez 2,56MHz számlálási sebesség kéne, ami egy 20MHz -es Fosc esetében egy 8bites számláló bemenetén 1:2 előosztást jelent. (20MHz/4/2=2,5MHz => 2,5MHz/256=9,76kHz) A kitöltési tényező 0...100%-os lekezeléséhez a megszakítások sebességének meg kell egyeznie a számlálási sebességgel, azaz 2,5MHz tempóval kéne a kitöltés számlálót összehasonlítgatni a periódus számlálóval. Enyhén szólva lehetetlen, mert 2 utasítást lehet végrehajtani ennyi idő alatt. Arról nem is beszélve, hogy a 10kHz még nagyon zavaró tud lenni a fülnek! 16kHz már egy olyan érték, amit nem hallani, de ezt a frekit 8bites felbontással végképp nem lehet szoftveresen előállítani PIC-el. Az 1kHz határeset, de az meg sípol mint a fene! Olyan PIC kell, amiben sok PWM modul van... Idézet: „A kitöltési tényező 0...100%-os lekezeléséhez a megszakítások sebességének meg kell egyeznie a számlálási sebességgel, azaz 2,5MHz tempóval kéne a kitöltés számlálót összehasonlítgatni a periódus számlálóval. Enyhén szólva lehetetlen, mert 2 utasítást lehet végrehajtani ennyi idő alatt.” Miért kellene a kitölési számlálókat szoftveresen összehasonlítgatni, amikor a koncepció szerint az összehasonlítgatást a CCP compare modulok végzik Idézet: Így periódusonként csak egy-egy interruptot generálnak.„hardveresen?”
Én úgy értettem, hogy nem egy PWM kell, hanem 4. ?Egyébként az egész szoftveres kérdés eszembe se jutott volna.
Foga(da)tlan prókátorként csak annyit tudok erről mondani, amennyit a beírásokból kivettem: 2+2 bemenetet kell meghajtani, de nem egyszerre, hanem felváltva.
A megoldandó feladat az volt, hogy hogyan lehet az adott PIC-ben levő két CCP/PWM modult rávenni, hogy ne mindig ugyanazon a lábon menjen ki a jel. Hardveresen ez külső elektronika nélkül nem oldható meg, maradt a legkisebb rossz elve alapján, a compare mód szoftveres interruptja, mint megoldási lehetőség. Kicsit csúnya, kicsit pontatlan, de ha valakinek ez kell, akkor ezt használja. Az elegáns megoldás valóban egy alkalmasabb PIC keresése volna. Nem is tudom, hogy miért a gombhoz varrják a kabátot?
Ha egy PIC-nek 256 bájt RAM-ja van, az mit jelent? 256 bájt saját memória + 128 bájt SFR, vagy összesen van 256, és abból én 128-at használhatok saját célra? Konkrétan egy 18F1320-ről van szó, ott az adatlapot (48. oldal) én úgy értelmezem, hogy 00-tól FF-ig van GPR, és F80-tól FFF-ig SFR, tehát 256 bájtot használhatok saját célra. Viszont akkor így 384 bájt RAM lenne, ami ellent mond az adatlapnak.
256 bájtot használhatsz saját célra, az SFR azon felül van úgy, ahogy írtad.
Köszönöm! Lenne még egy kérdésem: mitől lehet az, hogy egy PicKit2-vel pár hónapja programozok és debugolok egy 18F1320-at, és minden teljesen jól ment. Tegnap óta viszont nem megy a debug. Az áramkörön semmit nem változtattam. A programozás továbbra is tökéletesen megy MPLAB-bal is, és a PicKit2 saját szofverével is. Maga a program is fut a PIC-ben, mindent jól csinál. Arra gondoltam, hogy megsérült valahogy a PicKitben lévő PIC programja, ezért megpróbáltam egy Download OS-t az MPLAB-ban, de utána sem lett jobb a helyzet.
Kipróbáltam egy gyári demópanellel, és azt tökéletesen debugolja. Létezik olyan, hogy úgy hal meg egy PIC, hogy nem lehet debugolni, de minden más tökéletesen működik rajta (lehet írni/olvasni, a programja fut, kommunikál RS232-n stb.)? |
Bejelentkezés
Hirdetés |