Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Idézet: „Már vagy egy órája irogatom át, de valami nem stimmel. Segitnétek?” Még mindig nem olvastad el, hogy egy-egy utasítás mire való? Mert a hiba az, hogy nem azt az utasítást használod ezeknél, amit kellene. De nem írom le a jó utasítást, csak megmutatom, hogy melyik sorok rosszak:
Idézet: „valami nem stimmel. Segitnétek?” Hát persze! 1. Ne a forráslistát nézd, hanem az .lst kimenetet. 2. Próbáld megérteni, hogy hova mit pakolt az assembler. 3. Ha ez nem elég, akkor próbáld a szimulátorban egyesével léptetni az utasításokat, s ellenőrizd, hogy az kerül-e a változórekeszekbe és a W regiszterbe, amit akartál. Idézet: „Az ERED-be 00001111-nek kéne lennie, de ahelyett 00000001-van” Elárulom, hogy a programod alapján 00000001 a helyes eredmény, tehát pontosan azt csinálja, amire utasítottad.
De olvasom folyamatosan, a progit is ugy irtam, hogy néztem az utasitás listát, de ezek szerint valami nagyon elnézek!
Nézem a watch ablakot folyamatosan, lépsről lépsre futtatom. Nekem odáig jónak tünik, hogy a TEST be bekerül az 11110000 és a PROBA ba az 11111111. Aztán már nem jó, de akkor nekiugrok az elejétől Köszi!
Még arra sem jöttem rá, hogy miért ez a helyes eredmény! De ki matekozom
Idézet: „a TEST be bekerül az 11110000 és a PROBA ba az 11111111.” Ez már fél siker. De a műveletvégzés a W regisztert használja, arra sem ártana egy sanda oldalpillantást vetni szimulálás közben!
Figylem a W-t is, azért irtam, hogy a PROBA-ig jó aztán nmár nem. De most működik. Erősítsetek meg , hogy nem csak véletlenül csinálja azt a progi, amit én akarok!
Még lenne egy olyan kérdésem, hogy hogyan tudok olyat csinálni, hogy előre deffiniálom, hogy a PROBA-ban mondjuk FFh legyen?
Mert próbáltam ilyet: #define PROBA FFh de ez nem nyerte el a fordító tetszését.
A #define-nal makrokat definialsz, ez esetben a PROBA-t ugy lehet tekinteni mint literalt (konstanst).
Csinalj egy inicializalo rutint es hhivd meg az elejen ami feltolti a valtozoidat a kezdo ertekekkel.
Ez már majdnem jó
Pontosabban így most helyesen működik, de nézd meg a XORWF utasítást pontosabban, mert onnan valami lemaradt, és nem szép elhagyni! (Ki tudja, a fordító mit feltételez helyette?)
Az a baj, hogy a komment nem azt mutatja erted miket csinalnak azok az utasitasok! Ennek a harom betunek a jelenteset kell eloszor megertened:
1. W 2. F 3. L Ha ez megvan, akkor azt jegyezd meg, hogy az utasitasok mnemonicjaban altalaban az elso harom betu a muveletet jelzi altalaban, a kovetkezo 1 vagy ket (vagy akar tobb) betu pedig az operandusok tipusat - elso betu az elso parameter, masodik a masodik megelepo modon Pl.: MOVWF --> MOV W F XORLW --> XOR L W MOVF --> MOV F ... itt nincs masodik parameter, csupan a celt adod meg ami F vagy W ... celt azt altalaban meg kell adni ahol latsz a mnemonicban F -et ... kiveve MOVWF mert annak nem sok ertelme lenne ha ezekutan megiscsak a W-be irna az eredmenyt es nem az F-be Nem bonyolult... Nyomtasd ki az utasitas osszefoglalot es legyen nyitva az adatlap az utasitaskeszletnel az elejen, kesobb ez automatan fog menni!
A PIC-ben nem lehet assemblyben úgy helyet foglalni egy változónak, hogy az kezdőértéket is kapjon. A változónak a helyfoglalás tulajdonképpen csak egy memóriarekesz címkével történő ellátása, a memóriarekesz a program indulásakor (a PIC bekapcsolásakor) meg nem tud előre meghatározott értéket felvenni. Így tehát marad az, amit trudnai is írt, hogy a kezdőértékkel rendelkező változókba a kezdőértékeket a program legelején Neked kell betölteni.
Egyébként ezen az equ-s helyfoglaláson szerintem próbálj meg sürgősen túllépni, nézd meg (és értsd meg!), hogy a "cblock" direktíva hogyan működik, és lehetőség szerint használd azt! Azt nem mondom, hogy relokálható kódot akarj előállítani tanulásképp, de ezzel az equ-val csak magának okoz kellemetlenséget az ember, annyira nehéz karban tartani.
Bocsi, most értem haza, kicsit lemaradtam, de a többiek már mindent elmondtak amit kell. Próbált összeszedni, megérteni.
Várjuk a következő kódot CBLOCK-al, regiszter inicializáló résszel, és elágazással attól függően, hogy a XOR eredménye z, vagy Z!
Hu, srácok, irtatok rendesen. Megpróbálom őket megemészteni. És rájönni mi hiányzik a XOR ból.
Azt még nem tudom, mi az a CBLOC, de megkeresem, ha nem értem, akkor zakalatlak titeket A kommetneket nem írtam át miközben a programot módositottam, ugy megörültem, hogy működik! Köszi!!
Megvan! Nulla vagy az 1-es hiányzik neki.
Szóval például
Ha azt akarom, hoigy az eredmény a W-be kerüljön! Ez hiányzott? De tényleg ilyenkor a fordító hova rakja? Ahova épp kedve tartja? Idézet: „De tényleg ilyenkor a fordító hova rakja? Ahova épp kedve tartja?” Mondtam már, hogy az .lst kimenetet nézegesd? Abból kiderül, hogy nullát vagy egyet passzírozott a fordító az utasítás d (destination) bitjébe.
Jha igen, kérdezni akartam, hogy mi az az .lst ?
Nem találom sehol
Nha ez most űgy tünik működik
A CBLOCK jó dolog, nem is tünik bonyolultnak a használata, egyszerűbb, mint equ-ni! Szóval a progim elágazással és CBLOCK-al:
Valoban, node emlekszel-e, hogy a "buvos szamokrol" mit irtunk nemregiben? Azt hiszem nem neked konkretan, de azert nyomon kovetheted a forumot - igy utolag is
Egy kis trukkot elarulok en hogyan szoktam csinalni ha epp nincs a fejemben a dolog: 1. Ha megnezed az adatlapot, a 15. fejezet az Instruction Set Summary (Utasitas Keszlet Osszefoglalo). Rogton az elejen van egy kis tablazat a jelmagyarazatrol. Ha megnezed kicsivel lejjebb fel vannak sorolva az utasitasok - na ezt erdemes kinyomtatnod. Abban ott van, hogy XORWF f,d. Namost vissza a jelmagyarazatra, es akkor oda van irva az 'f' mit jelent, es a 'd'. Namost pl a 'd' -nel gyonyoruen lehet latni, hogy csak 0 es 1 erteket vehet fel, azt is irja mi mit jelent. A kododban pedig nem szamokat irsz, hanem szimubolumokat, mert igy konnyebb latni mi is tortenik... 2. Masik trukk, hogy eloveszem az MPLAB-ot, es beirom neki, hogy "XORWF valtozo" es leforditom. Megnezem az "output" ablakot, es lam, ezt irja ki (tobbek kozott): Idézet: „Message[305] X:\PICDEV\TEST\12F683\12F683.ASM 270 : Using default destination of 1 (file).” No most ebbol azt hiszem egyertelmuen kiderul, hogy mit csinal ilyenkor, ha nem adunk meg neki kezzel destination-t... Ugye, hogy erdemes nezni miket "bofog" az a fordito? Amugy nezd meg mit ir ki neked a CBLOCK-ra...
Lehet, hogy kellene egy "list" diektíva a forrásfájlod elejére! Lásd MPASM Assembler Help "list - Listing Options".
De ha MPLAB IDE View menüben a Disassembly Listing-re kattintasz, akkor is kapsz egy hasonló listát.
Én az eredményt nem tárolnám le(nincs szükség rá később), hanem a logikai művelet után azonnal ellenőrizném. A sok GOTO-t pedig hanyagolnám, elég egy is! Az ellenőrzéseket ilyen módon egy oszlopba lehet rendezni és az oszlopból szépen elágazgazni a feltétel teljesülése esetén.
példa részlet:
A CBLOCK-ban lehet így is, vesszővel elválasztani a tagokat, de jobb ha egymás alá írogatod őket, mert úgy jobban áttekinthető, és tudsz megjegyzéseket írni utánuk! Javaslom, már most szokj hozzá, hogy bőséges megjegyzésekkel látod el a programod, mert később még a saját programjaidat sem fogod átlátni egyből! Arról már nem is beszélve, ha segítséget kérsz, akkor az mennyivel hamarabb fog jönni! Esetleg még annyit, hogy a MOVLW előtt, ill. bármilyen utasítás előtt, ami értéket ad a W-nek, nem kell W-t törölni(CLRW).
A *.lst az a lista fájl, ami a fordításkor keletkezik a *.hex és a többi eredményfájl mellett. De ha a menüből a Disassembler pontra kattintasz, akkor ott is megnézheted a valós fordítás eredményét.
Kicsit kioptiomalizalva watt kodja (csak, hogy lasd az asm-ben mi a szep: mindig lehet optimalizalni valamit...)
A lenyege, hogy a W mar tartalmazza a vizsgalando erteket, es bar minden XOR muveletnel ez valtozni fog, ha figyelembe vesszuk az elozo muveletet akkor az erteket nem veszitjuk el - magyaran az osi fizika torvenye: ertek nem vesz el csak atalakul
Én is fejtettem vissza ilyen kódot már C-fordító által kreált hex-ből , de csak akkor használnám, ha kevés lenne a flash, vagy időkritikus lenne a program. Ettől függetlenül egy nagyon tömör és hatékony módszer, ami figyelemre méltó és tanulságos! Az egyébként tetszik, hogy rábízod az előfordítóra a következő érték kiszámítását, ami azt eredményezi, hogy olvasható lesz a kód. Mondjuk ha módosítani kéne, pl. beszúrni még egy feltételt egy hosszabb sorba, akkor lehetne . Egyébként
Habár nem is kéne annyit , mert a következő az előzőből lesz! Nem is olyan vészes ez a "túloptimalizált" kód! Tetszik!
Lehetne amugy makrot is radobni:
Nem teszteltem le a makrot csak gyorsan bepotyogtem, de remelem nem csinaltam nagy hibat
Elég nagy mágus vagy, egy darabig gúvasztottam a szemem, mire lejött a lényeg!
Üdv!
Köszi a sok optimalizálást. Én még emészteném őket egy darabig, aztán, majd jönnek a kérdések
Javaslom, hogy most ne törődj az optimalizálásokkal, előbb írd meg az első verzió szerint a progidat(mert, hogy más nem is nagyon kell már a kész programhoz.)!
Hat kicsit ugy vagyok vele, hogy izzadjon a fordito helyettem De amugy majdhogynem magas szintu nyelvet lehet irni makrokban, persze abbol meg hianyozna kodoptimlizacio, meg dinamikus memoria kiszotas, pseudo stack hasznalat stb, de amugy minden masban mintha HLL-ben programozna az ember.
|
Bejelentkezés
Hirdetés |