Fórum témák

» Több friss téma
Fórum » Folyamatábrás mikrokontroller programozás Flowcode-dal
Lapozás: OK   81 / 360
(#) kaqkk válasza Kovabe hozzászólására (») Nov 5, 2012 /
 
Megnézed a pic adatlapját, és máris tudod melyik pwm melyik lábon jelenik meg !
A hozzászólás módosítva: Nov 5, 2012
(#) watt válasza kkrisz75 hozzászólására (») Nov 5, 2012 /
 
Nem csak pontosabb, hanem ha megérted a működését, egyszerűbb is. Persze jó kérdés, hogy Flowcode-ban le tudod-e programozni, de volt itt egy példa is, nem lehetetlen!
A te módszered nekem kicsit kusza, sok a bizonytalanság, mert mikor Timer0 megszakít, jöhet impulzus, akkor a mérés pontatlan lesz, akár le is késheti a jelet, bár valószínű a jel hosszabb, mint a megszakításban töltött idő(milyen jó lenne szimulációban mérni a valós tartózkodást ugye? ).
(#) watt válasza Kovabe hozzászólására (») Nov 5, 2012 /
 
A PWM fizikailag kitüntetett lábra van kötve, nem tudsz választani. Kivéve, azokon a PIC-eken, ahol alternatív láb is van a CCP modulnak. Viszont ez a kiválasztást a konfigurációban kell megtenni, nem a blokkban. Bár valamit láttam a blokkban is, lehet, hogy a kijelöléskor a konfigot is átírja a fordító. Ha nincs alternatív láb, akkor fix lábak tartoznak a PWM kimenethez. Ezt az adatlapból, vagy a chip ablakból meg tudod nézni(CCP1 ill CCP2 lábakat keress).
(#) watt hozzászólása Nov 5, 2012 /
 
Hogy írjak valamit, ami jól esik a FlowCode tábornak, akik közé már én is kezdek tartozni, kijelenthető, hogy ha valaki ért a C nyelvhez is és ebben kezd programot írni, amihez általános perifériák tartoznak, jelentősen gyorsabban haladhat. Egy ültő helyemben összelógattam egy tesztpanelt, amin egy LCD(4x20), 1 gomb, két LED és egy RS232 kommunikáció van egy 18F2550-el, amit HID bootloaderrel(ez gyári microchippes) USB-n keresztül közvetlenül programozok. Sokkal több idő volt összeforrasztani, mint a poragramot összedrótozni, néhány szöveget kiíratni, elküldeni, LED-et villogtatni stb. Hasznosnak látom! Ha finoman kell hangolni, akkor a hozzáértőbbeknek nem jelenthet gondot, mert a lehetőség adott. Ha még lenne StopWath is, szavam nem lehetne! Persze ahová tényleg kell, azt valószínű nem ebben írnánk...
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 5, 2012 /
 
Minden 5. programlépés után Timer2 megszakítás történik. Ez nem jó megközelítése egy feladatnak, mert akkor minek a megszakítás? A megszakítás arra való, hogy hardvert kihasználva időt nyerjünk a főprogramnak és csak akkor foglalkozzunk az eseménnyel, ha megtörténik.
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 5, 2012 /
 
Szia! Ne haragudj meg az őszinteségemért, de én soha nem oldanám meg így a feladatot, még akkor sem, ha nincs CCP modul a PIC-ben, ami azért ritka és nyílván lehet olcsó típust találni, amiben van. Mindig a legmegfelelőbb megoldást kell használni, minden más nem helyénvaló. Szerintem...
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 5, 2012 /
 
Akkor épp itt az ideje! Melyik részét nem érted a működésének? A capture mód rajzát nézd meg az adatlapban és beszéljük át, mit hogyan csinál!
A hozzászólás módosítva: Nov 5, 2012
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 6, 2012 /
 
Ez a része is egyszerű!
A Capture mód ugye az, amikor a CCPx bemenetre érkező jel a CCPxH és CCPxL regiszterekbe beletölti a TMRyH és TMRyL regiszterek tartalmát(x=1, vagy 2 a PIC kiépítésétől függően, az y=1, vagy 3 beállítástól függően).
A 0100 módban akkor történik ez meg, ha a bemeneten a jel lefutó élű(falling edge 1->0), a 0101 módban pedig akkor ha felfutó élű(0->1). Van még két mód is, amikor nem minden egyes élváltáskor történik meg mindez, hanem minden 4. felfutó(0110) vagy minden 16. felfutó(0111) élre. Ez nagyon gyors jeleknél jól jöhet.

Ha impulzus szélességet szeretnénk mérni, akkor lehetőség van kiválasztani a 0100 vagy a 0101 mód közül azt, amelyikre szükségünk van menet közben is. Ezt a jelünk jellege határozza meg, hogy az impulzus felfutó, vagy lefutó éllel indul. Ha felfutóval, akkor 0101 móddal indítjuk a CCPx-et, majd mikor bejött a jel, átváltunk 0100-ra és közben eltároljuk a CCPxH-t és CCPxL-t, hogy a következő lefutó élnél ki tudjuk számolni a kettő különbségét.
Itt még nem említettem a megszakítást, ugyanis nem feltétlenül muszáj ezt megszakításban végezni, de nagyon ajánlatos, azaz be kell állítani a CCPx modul megszakítását és a fenti eseményeket ott lekezelni(PIE1,2 IPR1,2).

Látható, hogy a jelek megérkezéséig minden hardveresen történik. Pl. a Timer1 számlál, a program azt csinál amit akar, no problem. A bejövő él esetén belép a megszakítás lekezelésébe, eltároljuk a CCPxH&L-t, él módot váltunk és a második impulzus élkor kiszámoljuk a két érték különbségét és eltároljuk a további számításokhoz, amit jellemzően már nem a megszakításban végzünk, mert arra már van idő(kivéve esetleg a gyújtás vezérlések és egyedi gyors beavatkozást kérő események).

A Timer hozzárendelést a T3CON. bit 6 és 3, T3CCP2:T3CCP1: bitjeivel lehet megtenni. Vigyázz, nem egymás mellett lévő két bitről van szó! 01 esetén a Timer1 a CCP1-hez a Timer3 a CCP2-höz rendelődik. 00 esetén mindkettő CCP a Timer1-et használja. A beállítástól függetlenül a Timer1 és 3-at lehet másra is használni, ha a CCP1 és 2 használva van is, csak nem illik feltöltögetni kezdő értékkel őket, mert az meghamisítja a CCP kivonás értékét, viszont más ütemezésre a saját megszakításuk ütemében lehet használni.

És itt jön be a Timer túlcsordulás kérdése, miszerint ha a két impulzus között hosszabb idő telik el, mint amennyi idő alatt a Timer végigszámol, akkor ki lehet terjeszteni a mérést a Timer megszakításának számolgatásával, majd ezen érték figyelembe vételével(CCPx kivonás eredménye+megszakítás *65536). De sok esetben erre nincs szükség, csak extrém esetekben, ahol nagy felbontás mellett hosszabb jeleket kell mérni. De belátható, hogy az ilyen jelek esetén sem terhelődik a fő programszál, mert csak a Timer megszakítás jön be alkalmanként, illetve a jel váltáskor a CCPx megszakítás. A felbontás még is mikro szekundumos nagyságrendű lehet!
A hozzászólás módosítva: Nov 6, 2012
(#) kiskata válasza watt hozzászólására (») Nov 6, 2012 /
 
Srácok... Minden tiszteletem... Egyszer szeretnék eljutni a leírás megértéséig
(#) pjg válasza kiskata hozzászólására (») Nov 6, 2012 /
 
Folyamatábrán látva sokkal érthetőbb lenne.
(#) watt válasza kiskata hozzászólására (») Nov 6, 2012 /
 
Próbáljatok képekben, folyamatokban gondolkodni, ahogy ezt a Flowcode is teszi. Szerintem nem olyan bonyolult ez, csak összetett. Részeire bontva kell megérteni. (Timer beállítás a mérendő periódusidő szerint, CCP beállítás a cél szerint(élek, élek száma stb.). Utána már csak a megfelelő regisztereket és számításokat kell elvégezni, amik a négy alapművelet, ami flowcode-ban nem lehet probléma.
Ha össze tudtok dobni egy áramkört, ami impulzusmérésre van hangolva(LCD kijelzés kéne minimum), akkor szívesen segítek megírni a folyamatot. Addig nem sok értelme van, mert nem lehet szimulálni a CCP-t, anélkül még annyira sem lehetne megérteni, mint leírva. Ha lesz időm azért majd összedobok valamit...
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 6, 2012 /
 
Ez egy jó kis oldal!
A frekimérést kétféleképpen szokták megoldani egy műszeren belül is. A magas frekitartományban számlálnak, az alacsonyban periódusidőt mérnek. Igen, nem kell ilyenkor váltogatni az élt. Hogy ezt felismerted már azt mutatja, hogy érted a dolgot!
Flowcode ba úgy lehet, hogy kicsit C-zni kell a megszakítás beállításánál(egyedit kell választani). Erre példát rakott fel niedziela az előző lapon. A többihez is C-zni kell, mert a regiszterek mentését is kézzel kell csinálni a CCP blokk hiánya miatt. (nem lehet hozzáférni a PIC CCP regisztereihez az érték adás blokkokban, csak C-vel, legalább is nem tudom hogyan lehet, ha lehet). Ma délután lehet, hogy összedobok egy kis periódusidő mérőt egy 2x16-os LCD-re...
A hozzászólás módosítva: Nov 6, 2012
(#) watt válasza (Felhasználó 13571) hozzászólására (») Nov 6, 2012 /
 
Azt majd átkonfigoljátok! Lábkiosztás, freki, fordítási opciók(mert én bootloadert használok a tesztáramkörben) stb. Ezt majd megbeszéljük...
(#) Kovács Tibor hozzászólása Nov 6, 2012 /
 
Üdvözlök minden fórumozót!
Most kezdek foglalkozni a PIC programozás tanulásával. Ne kövezzetek meg, még nem olvastam végig a fórumot.
Kérdésem:A szóban forgó szoftver tud "visszafelé" dolgozni? Úgy értem hogy már működő PIC programból folyamatábrát készíteni? Csak a tanulás végett. ...kösz
(#) pjg válasza Kovács Tibor hozzászólására (») Nov 6, 2012 /
 
Nem. De jó lenne....
(#) Kovabe hozzászólása Nov 6, 2012 /
 
Sziasztok, sose adom fel. Most találtam egy programot amiböl egy részletet bemásolok, ugy látom mintha a tmr0 számlálo megeggyezne a bemeneti lábon érkezö impulzus értékével. Jól látom??
  1. COUNT:
  2.      BSF       STATUS,RP0
  3.      MOVLW     B'00110111'    ;TMR0 = EXT, 1/256
  4.      MOVWF     OPTION_REG
  5.      MOVLW     B'00010000'    ;DEFINE PORTA AS OUTPUT
  6.      MOVWF     TRISA
  7.      BCF       STATUS,RP0
  8.      BCF       PORTA,3
  9.      BCF       PORTA,2
  10.      CLRF      CNT3
  11.      CLRF      TMR0
  12.      CLRF      RTCC2
  13.      BSF       PORTA,2  ;TOGGLE TMR0 PIN
  14.      BCF       PORTA,2
  15.      MOVF      GATE,W         ;GET GATE TIME
  16.         MOVWF   COUNT1
  17.      BSF       PORTA,3  ;START COUNT
(#) watt hozzászólása Nov 6, 2012 /
 
Elakadtam! Nem tudom beletenni egy változóba egy regiszter értékét. Nevezetesen se a TMR1H és L, se a CCPR1H és L tartalma nem tölthető bele egy uint változóba. Valaki tudja hogyan kell ezt csinálni? Én így próbálom:
  1. FCV_CCP1RHL_JELENLEGI=TMR1L;

Természetesen C blokkban...
A hozzászólás módosítva: Nov 6, 2012
(#) Kovabe válasza (Felhasználó 15355) hozzászólására (») Nov 6, 2012 /
 
Csak annyi hogy rég beszélünk egy impulzus méröröl amit szeretnék megépiteni és a frekivel van problémám viszont ez egy egyszerü megoldásnak tünik a problémámra mert 1Hz töl 50MHz ig mér. Ha valoban müködö ez a feltevés amit az elöbb is irtam akkor talán egyszerübb lenne a bejövö freki mérése mint ez a felfuto lefuto él meg a többi. Föleg flowcode-ban lehetne egyszerübb mert kevesebb c kellene.
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 6, 2012 /
 
Lehet, hogy kisbetűvel kell írni? Én naggyal írom és rájöttem, hogy a regiszter címét teszi bele a változóba! Érdekes dolog, de mindegy, csak tudjam hogyan van, akkor úgy hazsnálom... Köszi próbálom!
(#) watt válasza watt hozzászólására (») Nov 6, 2012 /
 
Kicsivel írva is a regiszter címét teszi bele.
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 6, 2012 /
 
Na még is csak kicsivel kell írni! Ha nagybetűvel írom, akkor a regiszter címét fordítja be a fordító. Nem kimondottan C szabvány!
Valamint ha elírom, mint először, egy szót sem szól (trm1l-t írtam azért nem ment, de nem volt üzenet.)
Az alulvonás nem számít, az elsőt nem is én tettem bele, az FCV_-t a fordító fűzi hozzá.
Köszi a segítséget!
(#) kkrisz75 válasza watt hozzászólására (») Nov 6, 2012 /
 
Ember. Nem jó ez így... Ne csináld már itt
Nézem ezeket a sorokat és idegesít, hogy nem értem...

Az a baj nálam, ha valamit nem értek akkor azt érteni akarom, mert idegesít, hogy nem tudok valamit.

A digi óra is úgy kezdődött(azon túl, valami megoldás kellett a fordulatszám mérőre), hogy láttam egy házilag készült pic-es 7szegmenses asztali órát youtubeon (agyam kombinál), aztán olvasgattam, aztán már idegesített, hogy én miért nem tudok olyat, aztán találtam a parsicban egy frekimérőt, amivel lehetne fordulatszámot mérni, majd simpi meg elém tette a flow-t. A vége az lett ami..

ERRE:
Most meg az jutott eszembe csinálok egy led villogtatót és megpróbálom megérteni a "c" kódját, mert idegesít, hogy nem értem!
A hozzászólás módosítva: Nov 6, 2012
(#) watt válasza kkrisz75 hozzászólására (») Nov 6, 2012 /
 
Nagyon hasznos tulajdonsága az embernek a kíváncsiság, a kitartás és a törekvés a jóra. Ha van kérdésed, válaszolok, ha tudok! Mint látható, a Flowcode nem úszható meg C nélkül, ha szeretnénk használni egyedibb dolgokra is és ki szeretnénk használni a PIC lehetőségeit. Az hab a tortán, hogy nem szabványos a C, ha jól látom, de már megszoktam a sok hibrid nyelvet a PLC-k mögött...
(#) niedziela válasza watt hozzászólására (») Nov 6, 2012 /
 
Teszel fel valami példát erre a CCP-re magyarázattal ?
(#) watt válasza niedziela hozzászólására (») Nov 6, 2012 /
 
Igen, holnap délután. Ma már nem tudom megírni, megyek aludni. Jó éjt!
(#) niedziela válasza watt hozzászólására (») Nov 7, 2012 /
 
Köszi !

Nekem sikerült most jól belekeverednem, de most magamra írok egy megszakítást, és alszom egyet
(#) Gagyicom hozzászólása Nov 7, 2012 /
 
Sziasztok! Egy hete csináltam valami hasonlót, felteszem ide. Van benne más is mert teszteltem a valóságban hogy működik.

fordpwm.fcf
    
(#) watt válasza Kovabe hozzászólására (») Nov 7, 2012 /
 
Szia! Csak most reagálok, mert tegnap elszaladt a ló...
A frekit kétféleképpen lehet megmérni, periódusidő reciprokával, vagy adott időkeretbeni számlálással. A frekitől függ, hogy melyik a célravezetőbb, pontosabb. Magas frekik esetében számlálás a jó megoldás, miután pl. 50MHz periódusidejét igen nehézkesen mérnéd meg egy PIC-el, miután a leggyorsabb 18F-es is csak 12MHz-es programvégrehajtási sebességű(48MHz oscival).

A periódusidő/frekimérés és az impulzus szélesség mérése között pedig újabb eltérés van, miután az impulzus szélességénél nem figyeljük annak gyakoriságát, akár nap/impulzus is lehet. Az impulzus idejét, akármilyen gyakori is, nem lehet számlálással megmérni, csak ha az éleit detektálva megmérjük a szélességét egy belső számlálóval. Természetesen van olyan rövid impulzus, amit már nem tudunk mérni, mert ahhoz lassú a PIC. A felbontást a Timer bemeneti frekije határozza meg. Egy 18F2550 nél 20MHz kristállyal, belső 96MHz/2 beállítással ez 12MHz(Fosc/4), azaz 83nsec. Viszont a méréshez sok programlépést kell megtenni, ezért a végreredményt az fogja meghatározni, hogy a program hány lépésben tudja eltárolni, kiszámolni az értéket. Ezért nem mindegy, hogy mi mindent számolunk ki a megszakításban, mennyit tartózkodik ott a program. (Vegyük figyelembe, hogy a be és kilépéskor is számos dolgot kell eltárolni-visszatölteni, amit nem is látunk ha Flowcode, vagy C nyelven programozunk, csak akkor, ha ASM-ban nyomjuk Ezért ha a programnak más dolga nincs és kritikus rövid impulzusokat kell mérni, akkor nem is megszakításban kell figyelni a CCP1 jelét! De ez elég extrém esetben szükséges és tényleg semmi másra nem lesz jó a PIC a mérés alatt, ami gyakorlatilag egy ciklus, amiben csak a CCP1 modul megszakítási jelét detektáljuk(de nem engedjük a megszakítást!).)
Sőt, ha le akarunk menni a határokig, akkor valószínű nem is tudjuk minden egymás követő periódust, vagy impulzust megmérni, mert nincs idő kiszámolni közöttük az értékét. Ez nem gond egyébként, ha csak mérésről van szó, de sok esetben a szabályzásnál sem!
A példa program nem lesz ennyire kihegyezve!
(#) watt hozzászólása Nov 7, 2012 /
 
Sziasztok! Elkészültem.
Csatolom a programot, egy rajzot arról, ahogy nekem van bekötve a 18F2550 és egy beállítást, amit nektek kell kitörölni, ha netán benne lesz a projectben(ez nem biztos, hogy a fájlban utazik). Ez a beállítás ki van jelölve a képen. Arra szolgál, hogy eltolja a kezdőcímet, ahová a fordító teszi a program elejét. Nekem a 0x1000 címtől fordít, mert előtte egy HID bootloader van a PIC-ben az USB-n keresztüli programozáshoz. Ha valakinek van otthon 2550-e, érdemes azzal felépíteni a tesztáramkört. A bootloadert le lehet tölteni a microchiptől, de elküldöm a hexet 2550-re, mert a microchipnek csak 4550-re van készen.

Mindenkinek ki kell választani azt a PIC-et, amit használ, majd be kell konfigolni az LCD-t, gombot(2550-nél nem lehet máshol, mert a bootloader is használja!), LED-eket az általatok bekötöttek szerint. Ha ebben elakadtok, jelezzétek.
A configurációs szavakat is nektek kell beállítani a PIC-ek szerint, mert nekem az sincs beállítva, mert a bootloaderé a mérvadó. Ez végül is jól is jön ki, mert nem felejtitek benne a más fajta PIC beállításait. Ebben is segítek, ha nem boldogultok.

A Build/Project opcióknál be kell állítani a frekit, hogy a program jó baudrate-t állítson be és megfelelő freki jelenjen meg a Timerek beállításakor is.
Figyelem a soros port kimenete nem köthető így a PC-re, oda mégy egy MAX232 IC-vel illesztőt kell tenni, ha kommunikálni szeretnétek. Nem muszáj ráépíteni, de ez is érdekes lehet esetleg! Egy terminál programban lehet figyelni a gomb állapotát(pl. BrayTerminal), illetve 16 karakterig szöveget lehet küldeni a második sorba. Természetesen ti is bármilyen üzenetet elküldhettek, csak a megfelelő helyre a megfelelő blokkot kell tenni. A vételnél 16 karakterre van beállítva a megszakítás, de időtúllépésre is megszakít. Ez a 16-os LCD miatt állítottam így. Át lehet állítani, ha másra akajátok használni.

A "main"-ban az első "számítás" blokkban, ami az első elágazásban van, át kell írni a kalibrációs osztót a kiválasztott frekinek meglelelően, hogy a helyes idők jelenjenek meg. 4MHz-ig elvileg működik, de jobb ha 10MHz+PLL=40MHz, vagy 20MHz kristállyal futtatjátok.

A mérést kipróbáltam 100usec és 5450usec között mér jelenleg és csak periódusidőt, nem impulzust! A tartományon kívül zagyvaságokat mutat. A Timer1 túlcsordulásait akkor fogom lekezelni, ha valaki megépíti a tesztáramkört, vagy periódus+impulzusmérőt. Frekit így 10..20KHz-ig lehet mérni, én 10KHz-nél többet nem tudtam most kelteni itt az asztalon, de valószínű 50usec-ig lemegy minden gond nélkül. A frekiméréshez a mért idő reciprokát kell venni és azt kijelezni, de ezt ti is meg tudjátok már csinálni, csak mielőtt módosítotok, értsétek meg a program felépítését, és azt, hogy miért ilyen amilyen!

Ha valami nem világos kérdezzetek!
Sok sikert!
(#) watt válasza (Felhasználó 15355) hozzászólására (») Nov 7, 2012 /
 
Igen, és a hozzá tartozó változók is.
Következő: »»   81 / 360
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