Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Alapkövetelmény, hogy úgy írd meg a programot, hogy semilyen esemény bekövetkezés vagy be nem következése se akassza meg azt. Valamiért a kezdők hajlamosak ilyeneket csinálni:
Na ilyeneket véletlenül sem szabad csinálni. Ez könnyen végtelen ciklussá válhat, abból meg csak egy darab lehet a programban, mégpedig az, ami az egészet átfogja. A mérés azon alapszik, hogy méred a bejövő jel két felfutó vagy két lefutó éle között eltelt időt. Szoftveres megoldás: egy INT láb vagy akár egy komparátorbemenet is felhasználható, mindegy mi, csak szintváltozásra (fel és/vagy lefutó élre) megszakítást okozzon. Megszakításkor kiolvasod egy futó Timer állapotát, és elmented. Következő megszakításkor kivonod a timer jelenlegi értékéből az eltároltat, és megvan az eltelt idő. Meg persze el is tárolod a jelenlegi állapotot, hogy a következő megszakításkor legyen mit kivonni. Hardveres megoldás: a CCP modul Capture módja. Ez a bejövő jel változásakor automatikusan letárolja a regiszterébe a timer állapotát, neked csak ki kell vonni az előzőből, és megvan az eltelt idő. Ez utóbbi, mivel a timer állapot kiolvasása teljesen független a program futásától, pontosabb eredményt ad (persze attól függ, mi a követelmény). Az eltelt időből meg már remélem tiszta, hogyan lehet a fordulatszámot meghatározni. Persze lehet még kitalálni további módszereket, de minek bonyolítani.
Szia!
Megfelelő időrést kell mérni és az abban bejövő impulzusokat megszámolni és kijelezni ( persze előzetesen számolni kell egy kicsit az időt, hogy az alatt az idő alatt pont a fordulatszámnak megfelelő impulzusszám jöjjön be!). Ez így megfelel gépkocsi fordulatszám mérésére, mert ott a +/1 100 eltérés nem gond, sőt jó, mert nem ugrál a kijelző, a mérés meg gyorssá tehető! Amennyiben "teljesen pontos megoldás kell és a fordulatszám nem változik, akkor marad a periódusidőből történő számolás! Szerintem ez így sokkal egyszerűbb, mint a Potyo kollega által leírt, mert kimarad az osztás! Steve
Hidd el utánanéztrem két helyen is mielőtt itt megkérdeztem.De tényleg,az MPLAB helpjében nem néztem.De nem lehet az 561h címen nulla,mert a fordítási lst fájlban sem nulla van,csak arra nem bírok rájönni hogy melyik adat hova kerül.
Sziasztok!
Okozhat hibát, ha egy 16f628 2db kimenetnek konfigurált lábát összekötöm (ellenállás nélkül)és mindkettőnek magas szintet adok (gondolom igen mert nem lehet egyszerre magas szintet adni nekik időben van eltérés és ez a tokon belül okozhat áram gondokat) azért kíváncsi vagyok mi a véleményetek!Köszönöm
Egy porton belül és ha egyszerre kapcsolod őket(mert lehet, csak nem BSF-el!) akkor elvileg nem lehet gond. De hogy erre mi szükség lehet, azt nem értem, mert a terhelhetőségük ettől nem biztos, hogy megnő.
Szia!
Háát... akárhogy nézem, vagy nem tudom használni az MPLab simulátorát, vagy nálam nem működik Befordítottam a te programodat. Hiba nélkül lefordul. Ezután beállítom a stymulus-ban az async fülön a amit írtál (RCREG, direct message, hexa szám, majd apply) Most elballagok egylépésenként a nopos végtelen ciklusodhoz, majd rányomok a stimulusban a asor elején álló "kacsacsőrre". Erre továbbra sem történik semmi. Az RCREG-továbbra is 00, és az IRQ rutinra sem ugrik el. (ez akár jó is lehet mert akkor lehet az én programom is jó) de továbbra is bosszant, hogy nem tudom mit bénázok el
Szia,
Nem irtad milyen MCU-n dolgozol, feltetelezem 18F sorozat valamelyiken. Little endian-t nem veletlen irtam... LSB-t is irhattam volna persze. Ez a help-bol van:
Ne zavarjon meg a packed-nel, hogy kulon valasztja a listazasnal a byte-okat es azok latszolag helyes sorrendben vannak, valosagban akkor is little-endianos a tarolas, a kulonbseg az arva byte-oknal van... 14 bites PIC-eken kicsit erdekesebb a helyzet, ott ugyan nem kezdenek el varialni, azonban mivel csak 14 bit van ilyen forman minden masodik byte bitjei kiesnek. De nem is erdemes DB-vel tarolgatni mert akkor meg problematikus a kiolvasas, helyette RETLW utasitasokkal kell a byte-okat letarolni es szamitott ugrasokkal kiolvasni az erteket (RETLW tablat pedig a DT -vel allitjuk elo) Ime egy pelda a lista file-bol:
Bocs tényleg nem írtam le az MCU típusát.18F452-ről van szó.
Próbálok rájönni hogy akkor hogy van.A padded code-nál akkor ugye a 00000-s memóriacímen van a 0201, a 00002-es memóriacímen meg a 03,(árva byte)a 00004-es memóriacímen meg a 0504.Eddig ok,mert 16 bites,tehát 2X8 bites a programmemória. De melyik értéket melyiken tárolja?Tehát mi kerül a 00000-s,és a 00001-es címre?Ugyanígy mi kerül a 00002-es,és 00003-as címre,és a 00004-es,és 00005-ös címre?(azért kell tudnom,mert a táblapointer byte-onként címzi a programmemóriát.) bocs ha kicsit nehézkes a felfogásom,de fontos hogy ezt megértsem. köszi üdv
Azóta már rég kipróbálhattad volna a szimulátorban...
Kipróbáltam volna már,de a munkahelyi gépemen ahonnan most írok nincs MPLAB.
üdv
Ennek hatására az alábbi hex keletkezett: :020000040000FA :0A00000001020300010002000300EA :00000001FF A pirosak a defbyte által leírt byteok, a kékek a defword által meghatározott szavak. A szavaknál LSB first a tárolási sorrend, ahogy látható.
Próbáld meg úgy, hogy a lejátszó gombra kattintasz, miután beállítottál egy break pontot a megszakításban. Ezután megnyomod azt a bizonyos > gombot és meg kell álljon a megszakításban.
Köszi a válaszokat.
A Propeller Clock-nál ez hogyan van megoldva? Ott hogyan méri a fordulatszámot? Mert nem hiszem hogy a PC venti olyan pontosan tartja a fordulatszámát (itt nézem a BIOS-ban ott is +-200 között ugrál) és ott ugye pontosan kell hogy mikor villanjon fel a LED. Tehát az hogyan méri a fordszámot? Köszi
Közben megértettem mit kérdezel...
A Propeller Clock az egy új processzor, kicsit megtévesztettél ezzel. A kérdésed többi része is elég kacifántos és a mondatod ételmetlen, csak kis küzdés árán jöttem rá mi a kérdés. Fogalmazz pontosabban, itt nem kell sietned, ez nem chat! A mérés elve pedig ott is periódusidő mérés. De mire mész ezzel az infóval? Miért nem kérdezel konkrét dolgokat? Mit szeretnél építeni? Milyen PIC-el? Milyen áramkörrel akarod illeszteni a PIC-hez a mérendő jelet?
BINGÓÓÓ!!!
Ez volt a megoldás! Köszi szépen. Igaz először a te progid megtréfált, mert ki kellett kapcsolni a timer0 megszakítást, mert attól is rögtön megállt az IRQ rutin elejére tett breakpoint-tól. De kikapcsolás után már úgy működik ahogy kell neki. Érdekes, hogy lépésenkénti szimulációban ezt nem lehet eljátszani. Mégegyszer nagyon köszi!
Sry a kevés infoért, csak rohannom kellett
SZóval... PC tuning PIC16F690-el... A gépem oldalán lévő venti forgási sebességét szeretném, először LED sorral sebességi tartományokban bekapcsolni (majd később továbbfejlesztve 7 szegmensen kiiratni), illetve olyanra is gondoltam hogy a (mint propclock) a venti végére pár led-et tennék amik fel-fel villannának ha megfelelő helyen vannak (fönt-lent v ahol akarom A jelet optokapu adná, amit a venti egyik propellerére helyezett kis lapka takarna el fordulatonként 1x... De az is eszembe jutott (csak nem tudom hogy működik) hogy a PC-s ventik 3. lába az adja elvileg a fordulat info-t a gépnek, az mi alapján? Az is így működhet? Hogy fordulatonként 1 impulzus?? Köszi ps.: Mostmár ráérek csak végre értsem meg a fordulatszám mérés elvét.
dolfin erről az óráról kérdezett.
dolfin! Az óra kapcsolási rajzán látható egy fototranzisztor, ami a PIC INT bemenetén van. A leírásban meg ez szerepel: Idézet: Hát így van megoldva a ledek felvillantása...„A fototranzisztor a propeller forgását szinkronozza.” Idézet: „csak végre értsem meg a fordulatszám mérés elvét” Nagyon egyszerű. Megméred, hogy 1 percnyi idő alatt hány teljes fordulatot tesz meg mondjuk az egyik lapát. Vagy bármi, ami a körpályán mozog.
Persze értem én, hogy a fototranyó érzékeli a fordulásokat.
Akkor itt a propclockon negatív visszacsatolással van megoldva? És a PIC irányítja a fordulat számát egy bizonyos értéken tartva impulzussal? Nem tudom ez az ötlet mennyire járható, de úgy gondolkodom hogy a optokapu érzékeli a lapát elhaladtát, és a következő között megmérem az időt (timerrel vagy INT-el) majd a következő körben ugye ismét indul az időmérés, de eközben az előző időből kiszámolom, hogy hány ms múlva lesz a propeller a megfelelő helyen és delay-ekkel villantom fel a ledet. Gondolom valahogy a propclock is így működhet.
Ez igazából már irányítástechnikai kérdés, egészen pontosan egy szabályozási kör. Egyfelől méred a fordulatszámot, majd ennek függvényében előállítasz egy hibajelet a kívánt fordulatszámhoz képest, és kiszámolod a beavatkozást, amivel a kívánt fordulatszám felé korrigálod a forgást.
Megfelelő paraméterezéssel egy ilyen kör nagyon szépen, pontosan tudja tartani a kívánt fordulatszámot, amihez utána már igazíthatod az időzítéseket, hogy melyik LED-nek hol kell felvillannia, hogy jó helyen látszódjon. (Mellesleg a PIC-pákámban is egy ilyen szabályozókör dolgozik, csak ott az érzékelés a pákahegy hőfoka, a beavatkozás pedig a rákapcsolt fűtőteljesítmény.) A másik, ami még eszembe jut erről a problémáról, az a fáziszárt hurok (ami szintén egy szabályozókör). Ha úgy tekinted, hogy előállítasz egy "tick"-et pontos időzítéssel a PIC-ben, míg a másik "tick" a venti érzékelő lábáról jövő (talán fordulatonként kettő) impulzus, akkor ezt a két frekvenciát kellene azonos fázisban tartani, ezzel meg van oldva a pontos fordulatszámtartás.
Na tényleg jó nagy zavart okoztam az űrben!
Én meg - erre - gondoltam.
Nem feltétlenül kell tartania a fordulatszámot egy adott értéken(nem kell szabályozni), ha arányosan tolja el a jeladótól érkező jel pillanatától a megfelelő ledek felvillanását. Ehhez csak a fordulatszámot kell ismernie, mást nem. Egy fordulat alatt nem fog akkora eltérés keletkezni, hogy az gondot okozzon, hacsak nem újjal állítja meg a forgást!
Hát jól félrediagnosztizáltam a dolgot!
Szilvának írott válaszomban már érintettem, hogy nem feltétlenül kell a fordulatszámot szabályozni. Adsz a ventinek 12V-ot és forog amennyivel forog. A jeladód adja az impulzusokat szépen. Ezt a jelet(0V vagy 5V), rákötöd a PIC CCP1 lábára. Megnézed az adatlap 128. oldalán a CCP modul Capture módját. A szerint beállítod a modult és a Timer1 számlálót is, hogy 16bites legyen és olyan gyorsan számoljon, hogy két impulzus között 30..40ezer impulzus jöjjön be, mikor már forog a venti. (itt most nem számoltam utána, hogy képes-e ilyen sebességre a Timer1, de ha nem, akkor a maximális számlálási sebességet kell beállítni) Ha ez megvan, akkor a CCP1 modul megszakítását engedélyezni kell és úgy kell beállítani, hogy pl. felfutó élre szakítson meg. Most képzeld el, hogy a Timer1 számláló pörög, a beállított sebességgel. Jön az első impulzus a venti jeladótól. Ekkor az megszakítást okoz, miután a Timer1 éppen akkori értékét beletöltötte a CCPR1L és H regiszterekbe. Első alkalommal nincs mit tenni(ez a program indulásakor, ill. a venti elindításakor fordulhat elő), Tehát megszakadtunk és ekkor eltároljuk a CCP1L és H regisztert. Telig az idő, Timer1 számlál, és a venti forog addig, amíg megint odaér a jeladó, és jelet ad. Ekkor megtörténik ugyanaz mint az előbb, csak a Timer1 30egynéhányezerrel arrébb áll. Ebből kivonod az előbb eltárolt értéket, és kapsz egy a fordulattal fordítottan arányos számot. Ezt feldolgozod, és megtudod mekkora a fordulat, azaz a LED mennyi idő alatt fog odaérni, ahol ki akarod gyújtani. Ezt az időt betöltöd a megfelelő időzítőbe, és amikor az időzítő számláló értéke megegyezik a kiszámolt értékkel, akkor kigyújtod a LED-et. Ez az időzítő lehet akár a Timer2 is, ami szintén megszakítást okozhat, így a LED kigyújtása nem kíván nagy odafigyelést a programtól. Remélem valami érthető ebből!
Persze, hogy nem kötelező, lehet úgy is dolgozni, hogy mindig az előző fordulat idejét osztja az ember fel a szögelfordulások szerint, és úgy időzít az aktuális fordulaton belül. Ilyenkor egy gyorsuló forgás szétnyújtja a szöget, a lassuló meg összehúzza. Szerintem mégis praktikusabb a fordulatszámtartásra berendezkedni és úgy időzíteni, akár előre kiszámolt értékekkel, mert a menet közbeni állandó újraszámolás elég kellemetlen tud lenni, főleg asm-ben.
Igazad van, egyszerűbb előre kiszámolt időkkel dolgozni.
Akkor amit az előbb leírtam, az csak az egyik lehetőség! Ezt is lehetne táblázatból vezérelni, és akkor csak a korrekciókat kéne a táblázatban letárolt alapértékekhez adni. Szép is ez a műfaj!
Egyetértek! Sok szép és jó megoldás születhet egy problémára, ez benne az izgalmas
Köszi mindenkinek.
Szilva megoldása tetszik, azt hiszem először ezt fogom kipróbálni, hogy mennyire tudom tartani az adott fordulatszámot. Gondolom PWM-el kellene, ha egy kiszámolt értékhez képest későn jön az impulzus az opto-n akkor növelni a kitöltési tényezőt ha későn akkor csökkenteni, ha nem megy akkor jön a capture mód Köszi Akkor nekiállok próbálkozni.
ÁÁÁ... megint elakadtam...
Ezt a Prescalert nem értem... Timer0-nál, 4Mhz kvarc esetén ha 32-vel osztom a frekit akkor hány us-ként növekszik a timer? Hogy kell ezt kiszámolni? Köszi |
Bejelentkezés
Hirdetés |