Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Én külön óra IC-t használok.
De itt a kérdés nem még egy kristály, vagy külön óra IC felhasználásáról szólt. Egyébként valóban nem nagyon lehet pontos órát készíteni a fő oszcikkal, mert más megszakítások bekavarhatnak és a telibetalálás is kétséges. Én már ezen rég túl vagyok, de játéknak, gyakorlásnak nagyon jó egy ilyen elkészítése. Ha végképp nem megy a pontosítás, akkor még mindig van más lehetősége.
Na, latom, mit szeretnel.
Ez esetben szerintem a leggyorsabb, ha elmented az AD ertekeit egy-egy memoriaregiszterbe. Megnezed, hogy mekkora az osztas. Mondjuk 10 bit eseten 1024 a max. Ez azt jelenti, hogy kb 102 osztas egy 'egyseg'. Vagy ha 0-10 kozott akarod, akkor 1024/11 Nullazol egy szamlalot. kivono: A memoriaregiszterek ertekebol kivonod az egyseget. Megnezed, van-e alulcsordulas. Ha nincs, noveled a szamlalodat es goto kivono. Ha van, kiiratod a szamlalodat. Kesz. AD eseten okos dolog mondjuk 64x mintavetelezni, ezeket osszeadni es leshiftelni 6-tal. Akkor turheto atlagot kapsz. A potmeterek nem valami pontosak, siman ugral jopar bitet ide-oda.
Azért nem lehet 15A0, mert a Timer ki van kapcsolva néhány utasítás idejéig, ettől mindenképpen nagyobbnak kell lennie. A szimulátor szerint 15B0-nál jött ki a pontosan 5ms-os megszakítás. Viszont az csak most jutott eszembe, hogy mivan, ha az if sor feltétele igaz, és nem azonos idő alatt jut át a kódon (és nem azonos alatt fog, mert a BFTSC utasítás két vagy három ciklust igényel). Ki kell kisérletezni, akár egy else ág és 1-2 Nop() beszúrásával, hogy a feltétel teljesülésétől függetlenül azonos idő alatt jusson el a Timer leállításától az elindításáig. Én sajnos csak csütörtökön birok ismét próbálni, de más is kisérletezhet, a kód már majdnem készen van.
Akkor előlről:
Egy változó, 0 - 2 V DC feszültség arányértékét kellene kiiratnom az LCD re ---> "0 V DC" = 0 ; "2 V DC" = 10 PIC 16F690 et használok, a poti az RA0 lábon van, és jelenleg a tápfesz a referencia. Közben sikerült életet lehelni a kódba, újra működik.
A mintavételezés 64 re van állítva. Lehet hogy rájöttem a hibnára...? Én csak az ADRESH val foglalkoztam, ami csak 8 bit. A többi az ADRESL ben van....
Én úgy vettem észre, hogy gyengus kolléga nem tesz semmi mást a magas szintű megszakításban a TMR0 figyelésén kívül. Ezért egyszerűbb lenne, ha csupán hozzáadná a KOMPENZALAS értékét a TMR0-hoz(rászámítva azt a 2 utasítás ciklust, ameddig a timer nem működik írás után), és kész. Ebben az esetben ugyanis lehetetlen, hogy túlcsorduljon a TMR0L, hisz a megszakítástól mindössze az a néhány utasítás ciklusnyi idő telt el, ami alatt ide jutott. A helyzet más volna, ha például itt a magas megszakítás rutinban mást is figyelne, és "if (INTCONbits.TMR0IF)" nem teljesülése esetén, arra ugorna, ott elidőzne, és közben csordulna túl a timer0.
Hali!
Ez ugye 32,768MHz-s? Számolgattam a frekit, tényleg egyszerűbbnek tűnik, viszont a korrigálásokat nem hiszem, h megúsznám. Pl, ha nem a változó növelése a megszakításkezelő első utasítása, márpedig az első 1 if, h milyen megszakítás következett be. potyo: sajna nem tom, mennyi idő alatt szedte össze, de majd vhogy megfigyelem egyelőre 5536-ra állítottam, így kerek 200 jön ki osztónak most látom, szabi_o is az 5536-ra (15A0) szavaz ![]() én nem állítottam be másik megszakítást watt: kínomban már nézegettem az óra ic-ket, elsősorban I2C-set szerettem volna, de még az I2C-s kommunikációt se sikerült összehoznom
Na megépítettem a pongos áramkört, legnagyobb megdöbbenésemre valóban jött ki videójel és az ami a leírésban volt, gyorsan rádugtam egy joy-t, és persze nem ment, sőtt azóta el sem indul.
Mivel sem a shematic-on sem a nyákon(ott még a beültetés sincs rajta, aztán találd ki, milyen átkötés honnan hova megy, szóval az használhatatlan) nincs feltüntetve a joy lábkiosztása, úgyhogy sacc per kb. raktam fel őket (mondjuk eagleval megcsináltam a shematicot, és utána a nyákot). Szóval, lehet, hogy joy rángatással ezt azt összekötöttem, de 102 forintér megvettem az elkókat meg a tranyót (ezek lehetnek érzékenyek, mert a többi az sima kerámia kondi, meg ellenállás), illetve Pic16f84 meg van otthon még vagy 3, úgyhogy lehet kísérletezni, de egyébként nagyon állat!!! Idézet: „Ez ugye 32,768MHz-s?” Nem! Ez KHz! Órakvarcnak is szokták hívni, mert pont 1Hz kihozható vele bináris egész osztással.
Szerintem az egy kapcsolós joy, nem PC-s. Te milyet próbáltál rádugni?
És egyébként működik a dolog? Úgy értem jön megy pattog a labda csak beleütni nem tudsz? Vagy áll az egész és csak valami kép hang van...?
Nem vagyok csirke, persze hogy commodore joy-t tettem rá, és a bevezetőképen kéne választani hogy human vs human human vs computer vagy computer vs computer játszik e csak ugye itt megakadt a projekt, de most találtam egy ilyet:
http://www.rickard.gunee.com/projects/video/pic/pong.php nézzétek meg, végre normális rajz, meg talán még bekötés is, és van tetris is, meg képek, meg minden. Bilit vegyétek elő, mert be fogtok pisilni a gyönyörtől.
Watt Mester ! Az lenne a kérdésem hogyan tudom két regiszter értékét valahogy összeilleszteni helyiérték helyesen hogy aztán tovább tudjam osztani? Az ADC 10 bites és két regiszterben (ADRESL / ADRESH ) helyezkedik el. Most éppen "bbalazs" instrukciói alapján próbálgatom összehozni a kütyümet, de itt megint megakadtam...
Mit rontottam el?Feltettem minden programot ami csak a PIC programozásához kell (XP driver-t is),jól megépítettem a programozót (ezen az oldalon találtam a kapcs.rajzot és másnak működött) mégsem tudtam a PIC-et programozni. Ezután egy leddel megnéztem,hogy a párhuzamos port melyik kivezetéséről jön adat és a gépem, se órajelet, se datát nem küldött.Ez mitől lehet?Előre is köszi a segítséget.
![]()
Az adresh-t shifteled lefele carry nelkul, az adresl-t pedig carryvel vagy a carryt torlod es mindkettot carryvel. A sorrend fontos (highl, low).
Akkor osszesen egy byte-od lesz kopptol koppig. Ebbol meghatarozod a tartomanyt, ami neked kell, kivalasztod a lepeskozt (egyseget) aztan ahogy mar irtam. A 64 az nem az a 64, amire gondolsz. Hanem vegigcsinalsz (mondjuk) 64 teljes AD merest, az eredmenyeket osszeadod es utana elosztod 64-el. A binarisan kerek ertek itt azert elony, mert csak lefele kell shiftelned. Persze ez lehet tobb vagy kevesebb is, mondjuk 16 mar jo erteket adhat. A kvarc termeszetesen kHz-ben ertendo, ez is binarisan kerek. A megszakitas ideje tokmindegy, mert a kovetkezo automatikusan fix ido utan jon, fuggetlenul a kod hosszatol (jo, azert akarmilyen hosszu nem lehet ![]() Nem tudom, hogy a 16F-es sorozatban van-e ilyen masodlagos kvarc lehetoseg...
Ezek a dolgok annyira gyorsak, hogy LED-del elegge nehezen lehet latni. Talan koromsotetben 5 perc szempihentetes utan lathatsz villanast vagy valamit.
Bootolj be dos-bol valami floppyrol vagy a w98 alol. Ird be: debug Aztan: O 0378 ff Ezek utan a D0-D7 labakon 4.7V vagy folotte kell tudni merni. (illetve a led folyamatosan eg) O 0378 00 Ezek utan a labak ismet visszaallnak 0V korulre. (ledek elalszanak) Ha ez megvan, a hardver PC feloli resze valoszinuleg jo.
Hogy is van ez? A shiftelést milyen utasítással tudom elvégezni az RLF / RRF el? És ezt a Carryz sem igazán értem... A status regiszter 0 bitjét töröljem? Bocsi hogy ilyen láma kérdéseket teszek fel, de egyre inkább belezavarodom a próbálkozásokba.
Azt hiszem olvasgatnom kell még némi irodalmat a témában hogy ezt megértsem és átlássam. Akkor talán nem kérdezek hülyeségeket.
![]()
Az icd2-es programozókról készült képeken mindig két PIC van (a nyákra ültetve).Ez miért van?
Nem hulyeseg. Csak igy lehet megerteni, hogy probalkozol, szenvedsz, tevedsz-kijavitod.
A carry bit a status valahanyadik bitje (fejbol nem tudom, valszeg tenyleg a 0.) Mondjuk en assembly miatt csinaltam makrot, amiben a clc a bcf status,0 stc meg a bsf status,0 De termeszetesen barminek lehet nevezni. A shifteles meg az, amikor a biteket tologatod/forgatod a byte-on belul. Mondjuk egy negyes szorzas ugy mukodik, hogy eloszor carryt torol, aztan balra rotalod az also byte-ot, (ilyenkor a legfelso kieso bit a carryba kerul), aztan a felso byte-ot, aminek a legalso bitjebe a carry elobbi tartalma kerul ezzel kettovel szoroztal, aztan az egeszet meg egyszer elolrol. Osztas forditott iranyba es forditott sorrendben (eloszor felso byte, aztan also byte). Ha mondjuk 32 bites szamokkal dolgozol, akkor mind a negy byte-on egymas utan el kell ezeket vegezni, negyes szorzaskor pedig eloszor vegigmesz a soron, aztan meg egyszer vegigmesz... De tenyleg, az adatlapjat megeri tanulmanyozni, vagy meg inkabb kommentezett peldaprogramokat, van beloluk dogivel, sokat lehet tanulni beloluk.
Azok az ICD2 alkatrészei, nem a programozandó PIC-ek!
Kezdem (?) érteni.. Ezt a CARRY t csak ilyenkor, tehát bitforgatáskor (? hallottam róla..) használják? Ha jól értelmezem akkor ez úgy működik hogy ha az adat nem fér el 8 biten akkor a kilencedik bit kerül a CARRY be? Vagy rosszul értem? És mi van ha még egyszer rotálom azt a bájtot, akkor az eddig CARRY ben lévő bit elvész? És mi a Digit Carry?
Köszi a fejtágítót egyébként, sokat segítesz vele..
A CLC és az STC milyen utasítások? ezeket nem találom sehol, legalábbis ezek között
Idézet: „Mondjuk en assembly miatt csinaltam makrot, amiben a clc a bcf status,0 stc meg a bsf status,0” Sk. utasítás. Mondjuk spec. beépített MPASM utasítás a CLRC és a SETC, így nem kell rá makrót írni. Ja, hogy egy-egy karakterrel hosszabbak... :nemtudom:
bbalazs nagyon vágja, láthatod, csak győzd megérteni!
![]() Próbálom mesélősebben: A kérdésedre válaszolva, nyílván egy 10bites regisztert nem lehet egy bájton ábrázolni, bármit is trükközöl, ezért két bájton kell. Azt ugye tudod, hogy az ADCON1/ADFM-t be kell állítani, hogy jobbra, vagy balra sorakoztassa a biteket a ADRESH és ADRESL regiszterekben. Ha összeadogatni, majd osztani akarod(16* pl, ahogy bbalazs írta) a mért értékeket, akkor jobbra éredemes záratni. Így az érték az ADRESL low bitjétől indul balra szépen a helyiértékeken, "normális" 10bites bináris számot adva a két bájton. Deklarálsz két bájtot (8bites regisztert), ami kezdéskor 0. Ehhez adogatod az AD regisztereinek tartalmát mondjuk 16-szor megismételve, mielőtt kiértékeled. Ezt úgy tudod, hogy először a low bájtot adod hozzá és ha túlcsordult, akkor a felső bájtot még növelned kell egyel. Nem kell félned hogy a második bájt is túlcsordul, mert a 10 bit 1024*16 az 16384 ami belefér. Csak a low bájtot kell ellenőrizni ez ügyben. Ha megvana 16 minta, akkor átlagolod, -> elosztod 16-al, -> elshifteled jobbra az egészet. Ezt is egyenként kell, de ahogy bbalazs írta, a High bájttal kell kezdeni, és ha keletkezik átvitel(C=1), akkor azt bele kell léptetni az low bájtba. Ez amúgy magától megtörténik ,ha egymás után RRF-ezel, nézd meg az utasítás rajzait az adatlapban! Az alsó bájttal nem kell foglalkozni ami kilép, de a felső bájt shiftelése előtt töröld a C-t, nehogy egy szemét belekerüljön balról! Ha kész a 4 jobbra shift, akkor elosztottad 16-al, azaz átlagoltad a 16 mérésed. Ekkor kapsz 0-1023-ig egy számot(10 biten). Ezt egy olyan számmal kell elosztanod, ami a kívánt felbontást adja neked. Ha pl. további 4-el osztod(2* shift jobbra a fentiek szerint), akkor kapsz egy 0-255-ig terjedő számot. Ha jól emlékszem ez kell neked? Remélem nem írtam el semmit! ![]()
Látod ezt én sem tudtam! Soha nem használom, én maradi vagyok, azaz nem szoktam makrózni utasításokat, csak programfunkciókat, lábkombinációkat.
Ez így jobban olvasható és mások számára is érthetőbb kódot eredményez. Annál nem útálok semmit jobban, mikor böngésznem kell a makrók mit jelentenek! Persze fene essen belém, ha mások kódját fejtegetem vissza! ![]()
Ezekben a programokban van olyan, hogy Hardver, vagy port check. Itt lehet a port lábait egyenként lecsekkolni.
Megírhattad volna, milyen programot használsz(szerintem tuti azt a szerencsétlen IC-Prog-ot!), és azt is, honnan szedted a rajzot, bár az kiderült, hogy LPT-s, csak az nem, hogy hágy Vpp-je van! 16F-ekhez ajánlom az oshon égető programját, az tutira jól működik! Éppen ezzel dolgoztam ma egész nap. 18F-ekhez az oldalamon található WPB_F18-at, bár az oshaon ilyet is készített, de kevesebb IC-t ismer és sokkal együgyűbb a program. Ja és ezekhez nem kell XP driver, meg ilyen macerák!
Hát ez nem semmi! Minden elismerésem a programozóké. Mivel nem foglalkoztam videojellel, el sem tudom képzelni hogyan állítják elő, de meg fogom nézni, mert ez számomra nagyon lehetetlen kategória egy 16F84A -tól !
![]() Csinálok egy linket, hátha valaki átsiklott felette! Tényleg érdemes a figyelemre! átalakítva feliratozót is lehet belőle készíteni, nagyobb PIC-el pedig még több lehetőség is adódhat! PICPONG |
Bejelentkezés
Hirdetés |