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