RE: Stránkování u PIC 16F676
Kručinský Ladislav
ladislav.krucinsky na linde-mh.cz
Sobota Leden 12 15:31:40 CET 2013
Jestli to chápu dobře tak to jsou udělátka do kompilátoru assembleru které to hlídají za vás ?
Zdravím
Kručinský
From: hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Miroslav Draxal
Sent: Saturday, January 12, 2013 2:45 PM
To: 'HW-news'
Subject: RE: Stránkování u PIC 16F676
Kdysi, asi 13 let zpět jsem používal toto. Dneska si říkám, kde se to ve mně vzalo? Do 16f876 jsem v asm nacpal to, co se mi v C nepovedlo převést do 32kB pice.
Pro tabulky
Set_Tim_Real_Up Sel_Page_Tab ; nastavení stránky paměti tabulky
movf Mode_Dislp_Set,w ; co se nastavuje v času
addwf PCL,f
retlw d'0' ; nic se nenastavuje
goto Key_Set_Time_Up ; nastavuje + time ( hodiny.asm )
goto Key_Set_Den_Up ; nastavuje + den v týdnu ( hodiny.asm )
goto Key_Set_Date_Up ; nastavuje + datum ( hodiny.asm )
goto Key_Set_Rok_Up ; nastavuje + rok ( hodiny.asm )
FlowPage_Tab Set_Tim_Real_Up ; Nepřetekla tabulka do další stránky
Tady jsou makra
;-----------------------------------------------
; nastavení ukazovátka na tabulku
; nemusi zůstat zachovano W
Sel_Page_Tab macro
Sel_Page_TabAdresa set $
if high $ == d'0'
clrf PCLATH
else
movlw high $
movwf PCLATH
endif ; nastavení stránky paměti tabulky
endm
;-----------------------------------------------
; Nepřetekla tabulka do další stránky
FlowPage_Tab macro Name
ifndef Sel_Page_TabAdresa
error" Tabulka není uložena makrem Sel_Page_Tab "
exitm
else
if Sel_Page_TabAdresa == $
error " FlowPage_Tab "Name" není platná tabulka "
endif
if high Name < high $
error " Tabulka "Name" přetekla do další stránky, prosím proveďte korekci "
endif
if Name >= $
error " FlowPage_Tab "Name" se odkazuje na následujíci tabulku. Nepřípustné"
endif
if Name != Sel_Page_TabAdresa
messg " FlowPage_Tab "Name" se odkazuje na jinou tabulku"
endif
endif
endm
;-----------------------------------------------
Nebo takhle, ve W je parametr pro skok do tabulky
; Tabulka pro převod číselné hodnoty na stringovou promennou
Den_Tydnu_1 Uloz_Tabulku ; zachovej obsah W
addwf PCL,f ; prezrntuje převod čísla na string
retlw Set_N ; zobrazí n
retlw Set_P ; zobrazí P
retlw Set_U ; zobrazí U
retlw Set_S ; zobrazí S
retlw Set_Č ; zobrazí č
retlw Set_P ; zobrazí P
retlw Set_S ; zobrazí S
FlowPage_Tab Den_Tydnu_1 ; Nepřetekla tabulka do další stránky
;*********************************************************************************************************************
Makro
; W musí zůstat zachováno
Uloz_Tabulku macro
Sel_Page_TabAdresa set $
if high $ == 0x00
clrf PCLATH
endif
if high $ == 0x01
clrf PCLATH
bsf PCLATH,0
endif
if high $ == 0x02
clrf PCLATH
bsf PCLATH,1
endif
if high $ == 0x03
clrf PCLATH
bsf PCLATH,0
bsf PCLATH,1
endif
if high $ == 0x04
clrf PCLATH
bsf PCLATH,2
endif
if high $ == 0x05
clrf PCLATH
bsf PCLATH,0
bsf PCLATH,2
endif
if high $ == 0x06
clrf PCLATH
bsf PCLATH,1
bsf PCLATH,2
endif
if high $ == 0x07
clrf PCLATH
bsf PCLATH,0
bsf PCLATH,1
bsf PCLATH,2
endif
if high $ == 0x08
clrf PCLATH
bsf PCLATH,3
endif
if high $ == 0x09
clrf PCLATH
bsf PCLATH,3
bsf PCLATH,0
endif
if high $ == 0x0a
clrf PCLATH
bsf PCLATH,3
bsf PCLATH,1
endif
if high $ == 0x0b
clrf PCLATH
bsf PCLATH,3
bsf PCLATH,1
bsf PCLATH,0
endif
if high $ == 0x0c
clrf PCLATH
bsf PCLATH,3
bsf PCLATH,2
endif
if high $ == 0x0d
clrf PCLATH
bsf PCLATH,3
bsf PCLATH,2
bsf PCLATH,0
endif
if high $ == 0x0e
clrf PCLATH
bsf PCLATH,3
bsf PCLATH,2
bsf PCLATH,1
endif
if high $ == 0x0f
clrf PCLATH
bsf PCLATH,3
bsf PCLATH,2
bsf PCLATH,1
bsf PCLATH,0
endif
if high $ == 0x10
clrf PCLATH
bsf PCLATH,4
endif
if high $ == 0x11
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,0
endif
if high $ == 0x12
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,1
endif
if high $ == 0x13
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,1
bsf PCLATH,0
endif
if high $ == 0x14
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,2
endif
if high $ == 0x15
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,2
bsf PCLATH,0
endif
if high $ == 0x16
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,2
bsf PCLATH,1
endif
if high $ == 0x17
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,2
bsf PCLATH,1
bsf PCLATH,0
endif
if high $ == 0x18
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,3
endif
if high $ == 0x19
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,3
bsf PCLATH,0
endif
if high $ == 0x1a
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,3
bsf PCLATH,1
endif
if high $ == 0x1b
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,3
bsf PCLATH,1
bsf PCLATH,0
endif
if high $ == 0x1c
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,3
bsf PCLATH,2
endif
if high $ == 0x1d
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,3
bsf PCLATH,2
bsf PCLATH,0
endif
if high $ == 0x1e
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,3
bsf PCLATH,2
bsf PCLATH,1
endif
if high $ == 0x1e
clrf PCLATH
bsf PCLATH,4
bsf PCLATH,3
bsf PCLATH,2
bsf PCLATH,1
bsf PCLATH,0
endif
endm
;-----------------------------------------------
Pro dlouhé skoky jsem používal tohle
; pro zjištění správné stránky při skoku
jmp macro Navesti ; kam bude skákat, pro zjištění adresy skoku
pagesel Navesti ; jde o skok do 2 stranky
errorlevel -306
goto Navesti
errorlevel +306
if high $ <= 0x07
if high Navesti <= 0x07 ; jde o skok z 1 stranky
messg " Není nutné JMP " Navesti ", zaměňte za GOTO" ; jde o skok do 1 stranky
endif
endif
if high $ >= 0x08 & high $ <=0x0f
if high Navesti >= 0x08 & high Navesti <=0x0f ; jde o skok z 2 stranky
messg " Není nutné JMP " Navesti ", zaměňte za GOTO" ; jde o skok do 2 starnky
endif
endif
if high $ >= 0x10 & high $ <=0x18
if high Navesti >= 0x10 & high Navesti <=0x18 ; jde o skok z 3 stranky
messg " Není nutné JMP " Navesti ", zaměňte za GOTO" ; jde o skok do 3 starnky
endif
endif
if high $ >= 0x19
if high Navesti >= 0x19 ; jde o skok z 4 stranky
messg " Není nutné JMP " Navesti ", zaměňte za GOTO" ; jde o skok do 4 starnky
endif
endif
endm
;---------------
No a pro nastavování bank ram pameti jsem mel toto. Tohle dokázalo docela šetřit paměť oproti bankál
;---------------
; Nastav RP0,RP1 s ohledem na předchozí nastavení RP0,RP1
banky0 macro
ifndef bankX_Stack_lib
error " Před banky0 neni zadáno bankX "
endif
if bankX_Stack_lib == 0
if MessgNevypisuj == 0
messg " Není potřeba zadávat banky0, před tim je zvolená banky0"
else
MessgNevypisuj set 0
endif
else
if bankX_Stack_lib == 1
bcf STATUS,RP0
else
if bankX_Stack_lib == 2
bcf STATUS,RP1
else
if bankX_Stack_lib == 3
bank0
endif
endif
endif
endif
errorlevel +302
bankX_Stack_lib set 0
endm
banky1 macro
ifndef bankX_Stack_lib
error " Před banky1 neni zadáno bankX "
endif
if bankX_Stack_lib == 0
bsf STATUS,RP0
else
if bankX_Stack_lib == 1
if MessgNevypisuj == 0
messg " Není potřeba zadávat banky1, před tim je zvolená banky1"
else
MessgNevypisuj set 0
endif
else
if bankX_Stack_lib == 2
bank1
else
if bankX_Stack_lib == 3
bcf STATUS,RP1
endif
endif
endif
endif
errorlevel -302
bankX_Stack_lib set 1
endm
banky2 macro
ifndef bankX_Stack_lib
error " Před banky2 neni zadáno bankX "
endif
if bankX_Stack_lib == 0
bsf STATUS,RP1
else
if bankX_Stack_lib == 1
bank2
else
if bankX_Stack_lib == 2
if MessgNevypisuj == 0
messg " Není potřeba zadávat banky2, před tim je zvolená banky2"
else
MessgNevypisuj set 0
endif
else
if bankX_Stack_lib == 3
bcf STATUS,RP0
endif
endif
endif
endif
errorlevel -302
bankX_Stack_lib set 2
endm
banky3 macro
ifndef bankX_Stack_lib
messg " Před banky3 neni zadáno bankX "
endif
if bankX_Stack_lib == 0
bank3
else
if bankX_Stack_lib == 1
bsf STATUS,RP1
else
if bankX_Stack_lib == 2
bsf STATUS,RP0
else
if bankX_Stack_lib == 3
if MessgNevypisuj == 0
messg " Není potřeba zadávat banky3, před tim je zvolená banky3"
else
MessgNevypisuj set 0
endif
endif
endif
endif
endif
errorlevel -302
bankX_Stack_lib set 3
endm
;---------------
From: hw-list-bounces na list.hw.cz<mailto:hw-list-bounces na list.hw.cz> [mailto:hw-list-bounces na list.hw.cz] On Behalf Of j s
Sent: Saturday, January 12, 2013 2:08 PM
To: HW-news
Subject: Re: Stránkování u PIC 16F676
Mozno mam iny system prace, ale nastudovanie DS nie je pre mna nijako kriticke.
Datasheety v ramci jednej rodiny su na 99% robene copy-paste systemom.
Periferie rovnake, rozdiely su iba v elektrickych parametroch (na
konci) a v prvych strankach, kde su rozpisane obvody v tom-ktorom
datsheete. Stred je ten isty :-) Preto boli u vyssich rad PICiek
zavedene referencne manualy - v nich je vsetko pre rodinu MCU a
datasheet pre konkretny MCU obsahuje iba odkazy na referencny manual,
plus elektricke specifikacie.
Okrem toho, periferie u PIC16F1xxx su robene tak, aby boli co
najpodobnejsie (takmer identicke) s novsimi PIC18.
J.
2013/1/12 Admin HWnews <hwnews na cncnet.info<mailto:hwnews na cncnet.info>>:
> No proto je (aspon pro me subjektivne) lepsi se dobre naucit par typu, ktere
> pokryvaji ruzny rozsah I/O a vykonu a ty pouzivat jak je treba.
>
> Protoze pro me je opravdu nejvetsi investici na prechod na novy MCU prave
> nastudovani DS - a to jsem az na nektere kusy kodu naprosto opustil ASM.
>
> Na vsechno co je treba mi staci PIC12F683, PIC16F876A a PIC18F4520 -
> maximalne se pohybuji v ramci techto rad.
>
> RV
>
> Dne 12.1.2013 13:47, Kručinský Ladislav napsal(a):
>
>> Děkuji moc za informace, pohled na to je samozřejmě pochopitelný od
>> Vás jako od profesionála ale já jsem si mezitím snažil prolízt jeden
>> datasheet a už ten počet stránek (484...) mně zarazil. Já jakožto
>> příležitostný bastlíř a ne-programátor jsem se naučil v potu tváře
>> programovat tu základní řadu, zatím jsem nenarazil na problém, který
>> bych s ní nepokryl. Třeba se dostanu k tomu, že sáhnu po té "enhanced
>> mid range". Děkuji za odkaz, jdu si ho prolistovat.
>>
>> Zdravím Kručinský
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz<http://www.HW.cz>
> Hw-list na list.hw.cz<mailto:Hw-list na list.hw.cz>
> http://list.hw.cz/mailman/listinfo/hw-list
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz<http://www.HW.cz>
Hw-list na list.hw.cz<mailto:Hw-list na list.hw.cz>
http://list.hw.cz/mailman/listinfo/hw-list
__________ Informace od ESET NOD32 Antivirus, verze databaze 7886 (20130112) __________
Tuto zpravu proveril ESET NOD32 Antivirus.
http://www.eset.cz
__________ Informace od ESET NOD32 Antivirus, verze databaze 7886 (20130112) __________
Tuto zpravu proveril ESET NOD32 Antivirus.
http://www.eset.cz
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20130112/85f84fe9/attachment-0001.htm>
Další informace o konferenci Hw-list