RE: Stránkování u PIC 16F676

Miroslav Draxal evik na volny.cz
Sobota Leden 12 14:44:51 CET 2013


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

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20130112/c4d7969d/attachment-0001.htm>


Další informace o konferenci Hw-list