Jak na MPASM ?(dlouhe)

jiri@bezstarosti.cz jiri
Středa Březen 17 12:10:02 CET 2004


K tomu kusu kodu. Radeji zesiroka.

Jde o to, ze u PICu je dukladne oddelena pamet
programu a pamet dat. Tim padem je jedina
moznost jak presunout treba retezec z pameti
programu do pameti dat (nebo treba do displaye)
jedine instrukci s hodnotou.

Jasne ze to jde treba:

movlw 0x41		;W=0x41
movwf promenna	;promenna=W

cimz se naplni pametove misto "promenna". Jenze
to zere 2 adresy programu. Pokud se to v programu
deje jen malo, muze to i takhle byt kratsi.
Pokud je tam takovych tabulek hodne, pak se udela
zhruba tohle:

	;tabulka prevodu
	org	0x100
tab_b	addwf	PCL,F		;jump to W+PCL
	retlw	0x22
	retlw	0x33
	retlw	0x44
	retlw	0x88
	retlw	0x17
	;...a dalsi

Takze naplnime necim W:

movlw 0x2	;napriklad

a zavolame si

call tab_b
;sem se to vrati s naplnenym W

jen pozor kam se ta tabulka da, PCL ma jen 8 bit,
tedy aby nepretekl. Skoci to proste o W prictenim
W do PCL, tedy dat tabulku na adresu, aby PCL
nepreteklo prictenim i nejvyssi hodnoty W ...

No a je to jasne, do PCL se pricte hodnota vlozena
do W registru pred volanim CALL a vrati se nam pomoci
RETLW ve W hodnota, ktera odpovida pozici v tabulce
podle W.

Mozna trochu zrychla, ale snad to je k pochopeni.

Na makroinstrukce kaslat, pak clovek tezko pocita doby
trvani instrukci a ma v tom zmatky (ja vim, zase
ty moje hloupe nazory) :-))))))).
Tedy nepouzivam je a pokud by byl zajem o zdrojak
k PIC16F873 pro 4bit LCD, pak klidne poskytnu,
je pro PIC16F876 pouzitelny beze zmeny.
Kdyz uz jsem to jednou napsal .... :-)

Jo a bacha na strankovani pri volani podprogramu a pri
skocich, to je vopravdu u PICu pekna ... no nehezkost,
ale je to proste tak, pak se clovek divi, kam to skace
kdyz zapomel naplnit spravne bity stranek pred skokem.
(Ja vim, o tom dotaz nebyl, ale muze to byt pricina
nefunkcnosti.)

Kdybych mel nekde chybu atd., tak mne prosim take
nekamenujte, tento text neprochazel kompilatorem :-))).

--
Jiri Bezstarosti

-----Original Message-----
From: Sanek, Martin HCZ [mailto:martin.sanek@cz.heidelberg.com]
Sent: Tuesday, August 28, 2001 3:28 PM
To: Konference
Subject: Jak na MPASM ?(dlouhe)


Dobry den vsem na konferenci.
Predem se omlouvam za ponekud "natvrdly" dotaz.
Pouzivam MPLAB ver.5.31... a delam komunikaci mezi LCD a PIC16F876.
No a tak jsem si k tomu otevrel tu hromadu mejlu ( co jsem tady
inicioval par mesicu zpatky )
a zacal tvorit. Nebojte se, nebudu Vas tu vsechny otravovat stokrat
omilanym postupem.
Jde me o pseudo instrukce, ktere generuje MPASM.
Konkretne o instrukci DT. Dam jako priklad kus strojaku, ktery poslal p
Sladky

;Strings
                    addlw    0-STRING
                   addwf    pcl, F
STRING    dt         "AHOJ SVETE!", 0

No chapu, ze to je kus podprogramu, ktery ma generovat neco jako RETLW ,
kde v promenne je
to, co je mezi zavorkami.
Pokousel jsem se prijit na to, proc je tam

addlw 0-STRING

no a jedine na co jsem prisel je, ze by to potom melo skakat na dalsi
podprogram STRING.
Jenze me to tak nefunguje. Skace to "kam chce" (presneji na radek dany
nejakou konstantou me
neznameho puvodu)
Dalsi co mi vrta hlavou, proc je tam ta sequence 0-STRING?
Pan Sladky mi to posleze popisoval
.....Tuto pozici pak inkrementuji tak dlouho, dokud nenajdu hodnotu 0
(tzv. ASCIIZ retezec - pouziva se v C jazyku).
No dobre, ale co s tim?

Nekamenujte mne prosim, vim ze se ptam hodne spatne. Skoncil jsem s tim
dneska rano ve 2.30
a ocividne mi to nezapalilo. Koukal jsem se do helpu pro MPASM, ale tam
jsou popsany jenom
macroinstrukce, ale ne moznosti pouziti(a uz vubec ne takovehle.) Mozna
to jenom vidim moc
slozite a nebo to slozite delam.

Dekuju vsem za pripadne rady

Martin






Další informace o konferenci Hw-list