原创
PIC第三方编译软件CCS PCWH使用心得(2)
CCS PCWH也是很好用的,在刚接触PIC的时候就一直使用它了,方便在于编译器把很多硬件的东西都写成了函数,便于调用,降低了开发者对硬件熟悉程度的要求,正是这样也给调试软件找BUG带来了一定的难度。
1)比如说用timer1定时方式产生占空比50%的方波吧,以前PIC16,PIC18系列对定时器配置程序简单的两句话就完成
setup_timer1(T1_INTERNAL|T1_DIV_BY_8); //sets the internal clock as source
set_timer1(0x8000);
换成PIC30做开发了,认为移植程序起来很方便,没想却在定时器这儿出了问题,按上面的程序无论怎么改变set_timer1()函数调用的参数,都无法改变定时值,出来都是同一方波,得不到上述的结果。对PIC30的定时器硬件分析发现PIC30的定时器中断方式与PIC18等有所不同,PIC18是溢出中断,而PIC30是比较中断,这就是症结所在。继续研读CCS帮助手册,将程序改为以下后OK:
setup_timer1(TMR_INTERNAL | TMR_DIV_BY_256 , 0x8000);
set_timer1(0);
看上去很相试的程序,意思却不一样。
分析:
setup_timer1(T1_INTERNAL|T1_DIV_BY_8)若用在PIC30使用,实质上只对定时器进行了配置,恰恰没有对定时器的RP1寄存器设置,默认为0xFFFF;而set_timer1(0x8000)前者是设定初始值,而后者在PIC30实质是复位定时器。
2)比如说用timer2和timer3组成32BIT定时器使用,有了上述经验,做起来便容易了。
// timer 2,3 initialization
setup_timer2(TMR_INTERNAL | TMR_DIV_BY_256 | TMR_32_BIT, 0x00112233);
set_timer23(0);
心想这样配置应该没问题了,timer2也设置成32bit了,也对RP寄存器设置了值,但运行程序得到的结果并不是想要的。最终没法将LIST文件掉出来分析才发现setup_timer2(TMR_INTERNAL | TMR_DIV_BY_256 | TMR_32_BIT, 0x00112233)在配置时只针对timer2进行了设置,对于timer3什么也没做,而0x00112233的高16bit也就没有写入timer3的RP寄存器,我纳闷32BIT的数写到16BIT的寄存器,编译器怎么不报错呢。最终程序改为了:
// timer 2,3 initialization
setup_timer2(TMR_INTERNAL | TMR_DIV_BY_256 | TMR_32_BIT, 0x2233);
setup_timer3(TMR_INTERNAL, 0x0011);
set_timer23(0);
dwwzl 2010-4-6 09:12