RE: Stránkování u PIC 16F676
Miroslav Draxal
evik na volny.cz
Sobota Leden 12 16:04:14 CET 2013
Ano, je to tak. Případný problém nahlásí. Malá příloha jako inspirace. Třeba
pomůže. ale musíte používat starší překladač, v novém to nechodí mpasm5.11
tam to chodí, nebo zjistit proč. Já to nezjišťoval. Je to do doby, co je
možno změnit na absolute či relocable code. Měla by to být volby absolute,
ale s novým to nechodí. Neřešil jsem to, staré projekty, pokud potřebuji
něco dodělat, tak mam schovaný starý překladač. Míra
From: hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] On
Behalf Of Kručinský Ladislav
Sent: Saturday, January 12, 2013 3:32 PM
To: HW-news
Subject: RE: Stránkování u PIC 16F676
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] 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>:
> 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
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
_______________________________________________
HW-list mailing list - sponsored by www.HW.cz
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
__________ 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/85f45d8d/attachment-0001.htm>
------------- další část ---------------
A non-text attachment was scrubbed...
Name: 16f876ic.rar
Type: application/octet-stream
Size: 5595 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20130112/85f45d8d/attachment-0001.obj>
Další informace o konferenci Hw-list