Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   675 / 1320
(#) Attila86 hozzászólása Feb 15, 2010 /
 
Megint egy táblával kínlódom. Miért nem oda ugrik ahová szeretném?
  1. movlw   d'1'
  2.         rlncf   WREG, W
  3.         rlncf   WREG, W
  4.         addwf   PCL, F
  5.         goto    paraméter0_beállítás   ;<- ide kellene ugornia
  6.         goto    paraméter1_beállítás
  7.         goto    paraméter2_beállítás
  8.         goto    paraméter6_beállítás
  9.         goto    paraméter10_beállítás
  10.         goto    paraméter3_beállítás
  11.         goto    paraméter7_beállítás
  12.         goto    paraméter11_beállítás
  13.         goto    paraméter4_beállítás
  14.         goto    paraméter5_beállítás
  15.         goto    paraméter8_beállítás
  16.         goto    paraméter9_beállítás
  17.         goto    paraméter12_beállítás
(#) szilva válasza Attila86 hozzászólására (») Feb 15, 2010 /
 
És hova ugrik helyette? A PCL értéke nem már a következő utasításra mutat, amikor az összeadást végrehajtja, és így W=0 kezdőértéknél kerülne az "ADDWF PCL,F" utáni sorba?
(#) Attila86 válasza szilva hozzászólására (») Feb 15, 2010 /
 
Kb 1500 sorral hátrébb ugrik.
(#) Attila86 válasza Attila86 hozzászólására (») Feb 15, 2010 /
 
Arra már rájöttem hogy valószínűleg az a baj, hogy a PC felső részét is be kellene állítani. Egyenlőre nem jöttem rá hogy hogyan...
(#) Hp41C válasza Attila86 hozzászólására (») Feb 15, 2010 /
 
Szia!

Az sem ártana, ha vizsgálná, hogy a táblázat elfér-e egy 256 byte-os lapon...

Az első ugrásra a 0 sorszámmal kell hivatkozni, mivel az add utasítás a megnövelt pc -hez adja hozzá a w regiszter értékét.

  1. movlw    high(valami)
  2.       mowvf    PCLATH
  3. ;    movlw    upper(valami)
  4. ;    movwf    PCLATU
  5.     movlw     d'0'
  6.     rlncf        WREG, W
  7.     rlncf        WREG, W
  8.     addwf     PCL, F
  9.  
  10. valami
  11.     goto        paraméter0_beállítás
  12. ...


Szia
(#) Attila86 válasza Attila86 hozzászólására (») Feb 15, 2010 /
 
Valamit sikerült elérni... "movf PCL, W" utasítással kiolvasódik a PCH tartalma is a PCLATH-ba és ott is marad! Ha utána írom át a PCL-t, akkor már nagyjából jó helyre ugrik!
(#) szilva válasza Attila86 hozzászólására (») Feb 15, 2010 /
 
Noigen, a felső címrészt be kell állítani a PCLATH-ba. Ezügyben az adatlap szépen leírja, hogy hogy működik a PC feltöltése. A táblázattal valóban vigyázni kell, hogy ne csorduljon át ilyen laphatáron, vagy pedig igazi, kétbyteos összeadással kell kiszámolni a címet PCLATH-ba és PCL-be.
(#) Attila86 válasza szilva hozzászólására (») Feb 15, 2010 /
 
Igen, pont most akartam írni hogy csak a tábla első felében működik jó, a második felében túlcsordul a PCL és rossz helyre ugrik.
(#) icserny válasza Attila86 hozzászólására (») Feb 15, 2010 /
 
Idézet:
„Ha utána írom át a PCL-t, akkor már nagyjából jó helyre ugrik!
Feltaláltad a GOTO SOMEWHERE utasítást?
(#) Attila86 válasza szilva hozzászólására (») Feb 15, 2010 /
 
Megpróbáltam összeadni két bájton, de valami nem jó. Mit rontottam el?
  1. movlw    high(ugrótábla1)
  2.         movwf    PCLATH
  3.         movlw   d'8'
  4.         rlncf   WREG, W
  5.         rlncf   WREG, W
  6.         addwf   PCL, W
  7.         btfss   STATUS, C       ;ha történt túcsordulás, akkor ugrik!
  8.         bra             ugrótábla1
  9.         incf    PCLATH
  10. ugrótábla1
  11.         movwf   PCL
  12.         goto    paraméter0_beállítás
  13.         goto    paraméter1_beállítás
  14.         goto    paraméter2_beállítás
  15.         goto    paraméter6_beállítás
  16.         goto    paraméter10_beállítás
  17.         goto    paraméter3_beállítás
  18.         goto    paraméter7_beállítás
  19.         goto    paraméter11_beállítás
  20.         goto    paraméter4_beállítás
  21.         goto    paraméter5_beállítás
  22.         goto    paraméter8_beállítás
  23.         goto    paraméter9_beállítás
  24.         goto    paraméter12_beállítás
(#) watt válasza Attila86 hozzászólására (») Feb 15, 2010 /
 
Nem tudom mit akarsz elérni ilyen módon, de bevallom soha az életben nem használtam ilyen szekvenciát, pedig egy pár programot megírtam már!
Mond el mit szeretnél, hátha van arra normálisabb mód is!
Ez egyébként nem táblázat, hanem egy változótól függő feltételes elágazás.
(#) Attila86 válasza watt hozzászólására (») Feb 15, 2010 / 1
 
Van egy regiszterem aminek a meglétét most a hiba kiderítéséig a "movlw d'8'" sorral helyettesítem (hogy könnyen át tudjam írni). Ez a regiszter azt tartalmazza, hogy a menürendszerben épp hol vagyunk. Ez az ugrótábla arra kell, hogy az adott menüpontba belépéskor a PIC a menüponthoz tartozó rutinhoz ugorjon.
(#) pixels válasza Attila86 hozzászólására (») Feb 15, 2010 /
 
Érdemes lenne laphatárra rakni az ugrótábla elejét, PCLATH legyen high(ugrótábla) PCL az meg ugye a sorszám ahova ugrani szeretnél az ugrótáblán. Ez a megoldás 256 elágazásig megfelel. Én az ilyen táblákat az utolsó lapokra szoktam rakni, mert így elkerülhető a fragmentáció.
(#) watt válasza Attila86 hozzászólására (») Feb 15, 2010 /
 
Ehhez mit szólsz?
  1. W- jön a menü kódja PL. 1.......10
  2.         MOVWF   MENÜ   ; Betöltjük a W értékét ramba, hogy W ne változzon. Ez nem feltétlenül szükséges.
  3.         DECF    MENÜ,f
  4.         BZ      MENÜ_1 ; Ha a menü értéke 1, volt.
  5.         DECF    MENÜ,f
  6.         BZ      MENÜ_2         ; Ha a menü értéke 1, volt.
  7. stb

(#) Attila86 válasza watt hozzászólására (») Feb 15, 2010 /
 
Végül is jó, de talán így ugrótáblaként lett volna a legelegánsabb.
(#) szilva válasza Attila86 hozzászólására (») Feb 15, 2010 /
 
Egyrészt a btfss-bra párost meg lehetne egyszerűbben oldani, ugyanis csak az "incf PCLATH,f"-et kellene átugrani, ha nincs carry (btfsc). Másrészt az "incf PCLATH"-nál nincs megadva, hogy az eredmény hova kerüljön, nem tudom, ilyenkor mi az alapértelmezett. Harmadrészt - és ez a legfontosabb - a W-hez nem PCL-t kellene hozzáadni a carry vizsgálata előtt, hanem a low(ugrótábla1) értéket!
(#) watt válasza Attila86 hozzászólására (») Feb 15, 2010 /
 
Ez a fajta ugrótábla a 16F-ek "csökevénye".
(#) szilva válasza szilva hozzászólására (») Feb 15, 2010 /
 
Én valahogy így csinálnám (bár ezt fejből írtam, lehet, hogy valami nem pontosan így jó):

  1. movlw high(ugrotabla1)
  2.    movwf PCLATH
  3.    ; w feltöltése a menüpont szerint
  4.    movlw 0x08
  5.    rlncf WREG,w
  6.    rlncf WREG,w
  7.    addlw low(ugrotabla1)
  8.    btfsc STATUS,C
  9.    incf PCLATH,f
  10.    movwf PCL
  11.  
  12. ugrotabla1:
  13.    goto elso
  14.    goto masodik
  15.    ...

(#) szilva válasza watt hozzászólására (») Feb 15, 2010 /
 
A legelegánsabb, ha kiszámítja a címet az ember és beírja a flash-be menet közben a goto utasítás operandusába Ehhez olyan PIC kell, ami tudja írni a saját flash-ét futás közben.
(#) icserny válasza Attila86 hozzászólására (») Feb 15, 2010 /
 
Idézet:
„Mit rontottam el?”

Az aktuális PCL helyett a táblázat első utasításának címe kellene, hogy legyen a kiindulási érték, ehhez kellene hozzáadni W négyszeresét (amit a két balra léptetéssel csinálsz meg).
(#) watt válasza szilva hozzászólására (») Feb 15, 2010 /
 
Kérdés, meddig bírná a flash!? De jó ötlet!
(#) icserny válasza szilva hozzászólására (») Feb 15, 2010 /
 
Akkor már inkább a return stack tetejére kellene beírni, s egy return utasítással ráugratni.
(#) potyo válasza sucuka hozzászólására (») Feb 15, 2010 /
 
Ha van elég RAM a gépben (legalább másfél giga), akkor érdemes a virtuális memóriát (lapozófájlt) letiltani, sokkal jobb lesz a gép válaszideje ablakváltásoknál. A böngésző kivételével a többi program nem egy processzorzabáló, csak a windows elcseszett lapozófájlkezelése miatt lassú az ablakváltás.
(#) potyo válasza watt hozzászólására (») Feb 15, 2010 /
 
Ha indításonként először olvassuk és megnézzük, hogy jó-e a cím, és csak akkor változtatunk, ha nem jó, akkor szerintem elég sokáig
(#) Attila86 válasza szilva hozzászólására (») Feb 15, 2010 /
 
Ez működik, köszönöm!
(#) watt válasza potyo hozzászólására (») Feb 15, 2010 /
 
Az újabb PIC-ek csak 1000x írhatók!

Amit írsz azt feltételezi, hogy van néhány menüpont, ami többször ismétlődik. Ez elég valószínűtlen, de végül is néhány %-ban növelné az élettartamot.

Az lenne még a megoldás, hogy számolni a regiszter ciklusát, és megfelelő számosság esetén áttenni a goto-t is másik címre, helyére pedig az új címmel egy BRA-t!
(#) watt válasza Attila86 hozzászólására (») Feb 15, 2010 /
 
Az a baj ezzel még, hogy egy goto két programrekeszt foglal, tehát nem elég, hogy olvashatatlan lesz a kód, fixálni kell egy területen a táblát, ami esetleg még gondot okozhat, ha fogyóban a memória, de még nagyobb területet is foglal, mint az általam felvetett megoldás. Hogy elegáns-e? Szerintem inkább erőltetett.
(#) szilva válasza watt hozzászólására (») Feb 15, 2010 /
 
Ha jól emlékszem, 18F-eken van DCFSNZ utasítás, ezzel lehet "szép" szekvenciát csinálni menüpont-elágazásokhoz: DCFSNZ-GOTO-DCFSNZ-GOTO-... De több menüpontnál meggondolandó szerintem az Attila86 által írt módszer is, főleg, ha rendes, hosszú goto-k vannak, amivel a programmemória bármely pontjára lehet ugrani.

Ha módosítások után is forrásból fordítja és nem a hex-be akar beletúrni, akkor édesmindegy, hogy hol kezdődik az ugrótábla, mivel a leírt módszer carryvel együtt számolja az elem címét. Az elején a négyszeres szorzás miatti egyedüli megkötés, hogy W-ben 64-nél kisebb értéket kapjon (talán 64 menüpont elég).

Bonyolultabb menürendszereknél pedig már nem is biztos, hogy ilyennel csinálnám, hanem inkább egy állapotgéppel és az ahhoz tartozó, paraméterekkel feltöltött tömbbel.
(#) watt válasza szilva hozzászólására (») Feb 15, 2010 /
 
Igen így is jó lenne, valóban:
  1. DCFSNZ  MENÜ,f
  2.         BRA     MENÜ_1
  3.         DCFSNZ  MENÜ,f
  4.         BRA     MENÜ_2  
  5. stb.
  6. vagy
  7.  
  8.         DCFSNZ  MENÜ,f
  9.         GOTO    MENÜ_1
  10.         DCFSNZ  MENÜ,f
  11.         GOTO    MENÜ_2  
  12. stb.


Az állapotgépet nem pontosan értem, de jól hangzik!
(#) szilva válasza watt hozzászólására (») Feb 15, 2010 /
 
Az állapotgépnél arra gondolok, hogy mondjuk papíron felrajzolod az egész menürendszert egy gráfba, a gráf csúcsai a menüpontok, a menüpontok közötti irányított élekre ráírod, hogy milyen esemény hatására kell az adott élen egyik pontból a másikba lépni. Ezután a menüpontokat meg kell sorszámozni, majd felvenni egy táblázatot, aminek minden eleme pl. a következőket tartalmazza:
- a menüpont megjelítendő szövege
- a menüpontról az 1. számú esemény hatására melyik menüpontra kell lépni
- a menüpontról a 2. számú esemény hatására melyik menüpontra kell lépni
...
- a menüpontról az x. számú esemény hatására melyik menüpontra kell lépni
- egyéb információk, ezek már alkalmazás-specifikusak lehetnek, ilyen pl. a menüpont aktiválásakor meghívandó szubrutin címe

Ha ez megvan, akkor egyetlen programmaggal az egész, akármilyen bonyolult menüfán végig lehet sétálgatni (sokkal egyszerűbb a valóságban, mint így leírva). Nem kell bonyolult "eseményekre" sem gondolni: pl. van két-három nyomógomb, ezeknek a megnyomása az "esemény", illetve pl. meg lehet különböztetni hosszú és rövid megnyomást.

Ilyen jellegű megoldás működik a 16F946-os órámban, aminek 3 nyomógombja van, de hosszú megnyomást is megkülönböztetek, valamint nyomva tartás esetén az "ismételt megnyomások"-at is. Ezenkívül ott bevezettem még egy olyan eseményt, ami az utolsó gombnyomás után pár másodperccel következik be - ezt alaphelyzetbe visszaállásra használom bizonyos módokból. Ha belegondolsz, egy egyszerű kétgombos kvarcóra is elég bonyolult menürendszerrel dolgozik, attól függően, hogy épp hol vagy, mindegyik gombnak más a jelentése. "Hagyományos" módszerekkel már az elején olyan átláthatatlan lett a kód, hogy kénytelen voltam erre az állapotgépes menünjárkálásra átírni, de nem bántam meg. Amikor rákerült az órára a DS1821, akkor annak a menürendszerbe illesztése csak a táblázat néhány új elemmel történő kiegészítésébe tellett, meg persze a meghívandó (primitív) rutinok megírásába. A gomb- és menükezeléshez semmit nem nyúltam.
Következő: »»   675 / 1320
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