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