• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::


Browsing this Thread:   1 Anonymous Users




« 1 2 3 (4)


Re: 使用PIC16F946遇到pagesel問題跟timer1外接32768Hz震盪器問題
#7
版主
版主


查看用戶資訊
試試看,找出程式的 CALL & GOTO 指令,在該指令前通通加上 PAGESEL nnn 的PAGE 設定指令。

例如你的中斷裡的部份程式:
banksel PIR1
btfsc PIR1,TMR1IF
call Timer1Int
建議改成:
pagesel    Timer1Int    加入此 PAGE 切換
    banksel PIR1
    btfsc     PIR1
,TMRIF
    call    Timer1Int
;
         
banksel tempStatus;select bank0
        swapf   tempPCLATH
,w
        movwf   PCLATH
        swapf   tempStatus
,w
        movwf   STATUS
        swapf   tempW
,f
        swapf   tempW
,w
 
        retfie

發表於: 2009/11/24 14:35
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 使用PIC16F946遇到pagesel問題跟timer1外接32768Hz震盪器問題
#6
資深會員
資深會員


查看用戶資訊
ISR
        banksel tempW
;select bank0  <--- 已更動 主程式的BANK
        movwf   tempW
        swapf   STATUS
,w
        movwf   tempStatus
        swapf   PCLATH
,w



將相關的暫存器 放在 0x70 ~ 0x7F
不需要切換 BANK


版主提供的 範例

MOVWF    W_TEMP           save off current W register contents
    MOVF     STATUS
,W         move status register into W register
    MOVWF    STATUS_TEMP      
save off contents of STATUS register
    MOVF     PCLATH
,W         move pclath register into w register
    MOVWF    PCLATH_TEMP      
save off contents of PCLATH register

;------------------------------------------------------------------------------
USER INTERRUPT SERVICE ROUTINE GOES HERE
;------------------------------------------------------------------------------

    ; 
Interrupt context restoring
    MOVF    PCLATH_TEMP
,W     retrieve copy of PCLATH register
    MOVWF   PCLATH            
restore pre-isr PCLATH register contents
    MOVF    STATUS_TEMP
,W     retrieve copy of STATUS register
    MOVWF   STATUS            
restore pre-isr STATUS register contents
    SWAPF   W_TEMP
,F
    SWAPF   W_TEMP
,W          restore pre-isr W register contents
    RETFIE                    
; return from interrupt

發表於: 2009/11/24 14:35
少年不知愁滋味,老來方知路難行。
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 使用PIC16F946遇到pagesel問題跟timer1外接32768Hz震盪器問題
#5
初級會員
初級會員


查看用戶資訊
謝謝Ryang板主的回覆
早上我有在中斷副程式加入儲存PCLATH的動作
不過結果還是一樣
我是這樣寫的
ISR
        banksel tempW
;select bank0
        movwf   tempW
        swapf   STATUS
,w
        movwf   tempStatus
        swapf   PCLATH
,w
        movwf   tempPCLATH

        banksel PIR1
        btfsc   PIR1
,TMR1IF
        call    Timer1Int

        banksel tempStatus
;select bank0
        swapf   tempPCLATH
,w
        movwf   PCLATH
        swapf   tempStatus
,w
        movwf   STATUS
        swapf   tempW
,f
        swapf   tempW
,w
 
        retfie


我有試著把程式縮短,例如將一些比較不重要沒用到的部份註解掉,
結果時間顯示從 00:00 動兩下,就不動了
但程式還活著,應我有在無窮迴圈加入LED的亮滅控制,只要看LED就知道主程式部份是否還在執行,

如果將程式縮到1個page以內,例如縮到page0(0005h~07ffh)以內,
時間顯示從 00:00 ~23:59 一直循環都很正常,
只要把時間顯示的程式碼移到page1(0800h~0fffh)就會出現0顯示完馬上變為8,1~9 也一樣的情形

感覺好像是程式記憶體亂掉

趕快來去看範例程式
一有結果再PO上來跟大家分享一下

再次謝謝shpehg及Ryang板主的回覆

發表於: 2009/11/24 13:46
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 使用PIC16F946遇到pagesel問題跟timer1外接32768Hz震盪器問題
#4
版主
版主


查看用戶資訊
參考一下Microchip 所提供的套用檔案 : C:\Program Files\Microchip\MPASM Suite\Template\Code\16F946TEMP.asm
注意一下有關中斷的背景儲存部份(底下紅色部份),請參考底下方撰寫,因為 Zero Flag 會受 movf 的指令引響所以需用 SWAP 的指令交會儲存。

程式超過 2kW 以上有要切換 Page 時,最好在程式裡的每個 GOTO 及 CALL 指令前直接加上PAGESEL 的指令。這樣每次呼叫都可以正確的取得 Page 資料這樣就不會跳錯 Page。還有 Return 回去時原則上是不要管PCLATH 的。

list        p=16f946      ; list directive to define processor
    
#include    <p16f946.inc> ; processor specific variable definitions

;------------------------------------------------------------------------------
;
CONFIGURATION WORD SETUP
;
The 'CONFIG' directive is used to embed the configuration word within the 
; .asm fileThe lables following the directive are located in the respective 
; .inc file.  See the data sheet for additional information on configuration 
word settings.
;
;------------------------------------------------------------------------------    
    
    
__CONFIG _FCMEN_ON _IESO_ON _CP_OFF _WDT_OFF _BOD_OFF _MCLRE_ON _PWRTE_ON _INTRC_OSC_NOCLKOUT

;------------------------------------------------------------------------------
VARIABLE DEFINITIONS
;
Available Data Memory divided into Bank 0,1,2, and 3.  Each Bank contains 
Special Function RegistersGeneral Purpose Registers, and Access RAM 
;
;------------------------------------------------------------------------------

    
CBLOCK 0x20 Define GPR variable register locations
        MYVAR1  
User variables allocated contiguously
        MYVAR2  

        
MYVAR3  
    
ENDC

W_TEMP         EQU    0x7D        
w register for context saving (ACCESS)
STATUS_TEMP    EQU    0x7E        status used for context saving (ACCESS)
PCLATH_TEMP    EQU    0x7F        context saving of PC (ACCESS

;------------------------------------------------------------------------------
EEPROM INITIALIZATION
;
The 16F946 has 256 bytes of non-volatile EEPROMstarting at address 0x2100

;------------------------------------------------------------------------------

DATAEE    ORG  0x2100
    DE    
"MCHP"  Place 'M' 'C' 'H' 'P' at address 0,1,2,3

;------------------------------------------------------------------------------
RESET VECTOR
;------------------------------------------------------------------------------

    
ORG     0x0000            processor reset vector
    PAGESEL START
    
GOTO    START             When using debug headerfirst inst.
                              ; 
may be passed over by ICD2.  
[
color=ff0000]
;------------------------------------------------------------------------------
INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------

    
ORG      0x0004
    
Interrupt context saving
    MOVWF    W_TEMP           
save off current W register contents
    MOVF     STATUS
,W         move status register into W register
    MOVWF    STATUS_TEMP      
save off contents of STATUS register
    MOVF     PCLATH
,W         move pclath register into w register
    MOVWF    PCLATH_TEMP      
save off contents of PCLATH register

;------------------------------------------------------------------------------
USER INTERRUPT SERVICE ROUTINE GOES HERE
;------------------------------------------------------------------------------

    ; 
Interrupt context restoring
    MOVF    PCLATH_TEMP
,W     retrieve copy of PCLATH register
    MOVWF   PCLATH            
restore pre-isr PCLATH register contents
    MOVF    STATUS_TEMP
,W     retrieve copy of STATUS register
    MOVWF   STATUS            
restore pre-isr STATUS register contents
    SWAPF   W_TEMP
,F
    SWAPF   W_TEMP
,W          restore pre-isr W register contents
    RETFIE                    
; return from interrupt [/color]
    
;------------------------------------------------------------------------------
MAIN PROGRAM
;------------------------------------------------------------------------------

START

;------------------------------------------------------------------------------
PLACE USER PROGRAM HERE
;------------------------------------------------------------------------------

    GOTO $

    
END

發表於: 2009/11/24 11:03
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 使用PIC16F946遇到pagesel問題跟timer1外接32768Hz震盪器問題
#3
初級會員
初級會員


查看用戶資訊
謝謝shpehg的回覆

中斷副程式中我沒有存到PCLATH,
等一下改來試試

從板子上拆下來的震盪器都有問題
我再來去買一些新的試試看
有結果再PO上來跟大家分享一下

發表於: 2009/11/24 8:30
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 使用PIC16F946遇到pagesel問題跟timer1外接32768Hz震盪器問題
#2
資深會員
資深會員


查看用戶資訊
1.
錯誤方法
ORG 0x0004
  
GOTO XXXX  

XXXX
  PushAll
   
.
   .
  
PopAll
 retfie


建議
ORG 0x0004
  PushAll  
<--需存PCLATH
  lgoto XXXX
XXXX_ret
  PopAll
 retfie


2.
震盪超過 1.6V 才會正常

發表於: 2009/11/24 7:59

Edited by shpeng on 2009年11月24日 08:14:40
Edited by shpeng on 2009年11月24日 08:15:26
少年不知愁滋味,老來方知路難行。
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


使用PIC16F946遇到pagesel問題跟timer1外接32768Hz震盪器問題
#1
初級會員
初級會員


查看用戶資訊
目前使用PIC16F946再開發產品遇到了一些問題,提出來請大家指點一下,
Configuration設定為:
Oscillator               
-> INTOSCIO
Watchdog Timer           
-> Off
Power Up Timer           
-> Off
MCLR Pin 
Function Select -> Normal Function
Code Protect             -> Off
Data EE Read Protect     
-> Off
Brown Out Detect         
-> BOD EnableSBODEN Disable
Internal
-External Switch Over -> Enable
Fail Clock Monitor Enable 
-> Enable

系統時脈使用8MHz內部震盪器
中斷只使用Timer1中斷
外接32768Hz石英震盪器給Timer1當時鐘計時使用
有使用LCD顯示時間跟一些ICON

目前遇到2個問題:
1. 程式記憶體會使用超過page0
(0000h~07ffh)的空間而進入
    page1
(0800h~0fffh)的空間,
    剛開始沒注意到程式已超過page0,編譯完後燒到MCU後,
    MCU無法動作, 
:-( 

    
後來找了很多資料來看,就將部份程式段移往page1,
    在使用該程式段時就加入pagesel指令,
    例如:pagesel xxx
          call    xxx  
or goto xxx
    此時只在使用到該程式段之前加入pagesel,如上所示,
    呼叫或跳躍到該程式段返回後,並沒將page切回page0,
    此時將程式編譯完後燒到MCU後,MCU一開始動了一下子,
    就又沒動作了, 
:-? 

    
現在改為在使用到該程式段之前加入pagesel,
    程式返回後,馬上把page切回來,如下所示:
    其它指令                         
;       page0(0000h~07ffh)
    
pagesel xxx                      ;select page1(0800h~0fffh)
    
call    xxx or goto xxx          ;       page1(0800h~0fffh)
    
pagesel yyy                      ;select page0(0000h~07ffh)
    
繼續其它動作                     ;       page0(0000h~07ffh)
    
這樣將程式編譯完後燒到MCU後,MCU可以動作了,
    但使用到位於page1
(0800h~0fffh)的程式碼後,
    動作變的不正確, 
:-? 
    
例如我將LCD上顯示數字的程式段放在
    page1
(0800h~0fffh)
    但計時的程式段仍在page0
(0000h~07ffh)
    從計時的程式段裏去call顯示數字的程式段,
    此時顯示結果為0顯示完馬上變為8,接下來顯示1,
    1顯示完也馬上變為8,2
~9也都一樣,一顯示完就變為8,
    我所有的變數全部定義在bank0 21h
~64h,用equ定義,
    是否需要將放在page1
(0800h~0fffh)的程式段,
    會使用到的變數給放到bank1? 
:-? 

2. MCU 每次 power off 再 power on ,程式已開始動作,
    但時鐘的顯示都會停在 00
:00 約一分鐘才會開始動作,
    時鐘顯示正常動作後,用 reset 腳 reset MCU ,
    此時時鐘顯示可正常動作,但如power off 再 power on ,
    時鐘的顯示又會停在 00
:00 約一分鐘才會開始動作,
    我有量測32768Hz石英震盪器的訊號,有32.76KHz
    但只在 1V 之內震盪,是不是要再 5V 內震盪才算正常?
    還是有其他設定需要注意?


以上兩點問題請大家指導一下,謝謝

發表於: 2009/11/23 11:10

Edited by r620 on 2009年11月23日 13:36:52
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------