Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Hogyan lehet az ORG-nál 160 bájtot lefoglalni egy táblához?
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..):
Ram -beli (ezeket az indf1, portinc0, predec2 stb..-vel lehet elérni):
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...
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?
É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?
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:
A rom -belinél egy sorban több adat is megadható:
Figyelem, ha páratlan számú byte-ot adunk meg, a fordító kiegészíti párosra.... 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ó:
Akkor ha így foglalok 160 bájtot:
Akkor ehhez nem tudok a TBLRD és TBLWT utasításokkal hozzáférni?
Szia!
A program / config EEPROM kezelhető a tblrd és tblwr utasításokkal, nem az adat EEPROM... A két lapos RamTab kezelése:
Szia!
Sajnos a példát rosszul írtam az előző hozzászólásban:
Bocsánat...
Talán az oldalamon is van példa, ha egyre gondolunk.
A fényfüggönyben is és az egyik példaprogiban... Idézet: 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.„És ha én két bájtos számokat szeretnék tárolni, akkor ezt hogyan szokás kezelni?”
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:
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
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:
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? 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:
vagyis meg kell mondani, hogy melyik FSRx regiszterpárba, és hogy milyen címet töltsön be. Természetesen lehet egyenként is:
(azért sem írtam 0x100-at! ) 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...
Jó lesz ez így?
Idézet: „Akkor ha így foglalok 160 bájtot:
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.
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). Idézet: 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é! „Jó lesz ez így?”
Így lesz, köszönöm! De akkor honnan tudom hogy mettől meddig tart a táblám?
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?
Most nemazért, de jobban figyelhetnél, mert icserny ezt írta le nem sokkal ezelőtt: Link
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.
Szia!
Ha a végéről szeretnél indulni, akkor csak annyit kell tenned, hogy az
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...
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!
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. Idézet: 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 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” 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! )
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!)
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.
Szia!
Oké, ezt azért értem. Az előbb elírtam, a PREDECx az amit hiányoltam. 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. |
Bejelentkezés
Hirdetés |