Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   325 / 1319
(#) potyo válasza dolfin hozzászólására (») Okt 29, 2008 /
 
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:
  1. LOOP
  2.         BTFSS PIR1, RCIF
  3.         GOTO LOOP


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.
(#) kissi válasza dolfin hozzászólására (») Okt 29, 2008 /
 
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
(#) Mate78 válasza potyo hozzászólására (») Okt 29, 2008 /
 
Köszi,az lesz.
(#) Mate78 válasza trudnai hozzászólására (») Okt 29, 2008 /
 
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.
(#) messer hozzászólása Okt 29, 2008 /
 
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
(#) watt válasza messer hozzászólására (») Okt 29, 2008 /
 
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ő.
(#) PLaci válasza watt hozzászólására (») Okt 29, 2008 /
 
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

debugger.jpg
    
(#) trudnai válasza Mate78 hozzászólására (») Okt 29, 2008 /
 
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:
  1. 00001 LIST P=18Cxx
  2.                       00002
  3.                       00003 packed code_pack 0x1F0
  4. 0001F0 01 02 03       00004   DB 1, 2, 3
  5. 0001F3 04 05          00005   DB 4, 5
  6.                       00006
  7.                       00007 padded code
  8. 000000 0201 0003      00008   DB 1, 2, 3
  9. 000004 0504           00009   DB 4, 5
  10.                       00010
  11.                       00011   END

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:
  1. 0000                  00009 start:  
  2. Message[303]: Program word too large.  Truncated to core size. (7172)
  3. Message[303]: Program word too large.  Truncated to core size. (7300)
  4. 0000   3172 3300      00010         DB 71, 72, 73
  5. Message[303]: Program word too large.  Truncated to core size. (7475)
  6. 0002   3475           00011         DB 74, 75
  7.                       00012
  8. 0003   3461 3462 3463 00013         DT 61,62,63
  9.                       00014
  10. 0006   0081           00015         DW 81
  11. 0007   0082           00016         DW 82
  12. 0008   0083           00017         DW 83
  13.                       00018
(#) Mate78 válasza trudnai hozzászólására (») Okt 29, 2008 /
 
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
(#) potyo válasza Mate78 hozzászólására (») Okt 29, 2008 /
 
Azóta már rég kipróbálhattad volna a szimulátorban...
(#) Mate78 válasza potyo hozzászólására (») Okt 29, 2008 /
 
Kipróbáltam volna már,de a munkahelyi gépemen ahonnan most írok nincs MPLAB.

üdv
(#) szilva válasza Mate78 hozzászólására (») Okt 29, 2008 /
 
  1. db      1,2,3
  2.  
  3.         dw      1,2,3
  4.  
  5.         end


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ó.
(#) watt válasza PLaci hozzászólására (») Okt 29, 2008 /
 
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.
(#) dolfin válasza kissi hozzászólására (») Okt 29, 2008 /
 
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
(#) watt válasza dolfin hozzászólására (») Okt 29, 2008 /
 
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?
(#) PLaci válasza watt hozzászólására (») Okt 29, 2008 /
 
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!
(#) dolfin válasza watt hozzászólására (») Okt 29, 2008 /
 
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.
(#) MPi-c válasza watt hozzászólására (») Okt 29, 2008 /
 
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:
„A fototranzisztor a propeller forgását szinkronozza.”
Hát így van megoldva a ledek felvillantása...
(#) Norberto válasza dolfin hozzászólására (») Okt 29, 2008 /
 
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.
(#) dolfin válasza Norberto hozzászólására (») Okt 29, 2008 /
 
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.
(#) potyo válasza dolfin hozzászólására (») Okt 29, 2008 /
 
Valahogy úgy.
(#) szilva válasza dolfin hozzászólására (») Okt 29, 2008 /
 
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.
(#) watt válasza MPi-c hozzászólására (») Okt 29, 2008 /
 
Na tényleg jó nagy zavart okoztam az űrben!
Én meg - erre - gondoltam.
(#) watt válasza szilva hozzászólására (») Okt 29, 2008 /
 
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!
(#) watt válasza dolfin hozzászólására (») Okt 29, 2008 /
 
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!
(#) szilva válasza watt hozzászólására (») Okt 29, 2008 /
 
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.
(#) watt válasza szilva hozzászólására (») Okt 29, 2008 /
 
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!
(#) szilva válasza watt hozzászólására (») Okt 29, 2008 /
 
Egyetértek! Sok szép és jó megoldás születhet egy problémára, ez benne az izgalmas
(#) dolfin válasza szilva hozzászólására (») Okt 29, 2008 /
 
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.
(#) dolfin hozzászólása Okt 29, 2008 /
 
ÁÁÁ... 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
Következő: »»   325 / 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