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