Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   717 / 1320
(#) cNobody válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Viszont ötleteket meríthetsz
(#) Attila86 válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Hogyan lehet az ORG-nál 160 bájtot lefoglalni egy táblához?
(#) Hp41C válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Szia!

Egy kérdés: Rom -beli konstans táblázatot szeretnél vagy Ram -beli adattáblát.

Rom -beli konstans táblázat (ezt lehet a tblrd / tblwr utasítással elérni..):
  1. RomTabla:
  2.   db 0x00 ; 160 db ilyen adatmegadás...

Ram -beli (ezeket az indf1, portinc0, predec2 stb..-vel lehet elérni):
  1. cblock 0x100
  2.  RamTabla: .160
  3. endc


Még egy ötlet: a lapozás kihasználása (a 18F-ben is van...) A szavas adatnak két lapon foglalj 160-160 byte helyet: Az alsó byte legyen mondjuk a 2. lapon (0x200..) a magas byte legyen a 3. lapon (0x300). Ha el kell érni, az indexet az FSR-ek egyikébe teszed, az alacsony byte akkor érhető el, ha az FSRxH 0. bitje 0, a magas pedig akkor ha 1...
(#) Attila86 válasza Hp41C hozzászólására (») Ápr 6, 2010 /
 
Szia!

Adattáblát szeretnék amit írni-olvasni tudok bármikor a TBLRD és TBLWT utasításokkal. De most akkor hogy is van ez? Megjegyzésbe azt írtad hogy:
Idézet:
„160 db ilyen adatmegadás...”

Most akkor 160-szor kell egymás alá írnom valamit mint ebben az esetben?
  1. cblock
  2. minta1_H
  3. minta1_L
  4. minta2_H
  5. minta2_L
  6. minta3_H
  7. minta3_L
  8. (...)
  9. endc

Én épp ezt szeretném elkerülni mert nagyon hülyén néz ki 160 sor feleslegesen egymás alatt. Nincs valami más módszer a ROM ikszedik bájtjától ipszilon bájtjáig való lefoglalásának egy táblához?
(#) Hp41C válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Szia!

Kevederik két dolog :
- A cblock a RAM -ban foglal változó területet,
- A tblrd és tblwr a EEPROM-beli adatokat kezeli...

A ram -beli foglalásra az előbb írtam példát:
  1. cblock 0x100
  2.   RamTabl: .160 ; a következő dec. 160 rekeszre nem tesz változót
  3.   Index              ; az index címe = RamTabl + .160
  4. endc


A rom -belinél egy sorban több adat is megadható:
  1. DB  0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00    ; " "
  2.   DB  0x00 , 0x00 , 0x79 , 0x00 , 0x00 , 0x00    ; "!"
  3.   DB  0x00 , 0x70 , 0x00 , 0x70 , 0x00 , 0x00    ; """
  4.   DB  0x14 , 0x7F , 0x14 , 0x7F , 0x14 , 0x00    ; "#"

Figyelem, ha páratlan számú byte-ot adunk meg, a fordító kiegészíti párosra....
(#) Attila86 válasza Hp41C hozzászólására (») Ápr 6, 2010 /
 
Idézet:
„- A tblrd és tblwr a EEPROM-beli adatokat kezeli...”

Ez komoly? Az hogy lehet, eddig azt hittem az EEPROM csak ilyen komplikáltan írható:
  1. EEPROM_írás
  2.         bcf     EECON1, EEPGD ; Point to DATA memory
  3.         bcf     EECON1, CFGS ; Access EEPROM
  4.         bsf     EECON1, WREN ; Enable writes
  5.         bcf     INTCON, GIE ;globális megszakítás tiltás
  6.         movlw   55h ;
  7.         movwf   EECON2 ; Write 55h
  8.         movlw   0AAh ;
  9.         movwf   EECON2 ; Write 0AAh
  10.         bsf     EECON1, WR ; Set WR bit to begin write
  11.         bsf             INTCON, GIE             ;globális megszakítás engedélyezés
  12.         btfsc   EECON1, WR      ;befejeződött már az írás? (ha igen, akkor ugrik!)
  13.         goto    $-2    
  14.         bcf     EECON1, WREN ; Disable writes on write complete (EEIF set)
  15. RETURN


Akkor ha így foglalok 160 bájtot:
  1. cblock 0x100
  2. RamTabl: .160 ; a következő dec. 160 rekeszre nem tesz változót
  3. Index              ; az index címe = RamTabl + .160
  4. endc

Akkor ehhez nem tudok a TBLRD és TBLWT utasításokkal hozzáférni?
(#) Hp41C válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Szia!

A program / config EEPROM kezelhető a tblrd és tblwr utasításokkal, nem az adat EEPROM...

A két lapos RamTab kezelése:

  1. lfsr  FSR1,RamTabl
  2. movf  INDF0,w
  3. movwf  LowByte
  4. bsf  FSR1H,0
  5. movf  POCTINC0,w
  6. movwf  HighByte
  7. bcf  FSR1H,0
(#) Hp41C válasza Hp41C hozzászólására (») Ápr 6, 2010 /
 
Szia!

Sajnos a példát rosszul írtam az előző hozzászólásban:

  1. lfsr  FSR1,RamTabl
  2.       movf  INDF1,w
  3.       movwf  LowByte
  4.       bsf  FSR1H,0
  5.       movf  POCTINC1,w
  6.       movwf  HighByte
  7.       bcf  FSR1H,0


Bocsánat...
(#) watt válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Talán az oldalamon is van példa, ha egyre gondolunk.
A fényfüggönyben is és az egyik példaprogiban...
(#) icserny válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Idézet:
„És ha én két bájtos számokat szeretnék tárolni, akkor ezt hogyan szokás kezelni?”
Nem kötelező ugyan, de lehetne úgy, ahogy a C18 fordító is kezeli: legalacsonyabb címre a (leg)kisebb helyiértékű bájtot, az eggyel nagyobb címre a magasabb helyiértékű bájtot.
  1. cblock 0x100
  2. RamTabla: .160
  3.         endc

Ha a fenti módon történt a helyfoglalás, akkor:
0x100 első adat alacsony helyiértékű bájt
0x101 első adat magas helyiértékű bájt
0x102 második adat alacsony helyiértékű bájt
0x103 második adat magas helyiértékű bájt
...

Mutatónak az FSR0, FSR1, FSR2 indirekt címzésre való regiszterpárok (mindegyilknek van L és H fele) használhatók. Pl. összegzés 80 adatra:
  1. lsfr  RamTabla
  2.       clrf  sumL
  3.       clrf  sumH
  4.       clrf  i     ;i=0
  5. ciklus:
  6.       movlw  .80
  7.       cpfslt    i    ;i < 80?
  8.       bra   vege
  9.       movf  POSTINC0,W
  10.       addwf  sumL
  11.       movf  POSTINC0
  12.       addwfc  sumH
  13.       incf    i
  14.       bra  ciklus
  15. vege:
  16.       ;a program folytatása


A POSTINC0 címzésmód az indirekt hivatkozáson kívül automatikusan lépteti is a címet az olvasás után!

Bővebben: Link
(#) Attila86 válasza icserny hozzászólására (») Ápr 6, 2010 /
 
Köszönöm, most már végre értem!

Már csak ezt magyarázza el nekem valaki:
Idézet:
„Miután valamelyik FSRx regisztert beállítottuk (pl. az lsfsr utasítás segítségével), írni vagy olvasni kell az adott FSR regiszterhez tartozó viruális (fizikailag nem létező) regisztert (tehát INDF0, INDF1, INDF2 valamelyikét).”

Mit értenek az FSRx regiszter beállításán és hogyan kell ezt megtenni? Mondjuk ha ezt írom:
  1. cblock 0x100
  2. RamTabla: .160
  3. endc

Akkor a tábla használatához mondjuk az FSR0H és az FSR0L regiszterpárba 0x100-at kell írnom és onnantól már felfelé tudom olvasni a táblát? Jól sejtem?
(#) potyo válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Idézet:
„Jól sejtem?”


Jól.
(#) icserny válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Idézet:
„Mit értenek az FSRx regiszter beállításán és hogyan kell ezt megtenni?”

Legegyszerűbben az LFSR utasítással. Én, sajnos, rosszul írtam az előző példában, mert így kellett volna:
  1. lfsr FSR0,RamTabla

vagyis meg kell mondani, hogy melyik FSRx regiszterpárba, és hogy milyen címet töltsön be.

Természetesen lehet egyenként is:
  1. movlw low RamTabla
  2.       movwf FSR0L
  3.       movlw high RamTabla
  4.       movwf FSR0H


(azért sem írtam 0x100-at! )
(#) trudnai válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Idézet:
„Én épp ezt szeretném elkerülni mert nagyon hülyén néz ki 160 sor feleslegesen egymás alatt. Nincs valami más módszer a ROM ikszedik bájtjától ipszilon bájtjáig való lefoglalásának egy táblához?”


Dehogynem, ha inicializalt teruletet szeretnel ROM-ban lefoglalni, akor FILL direktivaval megteheted... Amugy pedig lehet jatszadozni az ORG direktivaval is, illetoleg linker scripttel...
(#) Attila86 hozzászólása Ápr 6, 2010 /
 
Jó lesz ez így?
  1. cblock 0x000
  2.         minta_tábla: .160              ;minták tárolására használt 160 bájt
  3.         W_TEMP
  4.         STATUS_TEMP
  5.         SZAM1_felso
  6.         SZAM1_also
  7.         SZAM2_felso
  8.         SZAM2_also
  9.         KIJELZŐ_1_felső_bájt
  10.         KIJELZŐ_1_alsó_bájt
  11.         KIJELZŐ_2_felső_bájt
  12.         KIJELZŐ_2_alsó_bájt
  13.         minta_számláló
  14. endc


  1. AD_konverzió
  2.         movlw   d'80'
  3.         movwf   minta_számláló
  4.         clrf    FSR0H
  5.         clrf    FSR0L
  6.         movlw   b'00000101'
  7.         movwf   ADCON0                          ;Ube (AN1) kiválasztása, engedélyezése
  8. tábla_feltöltése
  9.         bsf             ADCON0, GO_DONE         ;A/D konverzió indítása
  10.         btfsc   ADCON0, GO_DONE         ;befejeződött az A/D konverzió?
  11.         goto    $-2                                     ;ha nem, akkor kérdezd meg újra!
  12.         movff   ADRESL, POSTINC0
  13.         movff   ADRESH, POSTINC0
  14.         decfsz  minta_számláló
  15.         bra             tábla_feltöltése
(#) trudnai válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Idézet:
„Akkor ha így foglalok 160 bájtot:
  1. cblock 0x100
  2. RamTabl: .160 ; a következő dec. 160 rekeszre nem tesz változót
  3. Index              ; az index címe = RamTabl + .160
  4. endc


Pontosabban a CBLOCK nem foglal memoriat! A CBLOCK-nak semmi koze a RAM-hoz, GPR-ekhez, valtozokhoz. Az egy konstanst definial, amit adott esetben felhasznalhatsz RAM cimek kiosztasara is, de semmi sem garantalja, hogy ugyanarra a RAM teruletre nem ir a program mashol. Sot, azt sem garantalja, hogy bele fogsz ferni a RAM teruletre, ha netan a tombod tul nagyra sikeredne.
(#) trudnai válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
A bokkeno csak annyi, hogy a tabla also fele az Access RAM teruletre esik, a masik fele pedig mar a GPR Bank 0-ra. En nem igy csinalnam... Kulon vennem a tombot, es rakenyszeritenem egy olyan bank-ra, amit masra nem is hasznalok...

Masik amit valtoztatnek, hogy a minta_tabla meretet egy #define-al adnam meg (vagy EQU) es a minta_szamlalo inicializalasat is ebbol szamolnam. Ezzel lehet garantalni, hogy ha valtoztatod a fejlesztes kozben a tomb meretet akkor sem csuszik el a buffer mereted (magyaran nem lesz buffer overrun hibad).
(#) icserny válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Idézet:
„Jó lesz ez így?”
Nem, mert a változóid kikerültek az Access Bankból! Legegyszerűbb megoldásként fordítsd meg a sorrendet: tedd a táblát közvetlenül az "endc" elé, a változóid mögé!
(#) Attila86 válasza icserny hozzászólására (») Ápr 6, 2010 /
 
Így lesz, köszönöm! De akkor honnan tudom hogy mettől meddig tart a táblám?
(#) Attila86 hozzászólása Ápr 6, 2010 /
 
Ja de várjunk csak... én azért is tettem a nullától 160-ig a táblát hogy az egészet el tudjam érni kizárólag az FSR0L használatával, mert így kicsit könnyebb.
Most ha a CBLOCK végére teszem akkor honnan lehet tudni hogy mettől meddig tart?
(#) potyo válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Most nemazért, de jobban figyelhetnél, mert icserny ezt írta le nem sokkal ezelőtt: Link
(#) Attila86 válasza potyo hozzászólására (») Ápr 6, 2010 /
 
Igazából ez nem válasz a kérdésemre mert még mindig nem tudom hogy mettől meddig van a táblám. Ettől függetlenül a célomat elérem vele mert ugyan számszerűleg nem tudom a tábla kezdőértékét, de a tábla nevével hivatkozhatom rá. Mondjuk az csak hab a tortán hogy én a tábla tetejétől lefelé szeretnék haladni, tehát nekem a legfelső, azaz a 160. bájtra kellene mutatni. De mindegy, hozzáadok 160-at és jó lesz.
(#) Hp41C válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Szia!

Ha a végéről szeretnél indulni, akkor csak annyit kell tenned, hogy az
  1. lfsr  FSRx,RamTabl+TablSize-1

utasítással feltöltöd a kívánt regisztert, a ciklusban végzed a műveleteket a POSTDECx regiszeterrel... Akkor értél a tömb elejére, ha az FSRx értéke pont a RamTabl... Ha a RamTabl -ot egy lap elejére teszed, akkor a ciklusból való kilépésnél elég az FSRxL 0 értékét nézned...
(#) watt válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
A tábla végéhez is teszel egy címkét!
Nézted az oldalamon a példát? Lehet nem kellett volna ennyit írogatni!
(#) Attila86 válasza watt hozzászólására (») Ápr 6, 2010 /
 
Persze, nézegettem én azt is...

De most kicsit összezavarodtam, teljesen letaglózott a "POSTDECx" hiánya. Enélkül valahogy másképp kell megoldani azt amit eddig összeírtam. Ha csak léptetni szeretném a mutatót akkor a például DECF FSR0L -al hosszadalmas mert ha alulcsordul akkor nézegetni a kell a carry bitet és az nem elegáns. Lehet akkor így fogom csökkenteni (vagy növelni): MOVF POSTDEC0, F. Ez csak egy sor.
(#) icserny válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Idézet:
„a de várjunk csak... én azért is tettem a nullától 160-ig a táblát hogy az egészet el tudjam érni kizárólag az FSR0L használatával”
Megteheted, csak akkor az ÖSSZES többi változód kezelése lesz komplikáltabb (BANKED módban kell kezelni azokat, s a BSR regisztert kell használni)

A "kizárólag FSR0L használatával"-ban mi lenne a nagy vívmány? Nem is kell róla tudnod, hogy az FSR két regiszterből áll! (Már bánom, hogy elárultam! )
(#) Attila86 válasza icserny hozzászólására (») Ápr 6, 2010 /
 
Azért, mert nincs "PREDECx" és erre szükségem lenne. De azóta kitaláltam hogy MOVF POSTDECx, F lesz. (Az előző hozzászólásban elírtam!)
(#) Hp41C válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Szia!

Olvasd el a Data Memory Organization fejezetet....
A POSTDECx -et a "POSTDEC0 vagy POSTDEC1 vagy POSTDEC2" formula helyett írtam, mert nem tudom, hogy melyik mutató (FSR0 vagy FSR1 vagy FSR2) regisztert szeretnéd használni... Természetesen nem jó ötlet pl. az FSR0 -t feltölteni és aztán a másikat használni pl. a POSTDEC2-t (amiért magamat kellett nemrég javítanom).

(Nem kiabálva mondom, de így kell írni).. Az INDF0, INDF1, INDF2, POSTINC0, POSTINC1, POSTINC2, POSTDEC0, POSTDEC1, POSTDEC2, PREINC0, PREINC1, PREINC2 létezik, sőt még a PLUSW0, PLUSW1, PLUSW2 is.
(#) Attila86 válasza Hp41C hozzászólására (») Ápr 6, 2010 /
 
Szia!

Oké, ezt azért értem.

Az előbb elírtam, a PREDECx az amit hiányoltam.
(#) trudnai válasza Attila86 hozzászólására (») Ápr 6, 2010 /
 
Idézet:
„Igazából ez nem válasz a kérdésemre mert még mindig nem tudom hogy mettől meddig van a táblám.”


Hat, lehet feleslegesen irok, mert ugy tunik nincs elolvasva

Tehat megegyszer, a CBLOCK az konstansokat csinal neked. Magyaran nem is kell kideritened a cimet, mert egy konstansod van, amit cim-kent hasznalsz. Ezt a konstanst nevezed valtozo cimkenek. Tehat MOVLW valtozo, MOVLW high(valyozo) stb mukodnek!

Ahogy Watt mar irta, csak moge teszel egy "cimket", egy masik konstanst magyaran, es utana mar egy egyszeru kivonassal megallapithatod a cimet... Vagy ahogy javasoltam (bar biztosan az sem lett elolvasva) define-nal hatarozod me a tomb meretet es akkor nem kerdeses a dolog.
Következő: »»   717 / 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