• slider image 442
  • slider image 477
  • slider image 479
  • slider image 480
  • slider image 481
  • slider image 482
:::


Browsing this Thread:   1 Anonymous Users




« 1 (2) 3 4 »


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


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

我再從硬體方面來改看看,不過現在是用麵包板再做測試,接到 MCU 的線都很長,不知道是不是這樣造成的影響,
我再來測測看有結果在PO上來


原來 Beee 想抓板主的小辮辮

發表於: 2009/12/1 9:02
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


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


查看用戶資訊
參照:

shpeng 寫道:

-1
; MOVF STATUS,W ; move status register into W
執行後確實會影響 新STATUS 但不影響 執行前STATUS -> W
Ryang和Beee的程式 都沒有問題.

建議 FSR 順便存起來.


SHPENG 大, 謝謝指正,驗證過 你說的沒錯 , 自己再 -1

一直想抓 板大的小辮辮 ..... 看來我又失望了

R620:
     
1. 16F946 也算是 低耗電 MCU 那表示它的軀動力也比較小(省電)
如硬體沒作好的話,會造成不易起振

     2.可能是 POWER OFF 不夠久
(低耗電 大電容),

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


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


查看用戶資訊
參照:

Beee 寫道:
參照:

Ryang 寫道:

是的,沒有做 PAGE 的設定就跳到 ISR 去,ISR 的Page 跟你所目前所跑的程式萬一要是不同的 Page 呢! 那程式不就掛了。
為避免錯誤所以要先存中斷背景後再呼叫中斷處理...
ORG      0x0004
    
Interrupt context saving
    MOVWF    W_TEMP           
save off current W register contents[color=ff0000]
  ; 
MOVF     STATUS,W         move status register into W register
    SWAPF    STATUS 
W    ;   MOVF 會影響  ZERO 旗標[/color]
    
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

;------------------------------------------------------------------------------
[
color=ff0000]        PAGESEL        ISR
            call       ISR 
[/color]
;------------------------------------------------------------------------------

    ; 
Interrupt context restoring
    MOVF    PCLATH_TEMP
,W     retrieve copy of PCLATH register
    MOVWF   PCLATH            
restore pre-isr PCLATH register contents[color=ff0000]
 ;   
MOVF    STATUS_TEMP,W     retrieve copy of STATUS register
    SWAPF   STATUS_TEMP 
W  retrieve copy of STATUS register  [/color]
    
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



-1
; MOVF STATUS,W ; move status register into W
執行後確實會影響 新STATUS 但不影響 執行前STATUS -> W
Ryang和Beee的程式 都沒有問題.

建議 FSR 順便存起來.

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


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


查看用戶資訊
謝謝shpehg及Ryang板主及Beee的回覆
偷偷不用心一下被發現 其實是一直沒注意到 goto ISR這裏,一直把它當成 0x04h 真是嚴重失誤
還好shpehg及Ryang板主再次提醒,讓我注意到 0x04h≠goto ISR

目前程式改成這樣:
STARTUP CODE
        nop
;for ICD2 use
        goto    
Start

        CODE    04H
        banksel tempW
        movwf   tempW
        swapf   STATUS
,w
        movwf   tempStatus
        swapf   PCLATH
,w
        movwf   tempPCLATH
[b][color=CC0000]       pagesel ISR[/color][/b]
[
b][color=CC0000]       goto    ISR[/color][/b]
PROG1   CODE
Start
        pagesel Initial
        call    Initial
        pagesel LCDInitial
        call    LCDInitial
StartLoop
        主程式區段
        pagesel StartLoop
        
goto StartLoop
ISR
        中斷處理程式區段
        banksel tempStatus
        swapf   tempPCLATH
,w
        movwf   PCLATH
        swapf   tempStatus
,w
        movwf   STATUS
        swapf   tempW
,f
        swapf   tempW
,w
        retfie

PROG2   CODE
        LCD時間顯示副程式區段
        end


因為在 0x04h 加入好幾個指令,用 org 不知道要怎麼寫,
所以直接套用C:\Program Files\Microchip\MPASM Suite\LKR\16f946.lkr 這個檔案來修改
紅色部分是我修改的部份,中斷一發生,程式就跳到 0x04h,開始執行放在這裡的指令,banksel 和 pagesel 各佔 2 個記憶體位址,
所以從 0x04h 的 banksel tempW 指令到 goto ISR 指令,共用了 10 個記憶體位址,所以紅色部分我修改為 0x0D
由於從 0x04h~0x0Dh 用掉了 page0(0005h~07ffh) 共 9 個記憶體位址,所以紅色部分我修改為 0x0E,程式段由 0x0E 開始,
以上如有說錯還請指正,謝謝 ,因為對.lkr檔還不是很清楚 ,這是第一次接觸到.lkr檔
// Sample linker command file for 16F946


LIBPATH  .

CODEPAGE   NAME=vectors  START=0x0      END=[b][color=CC0000]0x0D[/color][/b]      PROTECTED
CODEPAGE   NAME=page0    START=[b][color=CC0000]0x0E[/color][/b]      END=0x7FF
CODEPAGE   NAME
=page1    START=0x800    END=0xFFF
CODEPAGE   NAME
=page2    START=0x1000   END=0x17FF
CODEPAGE   NAME
=page3    START=0x1800   END=0x1FFF
CODEPAGE   NAME
=.idlocs  START=0x2000   END=0x2003   PROTECTED
CODEPAGE   NAME=.config  START=0x2007   END=0x2007   PROTECTED
CODEPAGE   NAME=eedata   START=0x2100   END=0x21FF   PROTECTED

DATABANK   NAME=sfr0     START=0x0      END=0x1F     PROTECTED
DATABANK   NAME=sfr1     START=0x80     END=0x9F     PROTECTED
DATABANK   NAME=sfr2     START=0x100    END=0x11F    PROTECTED
DATABANK   NAME=sfr3     START=0x180    END=0x19F    PROTECTED

DATABANK   NAME=gpr0     START=0x20     END=0x6F
DATABANK   NAME
=gpr1     START=0xA0     END=0xEF
DATABANK   NAME
=gpr2     START=0x120    END=0x16F
DATABANK   NAME
=gpr3     START=0x1A0    END=0x1EF

SHAREBANK  NAME
=gprnobnk START=0x70     END=0x7F
SHAREBANK  NAME
=gprnobnk START=0xF0     END=0xFF
SHAREBANK  NAME
=gprnobnk START=0x170    END=0x17F
SHAREBANK  NAME
=gprnobnk START=0x1F0    END=0x1FF

SECTION    NAME
=STARTUP  ROM=vectors    // Reset and interrupt vectors
SECTION    NAME=PROG1    ROM=page0      // ROM code space - page0
SECTION    NAME=PROG2    ROM=page1      // ROM code space - page1
SECTION    NAME=PROG3    ROM=page2      // ROM code space - page2
SECTION    NAME=PROG4    ROM=page3      // ROM code space - page3
SECTION    NAME=IDLOCS   ROM=.idlocs    // ID locations
SECTION    NAME=DEEPROM  ROM=eedata     // Data EEPROM


以上提供給大家參考一下,pagesel 的問題解決了

不過還有2個問題
問題1MCU 每次 power off 再 power on ,程式已開始動作,
       但時鐘的顯示都會停在 00
:00 約一分鐘才會開始動作,
       時鐘顯示正常動作後,用 reset 腳 reset MCU ,
       此時時鐘顯示可正常動作,但如power off 再 power on ,
       時鐘的顯示又會停在 00
:00 約一分鐘才會開始動作,
       這跟暫存器設定有關係嗎?


問題2
就是EEPROM的問題,我的程式目前設定程式一開始執行時,會從EEPROM讀出資料顯示在 LCD 上,
       如果是 power off 等一小段時間再 power on ,此時 LCD 上顯示的是程式預設要顯示的資料,而非從EEPROM讀出的資料?
       如果是用 MCLR reset 腳 reset ,此時 LCD 顯示的是從EEPROM讀出的資料
       試了好幾次都這樣不知道是哪裡出問題?



以上再請大家指點一下,謝謝

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


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


查看用戶資訊
參照:

Ryang 寫道:

是的,沒有做 PAGE 的設定就跳到 ISR 去,ISR 的Page 跟你所目前所跑的程式萬一要是不同的 Page 呢! 那程式不就掛了。
為避免錯誤所以要先存中斷背景後再呼叫中斷處理...
ORG      0x0004
    
Interrupt context saving
    MOVWF    W_TEMP           
save off current W register contents[color=ff0000]
  ; 
MOVF     STATUS,W         move status register into W register
    SWAPF    STATUS 
W    ;   MOVF 會影響  ZERO 旗標[/color]
    
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

;------------------------------------------------------------------------------
[
color=ff0000]        PAGESEL        ISR
            call       ISR 
[/color]
;------------------------------------------------------------------------------

    ; 
Interrupt context restoring
    MOVF    PCLATH_TEMP
,W     retrieve copy of PCLATH register
    MOVWF   PCLATH            
restore pre-isr PCLATH register contents[color=ff0000]
 ;   
MOVF    STATUS_TEMP,W     retrieve copy of STATUS register
    SWAPF   STATUS_TEMP 
W  retrieve copy of STATUS register  [/color]
    
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/27 18:08
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


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


查看用戶資訊
參照:

r620 寫道:
謝謝Ryang板主的回覆
org     00h
        nop
;for ICD2 use
        goto    
Start

        org     04h
        
goto    ISR

        org 0x0100
Start
        pagesel    Initial
        call    Initial <- 變數給定初始值,暫存器設定
        pagesel     LCDInitial
        call    LCDInitial
StartLoop
        主程式區段
        
:
        :
        
pagesel    Startloop
        
goto StartLoop
ISR
        中斷處理程式區段
        retfie

        org 0xnnnn
        LCD時間顯示副程式區段
        end


我的程式流程是一開始從 00h 進入就跳到 Start 開始變數給定初始值,暫存器設定,完成後才開始作其他的動作,
Ryang板主說的 Cold Start or Warm Start 指的是這個嗎?


剛用 ICD2 debugger 在看 PCLATH 的值,結果有看到 1F ?我只用到page1(0800h~0fffh),應該不會跑到page3(1800h~1fffh)才對

我再來看一下,有結果再PO上來跟大家討論一下

以上再請大家指點一下,謝謝


修改了一下,在call & goto 之前都加了pagesel
還有 ORG 定址與 CODE 怎會混著用呢! 都改成 ORG 吧。

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


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


查看用戶資訊
參照:

shpeng 寫道:
org     00h
        nop
;for ICD2 use
        goto    
Start

        org     04h
        
goto    ISR   <------BUG,講過了,真不用心.
PROG1   CODE
Start


是的,沒有做 PAGE 的設定就跳到 ISR 去,ISR 的Page 跟你所目前所跑的程式萬一要是不同的 Page 呢! 那程式不就掛了。
為避免錯誤所以要先存中斷背景後再呼叫中斷處理...
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

;------------------------------------------------------------------------------
[
color=ff0000]        PAGESEL        ISR
            call       ISR 
[/color]
;------------------------------------------------------------------------------

    ; 
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/27 15:26
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


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


查看用戶資訊
org     00h
        nop
;for ICD2 use
        goto    
Start

        org     04h
        
goto    ISR   <------BUG,講過了,真不用心.
PROG1   CODE
Start

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


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


查看用戶資訊
謝謝Ryang板主的回覆
org     00h
        nop
;for ICD2 use
        goto    
Start

        org     04h
        
goto    ISR
PROG1   CODE
Start
        call    Initial <- 變數給定初始值,暫存器設定
        call    LCDInitial
StartLoop
        主程式區段
        
goto StartLoop
ISR
        中斷處理程式區段
        retfie

PROG2   CODE
        LCD時間顯示副程式區段
        end


我的程式流程是一開始從 00h 進入就跳到 Start 開始變數給定初始值,暫存器設定,完成後才開始作其他的動作,
Ryang板主說的 Cold Start or Warm Start 指的是這個嗎?


剛用 ICD2 debugger 在看 PCLATH 的值,結果有看到 1F ?我只用到page1(0800h~0fffh),應該不會跑到page3(1800h~1fffh)才對

我再來看一下,有結果再PO上來跟大家討論一下

以上再請大家指點一下,謝謝

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


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


查看用戶資訊
參照:
問題2. 就是EEPROM的問題,我的程式目前設定程式一開始執行時,會從EEPROM讀出資料顯示在 LCD 上,
如果是 power off 等一小段時間再 power on ,此時 LCD 上顯示的是程式預設要顯示的資料,而非從EEPROM讀出的資料?
如果是用 MCLR reset 腳 reset ,此時 LCD 顯示的是從EEPROM讀出的資料
試了好幾次都這樣不知道是哪裡出問題?

Power-On Reset 與 MCLR Reset 兩者之間的差異在於 RAM 的改變,基本上 Power-On Reset 時的 RAM 是隨機的,而MCLR切不會改變RAM的值只會將周邊重設成初始狀態。所以朝著 RAM 開機的 RAM Initilaize 來看。有做 Cold Start or Warm Start 的動作嗎?

發表於: 2009/11/27 11:16
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... ]

教育訓練中心

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