登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

转贴!16C57使用心得

作者:odqqdo 栏目:单片机
转贴!16C57使用心得
摘自台湾一网站,网址:

http://www.microchip.com.tw/simpletip.htm

標題:靈活使用PIC16C57的PROGRAM MEMORY
當您使用MICROCHIP公司的PIC16C57在設計程式時,是否被它的PROGRAM MEMORY需分PAGE使用,而PAGE之設定又影響到goto、call、addwf  2、movwf  2四個指令之執行結果而困擾不已呢?以下是小弟領悟出來的一點心得,在此野人獻曝,與大家分享。
PIC16C57之PROGRAM MEMORY共有2 K words,分為四個PAGE,每個PAGE有512個words;goto、call、addwf  2、movwf  2四個指令之執行,會改變PROGRAM COUNTER內容,其結果也受STATUS WORD REGISTER f3之bit 6, 5的影響,如圖(一)所示;改變STATUS WORD REGISTER之bit 6, 5以下一律以"PAGE(的)控制"稱呼。
除此之外,每個PAGE分為前半部及後半部,call、addwf  2、movwf  2三個指令執行結果只會跳到某一PAGE內的前半部,因為這三個指令執行後會使PROGRAM COUNTER的bit 8變為0,而goto指令則不受限制,可跳到一個PAGE之前、後半部。
PROGRAM MEMORY位址7FF是reset後第一個被執行的指令,正常情況下放入goto指令,而且STATUS WORD REGISTER bit 6, 5在 reset後全變為0,所以這個goto指令會使程式跳到PAGE 0去執行。至於要goto到何處?我們先以main 的label來代表,下文再繼續討論。
結構化的程式撰寫是由主程式呼叫許多副程式組成的,為了能善用這四個PAGE,又不要讓程式在呼叫副程式時或做goto之前也要同時注意PAGE的設定值,我對PAGE 0做以下安排:PAGE 0的前半部先存放所有的第一階(即主程式直接呼叫的)副程式,接下來才存放主程式,上一段所提及的label—main就是安排在這個地方;整段主程式只能放在PAGE 0內,否則分置於兩個PAGE內的goto指令前需有不同的PAGE控制,此舉不但麻煩又易出錯,尤其是尚在發展更改中的程式,更難掌握。
當上述的第一階副程式太大或太多,以致無法全部放入PAGE 0的前半部時,或是會造成主程式分跨於PAGE 0與PAGE 1時,就要將部分副程式的"身體"移到別的PAGE中,但"頭"仍需保留在PAGE 0的前半部,"頭"是個重要的媒介,其任務就是要把副程式導引到正確的PAGE上執行;而被移走的副程式其"尾"(retlw之前)需加上指令,把PAGE的控制轉回PAGE 0;如此安排,主程式就不用管它所呼叫的副程式"主體"究竟位於哪個PAGE上了。請參考如下範例:
    LIST    p=16C57
;****************************************************************
    ORG    0    ;page 0前半部
;****************************************************************
init:            ;副程式的"頭
    bsf    STATUS,5    ;page selector point to page 1
    goto    sub1_1
;------------------------------------------------------------------------------------------------
tx:            ;副程式的"頭
    bsf    STATUS,6    ;page selector point to page 2
    goto    sub2_1
;------------------------------------------------------------------------------------------------
rx:            ;副程式的"頭
    bsf    STATUS,6    ;page selector point to page 2
    goto    sub2_2
;------------------------------------------------------------------------------------------------
rd_eeprom:        ;副程式的"頭
    bsf    STATUS,5    ;page selector point to page 3
    bsf    STATUS,6
    goto    sub3_1
;------------------------------------------------------------------------------------------------
    ………………
    ;其它的第一階副程的"頭"
;=========================================================
main:
            ;主程式
    ………………
    call    init    ;直接呼叫,不必管PAGE問題
    ………………
    call    rd_eeprom    ;直接呼叫,不必管PAGE問題
    ………………
    call    tx    ;直接呼叫,不必管PAGE問題
    ………………
    call    rx    ;直接呼叫,不必管PAGE問題
    ………………
;****************************************************************
    ORG    0x200     ;page 1前半部
;此前半部可用以放置第二階副程式,而且是僅接受PAGE 1程式的呼叫;同樣的,這些副程式進入點也需全部位於PAGE 1的前半部,否則會被呼叫不到;如此規劃,對PAGE的控制才會單純。
;------------------------------------------------------------------------------------------------
rout1_1:
    ………………
    retlw    0    ;如此規劃不必更改PAGE控制
;------------------------------------------------------------------------------------------------
rout1_2:
    ………………
    retlw    0    ;如此規劃不必更改PAGE控制
;=========================================================
sub1_1:            ;副程式的"身體"
    ………………
    call    rout1_1
    ………………
    call    rout1_2
    ………………
    bcf    STATUS,5    ;page selector point to page 0
    retlw    0
;****************************************************************
    ORG    0x400     ;page 2前半部
;此前半部的規劃與PAGE 1同
;------------------------------------------------------------------------------------------------
sub2_1:            ;副程式的"身體"
    ………………
    bcf    STATUS,6    ;page selector point to page 0
    retlw    0
;------------------------------------------------------------------------------------------------
sub2_2:            ;副程式的"身體"
    ………………
    bcf    STATUS,6    ;page selector point to page 0
    retlw    0
;****************************************************************
    ORG    0x600    ;page 3前半部
;此前半部的規劃與PAGE 1同
;------------------------------------------------------------------------------------------------
sub3_1:            ;副程式的"身體"
    ………………
    bcf    STATUS,5    ;page selector point to page 0
    bcf    STATUS,6
    retlw    0
;**************************************
2楼: >>参与讨论
undean
值得参考
 
3楼: >>参与讨论
小小小菜鸟
谢谢! 有益。
 
4楼: >>参与讨论
fineasy
老贴了1
 
5楼: >>参与讨论
dcp
可否把网址贴出来呢?
 
6楼: >>参与讨论
dcp
thanks!
 
7楼: >>参与讨论
老怪物
呵呵.没有注意过16C57要分页.
俺笨,不会用PIC ASM,只会用PICC.

参与讨论
昵称:
讨论内容:
 
 
相关帖子
µC/OS-II 在pic18上的移植(一)
PIC18F的PWM模块产生1:1方波的自动运算
帮忙分析,讨论用pwm控制直流无刷电机。
用C写的EEPROM读写程序,大家可以直接使用
头文件中寄存器定义的问题
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号