Fórum témák
» Több friss téma |
Sziasztok!
Nem találtam ilyen témát,ha van töröljetek. Nightpic basic ben irtam egy programot,(16F877)ami 4 A/D-t olvas és kiirja egy 2X20-as LCD-re Voltban. A gondom a következő:az A/D 0,6V alatt nem lát semmit mert a lábakon van dióda,tehát csak ez fölött olvas be értéket. Próbáltam óvatosan -ref-et adni,de nem segitett. A felbontást 10 bitesre állitottam, igy "0" és 5V között a felbontást 0,005-re tudja kiirni, amit elég görcsösen sikerült meg oldani. Használ-e valaki Nightpic-et és hogy oldjátok meg a REF-et
Szia! Nekem nem egyértelmű a kérdés, pontosabban miben kérsz segítséget ? A basic programozásban vagy a hardver kiépítésben.
Egy kicsit egyértelműbben teszed fel a kérdést szivesen segítek ! üdv.
Rajzold le a kapcsolást...a diódáknak általában az a feladatuk, hogy a bemenetet a testnél negatívabb, illetve a pozitív tápnál nagyobb feszültségektől védje.
Csatlakozom az előttem szólóhoz!
Idézet: „A gondom a következő:az A/D 0,6V alatt nem lát semmit mert a lábakon van dióda,tehát csak ez fölött olvas be értéket.” Milyen dióda? és holvan? Jól néznénk ki, ha ez így lenne. 10bites felbontás, meg egy dióda? Hát ez nem lehet. A PIC referenciája, lehet a Vdd-Vss (5V), vagy az AN3-Vss, vagy az AN2-AN3 lábra adott referencia. Az A/D mindig a két referencia közötti pontot bontja fel 10bitre. Persze a referencia nem lehet akármekkora értékű (adatlap) Ha pontosabb referenciát akarsz használni, ajánlom a TL431-et, az 2,5V. Én használtam (van) a progit, de az AD-t ASM rutinnal kazeltem. Elég kevés ismeret van a Vörös úr progijához. Ha konkrét kérdésed lesz, akkor esetleg megnézem vele. üdv! proli007
Gyorsak vagytok!
Konkrétan arról van szó,hogy az analóg bemenetre kö- töttem egy potit,meg persze egy műszert.A poti osztóként volt kötve VDD-VSS közé és a középső láb a bemenetre.Nagyon finoman 0-ról felfelé tekerve akkor mutatott a kijelzőn 0,001-et amikor a műszer 0,6V-ot.Egyébként a diófát csak azért emlitettem mert a 877-es gépkönyv 141.-ik oldalán a bemenet igy is van lerajzolva, mármint a bemenetten egy-egy dióda van kötve a földre és a tápra is. Amúgy jól műxik csak ez a bajom vele. A programmal nincs bajom,kivéve azt ,hogy Vörös úr 3-4 hete meg igérte,hogy leirja a deklarációkat,de persze nem tette meg.Azóta amire szükségem volt megoldottam. A hardver egy próbapanel, amit én csináltam,az jól műxik. Ja próbáltam a külső ref-et is AN3-AN2 ,de ezen ez nem segitett.
Szia!
Emlékeim szerint a PIC AD-ja alapból 10 bites, csak Tőled függ, hogyan olvasod ki az infót! Nem lehet, hogy rossz regisztert olvasol (az adat 2 regiszterben van, balra, vagy jobbra igazítva a beállítástól függően!).? Először az eredményedet jelezd ki LED soron, hogy biztosan jó legyen az AD, mert lehet, hogy a kiírásnál rontod el! Jó munkát! Steve
Remélem sikerül bemásolni az A-port lábának kapcs.raj-
zát(dióda) és a nonlinearitást mutató görbe sereget, amelyen látszik,hogy egy görbe sem éri el a 0-át. Hogy mértek meg pl. 0,3V-ot?
A nonlinearitás az nem azt jelenti, hogy nem tudsz mérni egy bizonyos tartomány alatt, hanem azt hogy míg 0.1 volt 100 egység, addig 0.2 volt nem 200 hanem 205. Ezt lehet megtudni a görbéből.
Az ábrából látszik, hogy 5 V-nál kb. 0,5 LSB lehet a hiba ( azt jelenti, hogy a tényleges érték és a mért érték között max. ennyi lehet a hiba!).
Ha 10 bites felbontást használsz --> 1024 lépcső --> 5 V / 1024 ~ 5mV egy lépcső. Ennek a fele lehet a hiba, tehát pl. 300 mV: 300mV / 5 V *1024 --> 61,44 +/- 0,5 --> lehet, hogy 60 vagy 62- ess kódot ad vissza. Szerintem ez a pontosság általában megfelelő, hacsak nem valami precíziós eszközt készítesz!
Az addig kerek, hogy a rajz az analóg vonalra mutat egy diódát, de ez belül van, a prociban. Kívülről a szaggatottal bekeretezett rész csatlakozik, vagyis a forrás, és a soros impedancia, amit max. 10 kOhm-ra jelöl az adatlap, a valóságban inkább kisebb szokott lenni (2.2 ... 3.3 kOhm értékekkel szépen szalad). Előfordulhat, hogy túl nagyértékű potit tettél a bemenetre.
A két rajzi dióda épp záróirányban van bekötve, a védelmen kívül egyéb szerepe nincs. A bemenetre esetleg egy Zener-diódát szoktak kötni, értelemszerűen záróirányban, hogy a maximális bemenőfeszültséget korlátozza. Mivel a PIC az analóg értéket a Vref-, Vref+ közti tartományban értelmezi, ahol Vref+ - Vref- minimum 2V (a pontosság tartásához), továbbá a referenciák programból konfigurálhatók, pontosabb segítséghez a bemeneti ellenállás, valamint az AD programbeli konfigurációja sem ártana.
Köszönet a válaszokért!
Az adatlapban nem találtam meg a külső +és - REF határadatait,lehet nem voltam elég türelmes. Tehát ha jól értem,akkor ha a+ref 2.5V a -REF GND akkor 0-2.5V között a felbontás 1024. ami azt is jekenti,hogy a küső osztónak 2.5V az-az a +REF-re kell osztania? device 16f877 config LVP_OFF, BODEN_ON, PWRTE_ON, DEBUG_Off, WDT_OFF, XT_OSC dim a,b,c,d,e as byte dim y,x as word declare xt_osc4 declare LCD_TYPE 0 declare LCD_DTPIN PORTb.4 declare LCD_ENPIN PORTb.0 declare LCD_RSPIN PORTb.1 declare LCD_INTERFACE 4 declare LCD_LINES 2 cls cursor 1,1:print "C1 0,000V" cursor 1,11:print "C2 0,000V" cursor 2,1:print "C3 0,000V" cursor 2,11:print "C4 0,000V" ADCON1=%10000001 start: ADCON1=%10000001 ADCON0=%01000001 gosub get1 delayms 10 ADCON1=%10000001 ADCON0=%01001001 gosub get2 delayms 10 ADCON1=%10000001 ADCON0=%01010001 gosub get3 delayms 10 ADCON1=%10000001 ADCON0=%01100001 gosub get4 delayms 10 goto start dat: ADCON0.2=1 ADCON0.0=1 delayus 50 ADCON0.0=0 return get1: gosub dat x=(ADRESL+(ADRESH*256))*(100/20) a=dig x,0 b=dig x,1 c=dig x,2 d=dig x,3 cursor 1,4:print dec d cursor 1,5:print "," cursor 1,6:print dec c cursor 1,7:print dec b cursor 1,8:print dec a cursor 1,9:print "V" return get2: gosub dat x=(ADRESL+(ADRESH*256))*(100/20) a=dig x,0 b=dig x,1 c=dig x,2 d=dig x,3 cursor 1,14:print dec d cursor 1,15:print "," cursor 1,16:print dec c cursor 1,17:print dec b cursor 1,18:print dec a cursor 1,19:print "V" return get3: gosub dat x=(ADRESL+(ADRESH*256))*(100/20) a=dig x,0 b=dig x,1 c=dig x,2 d=dig x,3 cursor 2,4:print dec d cursor 2,5:print "," cursor 2,6:print dec c cursor 2,7:print dec b cursor 2,8:print dec a cursor 2,9:print "V" return get4: gosub dat x=(ADRESL+(ADRESH*256))*(100/20) a=dig x,0 b=dig x,1 c=dig x,2 d=dig x,3 cursor 2,14:print dec d cursor 2,15:print "," cursor 2,16:print dec c cursor 2,17:print dec b cursor 2,18:print dec a cursor 2,19:print "V" return Nem irtam még rá megszakitást,igy eléggé pattog a kijelző,csak ki akartam próbálni az A/D-t. Egyébként tőltőben gondoltam felhasználni,ceruza aksikhoz. Kérnék infót a referenciák programozásáról,ha lehet. Sziasztok!
A progi szerint a pozitív referenciád az RA3, a negatív a GND (Vss). Ha az RA3-ra 5V-ot kapcsolsz, akkor a 0 ... 5V-os tartományt osztja 1024 részre, ha 2.5V-ot adsz neki, akkor pedig azt. A referenciák kiválaztását az ADCON1 regiszter PCFG3...PCFG0 bitjei határozzák meg, adatlapban megtalálod.
Viszont, nekem nem tetszik a mintavétel menete: bekapcsolod az AD-modult, beállítod a GO bitet, majd időzítve kikapcsolod az AD-t. Ezt úgy szokás, hogy AD be, GO be, aztán vagy interrupt-on át (ADIE=1 esetén ADIF okozza) figyelik a GO bitet, vagy pedig pollingozzák; a konverzió akkor ért véget, ha a GO bit törlődik, ezt az AD-modul intézi. Lehet, hogy félbeszakítod, ha te modult kapcsolgatsz közben.
Szia!
- Teljesen feleslegesen cseszegeted az AD-t. - Az AD-t nem kell ki-be kapcsolgatni. Amikor mérsz előtte bekapcsolod, majd amikor az egésszel végeztél, kikapcsolhatod, de ez is csak telepspórolás miatt kell. - Ha az ADCON1-et a start előtt beállítottad, azt nem kell újraírogatni. Minek? Közben változott valami? - Viszont, ha csatornát váltasz az ADCON0 5:3-al, azután várni kell, 50usec időt, az adatgyűjtésre (fel kell, hogy töltődjenek a belső és szórt kondik az új értékre, tipikus idő 40usec, de számítani kell) - Ezután be kell állítani a GO bitet. - Várakorni, míg a GO alacsony szintű nem lesz. Ez az AD "end conversio" jelzése!!! Ezt lehet megzakításból várni, vagy pooling-al (ahogy Kobold is írta) - Most kell kiolvasni az új értéket. - Jöhet a következő csatorna jele. (MPX : ADCON0 5:3) A DS30292C doksi 11. fejezetében (113.oldal) pontról-pontra le van írva, hogyan kell a konverziót végrehajtani. Ezt kövesd! ui. Az A portát, annak ellenére, hogy a Reset beállítja, illik bemnetként deklarálni. Ha nem a bitszámokat írnád, hanem a SFR bitjeinek nevét, sokkal olvashatóbb lenne, még számodra is a program. Az AD/ referencia feszültség bementeinek,bele kell férni a tápfeszbe, de a ref- és ref- közötti érték minimuma 2V. Kobold! Elnézted, nem kikapcsolja az AD-t, hanem újra be, csak feleslegesen. üdv! proli007
Szia kobold!
Tök igazad van a mintavétellel kapcsolatban, nem akartam görcsölni az óra modullal,a pollingozás az gyorsan ment volna,de csupán látni akartam az A/D-t működni+LCD modul kiirás,mert az igazság az ,hogy ez a harmadik progi amit karcoltam 16F877-be. Előtte egy órát csináltam, meg persze sok futófényt. Egyébként az ADCON1-et amint látod használom, és a konverziónak is le kell futnia,mert a két adatregiszter a kölön számolgatás nélkül kiirta a 1023-at +5V-nál. A bemeneten (AN0) egy 5,1 K-os poti van,a többi 3 használt bemenetre kötöttem 1-1 ceruza akkut. A +REF-el be lehetett állitani a pontos értéket. A többi modulját a 877-nek majd csak ez után fogom megismerni(ha igaz)
Hm... Minden feldolgozó (get) rutin a gosub dat hívással kezdődik; ott meg BSF ADCON0, GO; BSF ADCON0, ADON; delay 50usec; BCF ADCON0, ADON utasítások hajtódnak végre, szerintem. Az első hívásnál valóban csak újra bekapcsolja az ADON-t, de utána már mindig ki-be.
Én erre csak annyit mondanék, hogy akár kiírta az 1023-at 5V mellett, akár nem, ha az áramkör nem a várt eredményt hozza, akkor az a minimum, hogy követjük az adatlap meg a segédletek ajánlásait...
A Proli007 által írt DS-t feltétlenül nézd meg, és szerintem kicsit gondold át a progidat. Végül is egy polling vagy interrupt megírása nem a világvége, pár perc pluszmunkáért lehet, hogy hibátlan eszközöd lesz.
Progi javítva!
No kapcs össze-vissza,pollingozok,a bitek nevét még nem dakaráltam,de még hosszú a nap. Köszi a kritikákat,tanulok belőlük,de csak eddig jutottam 2 hét alatt.
Köszönet midenkinek a segítségért és a kritikáért is .
No kapcsi össze-vissza,pollenezek,a vezérlő biteket deklarálni fogom igérem . Az eredmény: 0V-nál mind a 4 csatorna 1-2 között ugrizik, az LCD-n a kijezés nyugodtabb,viszont nem pontos a képletem ezen még dolgoznom kell,ettől függetlenűl Qvára örülök Az integert hiányolom,de majd megoldom vhogy. Én nyertem volna az 5-öst most kapnátok 3-3 vödör PIC-et . Majd még jövök.
Na! most próbálok harmadszor irni,nem jelenik meg!
Köszönöm a tanácsokat és a kritikákat is,tekintve,hogy ez a 3. ik prg-m 877-re nem volt olyan xar. No nincs ki-be kapcsi,kezelem a GO bitet,már majdnem jó! .Most 0V-nál 0-át ir ki a 4 csatorna azLCD-re,bár nem pontos a képletem(nemtom ez milyen basic nem tud bármivel bármit osztani)! Deklarálom a biteket is igérem,de vége a napnak Köszi mindenkinek maj' még jövök! most meg látomamit előzőleg irtam,na mindegy. Cső!
Bocs, teljesen igazad van!
Ezek szerint, csak odáig jutottam el, hogy bekapcsolja, és vár 50mikrót. Amúgy az ASM-e sokkal jobban ráál a kezem. Meg attól, hogy nem a bit neveket írják, hanem a bitszámokat, mindig "berágok". Más gondolkodásmódját, egyébként is nehéz átvenni, és akkor még nehezítve van azzal, hogy előkell vennem az adatlapot, hogy megnézzem a biteket. Amúgy ha egy-két szavas megjegyzést is hozzáfűznének a programsorhoz-rutinhoz (hogy mi a cél vele), akkor mindenki sok hibát deríthetne fel vele saját maga is. Hát ezt csak úgy magam elé mondtam. üdv! proli007
Sziasztok!
Egy konkrét NIGHTPIC-es kérdésem van képlettel kapcsolatban. Van egy A/D-re kötött poti 0-5V között ami 0-1023 között ad ki kódot.Ebből akarom a PWM kitöltési tényezőjét 1-99% között változtatni,és ezt kiiratni kijelzőre. Ami egyszer 1023/255=4.011 és 1023/99=10.33 lenne én konkrétan ezt irtam: X=(ADRESL+(ADRESH*256))/4,011 Az x-et irnám be a CCPR1L-be Aképletet a forditó elfogadja,de nem ezt hajtja végre Segitsetek légyszi! Üdv
Sosem láttam még Nightpic felületet, de csak van benne debug mód, és lépésenként meg lehetne nézni, mi van a változókban...
Nem lehet, hogy a számítást még megcsinálja, de lebegőpontos a végeredmény, nincs automatikus konverzió a CCPR1L-be íráskor (aminek a tartalma meg ugye csak egész szám lehet), és ezért nem csinálja meg? proli007: a múltkor csak magamban adtam neked igazat, az asm használatával kapcsolatban, és lám... akármilyen nyelven utasítjuk, a procinak úgyis asm lesz, csak valami magasszintű nyelvnél ezt már elrejtik előlünk, így olykor fogalmunk sincs, miért nem megy
A PIC Simulátor IDE-t használom,van benne lépésenkénti végrehajtás,abban meg tudom nézni
(fél nap lessz) Ezek szerint nem a képlet rossz.
Nem mondtam, hogy a képlet jó...
Miért fél nap? Elsőnek ez a sor kell: X=(ADRESL+(ADRESH*256))/4,011 Tegyél a sorra egy töréspontot, futtasd a progit, nem tarthat sokáig, mire becsapódik oda a végrehajtás. Onnan kell csak lépegetni. Végrehajtás előtt az ADRESH, ADRESL értéke, végrehajtás után az X. Utána abból a sorból, ahol a CCPR1L-nek értéket adsz, kell a regiszter értéke a végrehajtás előtt, illetve után. Ne mondd, hogy ez fél nap...
Sziasztok!
Kivételesen NightPic programnál, van egy kis kerülőút. Ez a progi, kompiler. Tehát először ASM-re fordítja a programot, csak azt nem látni. Viszont, az Mpaswin-t használja fordítóként. (Van is baj az opciózással, ha jól emlékszem) Az Mpaswin fordító, ott van a könyvtárában valahol. Nos, ha ezt a programot szépen előbb átnevezed, (mondjuk a kiterjesztését) akkor fordításkor a NigthPic nem találja, és hibával leáll. Persze ez, úgy mint a hibaüzenet nem látszik. De ha ikonra becsukod ilyenkor a szerkesztő ablakát, akkor ott a hibaüzenet. Most ezt az üzenetet, nem szabad okézni, viszont az intézővel, most megtalálod a soronként fordított programot. Így meg lehet nézni, és akár el is menteni, amit fordított. Nem véletlen, hogy az ablakot nem lehet méretezni! (A progi eleje, a lapozásokk miatt tele van "szeméttel" azzal nem kell foglalkozni, viszont basic soronként ott van a fordítás. Előbb próbáld ki.) Aztán ha bezárod a hibaüzenetet akkor törli az ASM programot. Ezt persze akkor is megteszi, ha kész a HEX-re fordítás. A PWM-el nem érdemes annyit vacakolni. A potit, úgy sem tudod 1/1024 pontosan állítani. Ha az AD-t ballra igazítod, akkor a ADRESH-ban ott a 8bites adat, és ezt bevágod a CCPR1L-be, már kint is van a PWM jel. A potit, így is 256 állapotban tudod beolvasni. Remélem nem írtam marhaságokat! (rég volt) üdv! proli007
Nos az előbbi képlet-gondot megoldottam:
x=(ADRESH*100)/257 erre 0-99 között ir ki az LCD Viszont ahogy tanulom új gondok merülnek fel: declare LCD_TYPE 0 ; alfanumerikus lcd declare LCD_DTPIN PORTb.4 ; LCD adat portb-n 4,5,6,7 declare LCD_ENPIN PORTb.0 ; E=portb.0 declare LCD_RSPIN PORTb.1 ;RS=portb.1 declare LCD_INTERFACE 4 ;4 bites interface declare LCD_LINES 2; 2 soros LCD cls NIGHTPIC-éknél ez az LCD konfigja,idáig jól is működött csak ebből nem lehet tudni milyen időzitéseket használ. Az R/W-t nem használja csak kivár valamennyit. Ez 4.0 Mhz-ig jól működött,de 20 Mhz-nél már nincs ideje kiirni normálisan semmit. Van ötlete valakinek mi a megoldás? Köszi! Sziasztok!
a. Keress a progi header, include vagy hasonló állományai között olyat, ami az LCD-re vonatkozik, böngészd át, hátha van valami ilyen deklaráció valahol, esetleg a program beállításai, opciói között is lehet kijelzős rész
b. Írd át a programodat assembly kódba, és rögtön te döntöd el az időzítést c. Tedd vissza a 4 MHz-es kvarcot
Eltűnt a kasszából tízezer forint! Mit tegyek Rabbi?
Tedd vissza fiam! Hát igen! Amióta a Basic-et ismerem (C64) azonos problémával küzd. Először az ember örül, hogy "print" és már kész is a program. Aztán azzal harcol, hogy miért így teszi, miért nem úgy... aztán, a basic-ben kerülgeti meg a problémákat, hogy mégis úgy működjön, ahogy szeretné. Erre a program már hosszabb és szövevényesebb, mint előtte. A végén elvész az a tíz soros értelmes rész, ami a közvetlen feladat megoldására kell. Nos a NigtPic is teljesen hasonló felépítés és ez természetes is. Modulokkal dolgozik, és ha valamire hivatkozol, akkor azt beépíti. Persze ezek univerzálisak, tehát kapásból nem minden paraméterére van szükség, amire meg igen az nem módosítható. A közös ezekben, hogy nem igen publikálják a működéseket és a határokat. Ráadásul meglehetősen erőforrás igényesek. Szóval ilyen progikat alkalmazni, csak megkötöttségek elfogadásával lehetséges. Amikor az ember ASM-et ír, akkor ott a leg „gépközelibb" megoldásokat keresi. Hozzá illeszti a memória szükségletet a tényleges és minimális igényeihez. Hozzá illeszti a mért értékeket, tárolt mennyiségeket a kettes számrendszer adottságaihoz. Ezzel rengeteg felesleges számítást tud megspórolni. Ha a Basic programot írjuk, akkor is érdemes megfontolni ezeket a dolgokat. Ha megnézed a fordítást, láthatod az eredményen. Ha például 4-elosztunk valamit, akkor az csak eltolja jobbra kétszer a számot, és nem kell a matematikai algoritmust használnia. Ettől persze szerencsés esetben, sokkal gyorsabb is lesz, a program. Néha érdemes "csalni" egy kicsit. Ha azt akarod kiírni, hogy 0..99, akkor lehet azt limitálni. (if x>99 then x=99) Ezt a progi kb. 3 sorban lerendezi és az 1% hibát, a kutya nem veszi észre, mert a potidnak az elején és végén, van bevezető sáv, ahol a karakterisztika, minden csak nem lineáris. Persze ez csak egy buta példa, csak a gondolkodásmódot szerettem volna bemutatni vele. A hálón, rengeteg ASM mintaprogram, math modul meg miegymás van. Érdemes ezek működését átnézni, kipróbálni és módosítani szükségleteink szerint. Aztán egy laza mozdulattal, beillesztjük a Basic-be, mint ASM modult. Ami jó, hogy ezeket a megírt "függvényeket" már ugyan olyan egyszerűen hívhatjuk meg, mint a Basic utasításokat. LCD esetében is meg lehet ezt tenni. Amúgy, az LCD kezelésénél, a WR jelet ha nem akarsz visszaolvasni belőle, nem szükséges kezelni. Viszont így a bizi ellenőrzését, figyelmen kívül hagyják, és inkább megvárják a végrehajtási időt. Az eredmény, a programodban látható. üdv! proli007 |
Bejelentkezés
Hirdetés |