Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   343 / 1319
(#) potyo válasza mrfencer hozzászólására (») Nov 18, 2008 /
 
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:
  1. movwf   TEST       ; F beirása W be
  2. movlw   TEST       ; W irása a TEST-be
  3. xorlw   PROBA      ; xor müvelet a PROBA     tartalmával, az eredmény a W-be kerül
  4. movlw   ERED       ; W irasa ERED-be
(#) icserny válasza mrfencer hozzászólására (») Nov 18, 2008 /
 
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.
(#) icserny válasza mrfencer hozzászólására (») Nov 18, 2008 /
 
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.
(#) mrfencer válasza potyo hozzászólására (») Nov 18, 2008 /
 
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!
(#) mrfencer válasza icserny hozzászólására (») Nov 18, 2008 /
 
Még arra sem jöttem rá, hogy miért ez a helyes eredmény! De ki matekozom
(#) icserny válasza mrfencer hozzászólására (») Nov 18, 2008 /
 
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!
(#) mrfencer válasza icserny hozzászólására (») Nov 18, 2008 /
 
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!
  1. PROBA   equ     20h
  2. TEST    equ     21h
  3. ERED    equ 22h
  4.  
  5. start  
  6.         clrw
  7.         movlw   b'11111111'
  8.         movwf   PROBA
  9.         movlw   b'10101010'
  10.         movwf   TEST                    ; F beirása W be
  11.         xorwf   PROBA                  
  12.         movwf   ERED                    ; W irasa ERED-be
  13.        
  14.  
  15.         goto    start
  16. ;
  17.         end
(#) mrfencer válasza icserny hozzászólására (») Nov 18, 2008 /
 
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.
(#) trudnai válasza mrfencer hozzászólására (») Nov 18, 2008 /
 
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.
(#) szilva válasza mrfencer hozzászólására (») Nov 18, 2008 /
 
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?)
(#) trudnai válasza mrfencer hozzászólására (») Nov 18, 2008 /
 
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!
(#) szilva válasza mrfencer hozzászólására (») Nov 18, 2008 /
 
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.
(#) watt válasza mrfencer hozzászólására (») Nov 18, 2008 /
 
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!
(#) mrfencer válasza watt hozzászólására (») Nov 18, 2008 /
 
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!!
(#) mrfencer válasza szilva hozzászólására (») Nov 18, 2008 /
 
Megvan! Nulla vagy az 1-es hiányzik neki.
Szóval például
  1. xorwf PROBA,0

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?
(#) icserny válasza mrfencer hozzászólására (») Nov 18, 2008 /
 
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.

(#) mrfencer válasza icserny hozzászólására (») Nov 18, 2008 /
 
Jha igen, kérdezni akartam, hogy mi az az .lst ?
Nem találom sehol
(#) mrfencer válasza watt hozzászólására (») Nov 18, 2008 /
 
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:
  1. #define LM      PORTB,3
  2. CBLOCK 020h
  3.  
  4.         PROBA, TEST, ERED
  5.  
  6. endc
  7.  
  8.         banksel TRISB           ; Selects bank containing register TRISB
  9.         clrf    TRISB           ; All port B pins are configured as outputs
  10.         banksel PORTB           ; Selects bank containing register PORTB
  11.  
  12. start  
  13.         clrw
  14.         movlw   b'00000000'
  15.         movwf   PORTB
  16.         movlw   b'01111000'
  17.         movwf   PROBA
  18.         movlw   b'01111000'
  19.         movwf   TEST                   
  20.         xorwf   PROBA,0                 ; az eredmény a W-be
  21.         movwf   ERED                   
  22.        
  23.         goto    FELT
  24. ;
  25. FELT
  26.         btfsc   STATUS,Z       
  27.         goto    KULD
  28.         goto    start
  29. KULD
  30.  
  31.         bsf     LM
  32.         goto    start
  33.  
  34.         end
(#) trudnai válasza mrfencer hozzászólására (») Nov 18, 2008 /
 
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...
(#) icserny válasza mrfencer hozzászólására (») Nov 18, 2008 /
 
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.
(#) watt válasza mrfencer hozzászólására (») Nov 19, 2008 /
 
É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:

  1. MOVF    TEST,F  ; Z BIT TESZTELÉSE
  2. BTFSC   STATUS,Z
  3. GOTO    GO_NULL         ; HA A TESZT ÉRTÉK 0, LEKEZELÉS(Ha jól emlékszem ilyen lehetőséget is említettél)
  4. MOVLW   B'11110000'     ; LM (Ha CR1 =0)
  5. XORWF   TEST,W  ; LM?
  6. BTFSC   STATUS,Z        ; nem LM? ugrik!       
  7. GOTO    GO_LM           ; HA LM, LEKEZELJÜK
  8. MOVLW   B'11111000'     ; LM (Ha CR1 =1)
  9. XORWF   TEST,W  ; LM?
  10. BTFSC   STATUS,Z        ; nem LM? ugrik!       
  11. GOTO    GO_LM           ; HA LM, LEKEZELJÜK
  12. MOVLW   B'11111110'     ; CS
  13. XORWF   TEST,W  ; CS?
  14. BTFSC   STATUS,Z        ; nem CS? ugrik!       
  15. GOTO    GO_CS           ; HA CS, LEKEZELJÜK
  16. stb...


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).



(#) watt válasza mrfencer hozzászólására (») Nov 19, 2008 /
 
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.
(#) trudnai válasza mrfencer hozzászólására (») Nov 19, 2008 /
 
Kicsit kioptiomalizalva watt kodja (csak, hogy lasd az asm-ben mi a szep: mindig lehet optimalizalni valamit...)
  1. movf    tmp,W
  2.         btfsc   STATUS,Z
  3.         goto    GO_NULL
  4.  
  5.         xorlw   b'11111110'
  6.         btfsc   STATUS,Z
  7.         goto    GO_CR
  8.         xorlw   b'11111000' ^ b'11111110'
  9.         btfsc   STATUS,Z
  10.         goto    GO_LM
  11.         xorlw   b'11110000' ^ b'11111000'
  12.         btfsc   STATUS,Z
  13.         goto    GO_LM

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
(#) watt válasza trudnai hozzászólására (») Nov 19, 2008 /
 
É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
(#) watt válasza watt hozzászólására (») Nov 19, 2008 /
 
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!
(#) trudnai válasza watt hozzászólására (») Nov 19, 2008 /
 
Lehetne amugy makrot is radobni:
  1. switch  macro   file
  2.         variable swtch = 0
  3.         movf    file,W
  4.         endm
  5.  
  6. case    macro   ertek, cimke
  7.         xorlw   ertek ^ swtch
  8.         btfsc   STATUS,Z
  9.         goto    cimke
  10. swtch = ertek
  11.         endm
  12.  
  13.         switch  TESZT
  14.         case    b'11110000', GO_LM
  15.         case    b'11111000', GO_LM
  16.         case    b'11111110', GO_RM
  17.         goto    EGYIK_SEM

Nem teszteltem le a makrot csak gyorsan bepotyogtem, de remelem nem csinaltam nagy hibat
(#) watt válasza trudnai hozzászólására (») Nov 19, 2008 /
 
Elég nagy mágus vagy, egy darabig gúvasztottam a szemem, mire lejött a lényeg!
(#) mrfencer válasza watt hozzászólására (») Nov 19, 2008 /
 
Ü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
(#) watt válasza mrfencer hozzászólására (») Nov 19, 2008 /
 
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.)!
(#) trudnai válasza watt hozzászólására (») Nov 19, 2008 /
 
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.
Következő: »»   343 / 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