Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   357 / 1319
(#) Jobbagyag válasza watt hozzászólására (») Dec 8, 2008 /
 
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.
(#) watt válasza Jobbagyag hozzászólására (») Dec 8, 2008 /
 
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...
(#) Jobbagyag válasza watt hozzászólására (») Dec 8, 2008 /
 
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.
(#) cpumaster válasza trudnai hozzászólására (») Dec 8, 2008 /
 
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?
(#) potyo válasza cpumaster hozzászólására (») Dec 8, 2008 /
 
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!!!
(#) Mate78 válasza potyo hozzászólására (») Dec 8, 2008 /
 
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

Stepper.png
    
(#) cpumaster válasza potyo hozzászólására (») Dec 8, 2008 /
 
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.
(#) potyo válasza cpumaster hozzászólására (») Dec 9, 2008 /
 
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.
  1. unsigned char d=0;
  2. while (1)
  3. {
  4.         if (T0IF)
  5.         {
  6.                 T0IF=0;
  7.                 TMR0+=xx;       //(itt hozzáadjuk a kezdőértéket)
  8.                 d++;
  9.                 .....           //(végrehajtjuk, ha kell )
  10.         }
  11.         if (d==100)     // ha 100 túlcsordulást kell várni valamivel
  12.         {
  13.                 d=0;
  14.                 ...             // végrehajtjuk, amit 100 túlcsordulás után kell
  15.         }
  16. }


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.
(#) icserny válasza potyo hozzászólására (») Dec 9, 2008 /
 
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:

  1. if (d>99)


ez természetesen a

  1. if (d>=100)


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).
(#) potyo válasza cpumaster hozzászólására (») Dec 9, 2008 /
 
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.
(#) Mate78 válasza potyo hozzászólására (») Dec 9, 2008 /
 
Az én problémámra nincs valami ötleted?
(#) cpumaster válasza potyo hozzászólására (») Dec 9, 2008 /
 
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.
(#) Mate78 válasza cpumaster hozzászólására (») Dec 9, 2008 /
 
Én csak mikrosteppes léptetőmotor vezérlést szakdolgozathoz.De mint látod vannak kérdéseim.
(#) potyo válasza Mate78 hozzászólására (») Dec 9, 2008 /
 
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.
(#) Mate78 válasza potyo hozzászólására (») Dec 9, 2008 /
 
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
(#) icserny válasza Mate78 hozzászólására (») Dec 9, 2008 /
 
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.
(#) Mate78 válasza icserny hozzászólására (») Dec 9, 2008 /
 
igen tudom, ez sem megoldás.
(#) icserny válasza Mate78 hozzászólására (») Dec 9, 2008 /
 
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?

(#) icserny válasza icserny hozzászólására (») Dec 9, 2008 /
 
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ó!
(#) Shul hozzászólása Dec 9, 2008 /
 
Ü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
(#) szilva válasza Shul hozzászólására (») Dec 9, 2008 /
 
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).
(#) Mate78 válasza icserny hozzászólására (») Dec 9, 2008 /
 
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
(#) icserny válasza Mate78 hozzászólására (») Dec 10, 2008 /
 
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.
(#) watt válasza Mate78 hozzászólására (») Dec 10, 2008 /
 
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...
(#) icserny válasza watt hozzászólására (») Dec 10, 2008 /
 
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:
„hardveresen?”
Így periódusonként csak egy-egy interruptot generálnak.

(#) watt válasza icserny hozzászólására (») Dec 10, 2008 /
 
Én úgy értettem, hogy nem egy PWM kell, hanem 4. ?Egyébként az egész szoftveres kérdés eszembe se jutott volna.
(#) icserny válasza watt hozzászólására (») Dec 10, 2008 /
 
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?
(#) bkati hozzászólása Dec 10, 2008 /
 
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.
(#) MPi-c válasza bkati hozzászólására (») Dec 10, 2008 /
 
256 bájtot használhatsz saját célra, az SFR azon felül van úgy, ahogy írtad.
(#) bkati válasza MPi-c hozzászólására (») Dec 10, 2008 /
 
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.)?
Következő: »»   357 / 1319
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem