智能车制作

标题: PIT原理 设定程序通过PB口输出方波 [打印本页]

作者: 醉清风    时间: 2011-11-4 15:32
标题: PIT原理 设定程序通过PB口输出方波
[attach]13255[/attach]
作者: 醉清风    时间: 2011-11-4 19:05
有6个定时器模块,Micro Timer 0、MicroTimer 1、Timer 0、Timer 1、Timer 2、Timer 3,这是PIT 的核心部件,其中前两个是8位的,后两个是16位的。
从图中看出PIT 是一总线时钟(BusClock)为基准时钟的,总线时钟通过8位Micro Timer 0和Micro Timer 1倍频形成两个基时钟,即Micro Timer Base0 和Micro TimerBase1,这两个基时钟通过16位Timer 给PIT 提供时钟(这里面涉及到一个连接复合的问题,16位定时器和基时钟怎么连接,通过寄存器PITMUX 设置)。

1、PIT控制寄存器及强制载入微定时器寄存器PITCFLMT
PITEIT 模块使能位
0 禁止PIT
1 使能PIT
PITSWAIT:等待模式PIT 停止控制位
0 在等待模式下PIT 正常运行
1 在等待模式下PIT 时钟产生器停止
PITFRZ: 冻结模式PIT 计数器冻结控制位
0 在冻结模式下PIT 正常运行
1 在冻结模式下PIT 计数器失去作用
PFLMT[1..0]:PIT 强制载入微定时器模数值控制位
1 相应的8 位微定时器模数值被载入8 位微定时器递减计数器中
0 强制载入无效
2、PIT强制载入定时器寄存器PITFLT
PFLT[3..0]:PIT 强制载入定时器模数值控制位
1 相应的16 位定时器模数值被载入16 位定时器递减计数器中
0 强制载入无效
3、PIT通道使能寄存器PITCE
PCE[ 3..0]:PIT 使能控制位。该寄存器使能PIT 四个通道,如果PCE 写0,PIT 通道将被禁止,在PITTF 中相应的标志位也将被清除;如果PCE 写1,PIT 通道使能, 16 位定时器计数器被载入起始值并开始计数。
0 通道禁止
1 通道使能
4、PIT定时器复合寄存器PITMUX
PMUX[ 3..0]:PTI 定时器复合寄存器控制位。该寄存器控制16 位定时器与8 位微定时器时基0 或者时基1 连接复合。
0 相应16 位定时器与微时基0 连接
1 相应16 位定时器与微时基1 连接
5、PIT中断使能寄存器PITINTE
PINTE[ 3..0]:PIT 定时器溢出中断使能控制位。
0 PIT 相应通道溢出中断禁止
1 PIT 相应通道溢出中断使能
6、PIT溢出标志寄存器
PIF[3..0]:PIT 通道溢出标志位。当16 位定时器计数器和相复合的8 位微定时器计数器递减到0 后,相应位的标志位被置位。写1 后清除标志位,写0 无效。
0 PIT 相应通道没有发生溢出中断
1 PIT 相应通道发生了溢出中断
7、PIT微定时器装载寄存器PITMTLD0/PITMTLD1
PMTLD[7..0]:PIT 微定时器初值载入位。该寄存器用于设置PIT 模块中的8位计数器初值,以实现24位的计数。设定值为0到255范围。递减计数器减至0后会自动重载。
8、PIT定时器装载寄存器PITLD0/PITLD1/PITLD2/PITLD3
PLD[15..0]:同上原理。
9、PIT通道计数器PITCNT[0..4]
PCNT[15..0]:该寄存器存放16 位递减计数器值。

TIME= (PITMTLD + 1) * (PITLD + 1) / F_BUS
其中PITMTLD 是Micro Timer 初值,PITLD 是Timer 初值

PIT 溢出后进入中断后,中断服务就好写了,记住PIT 中断号是66,
记住中断中写1清除标志位,就可以了

程序实例
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
#define PITTIME 5000//设定为50MS 定时
void pllclk(void)//24MHz,外部时钟为16MHz
{
CLKSEL=0X00;
PLLCTL=0xe1;
SYNR=2;//PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)
REFDV=1;
PLLCTL=0X60;
asm NOP;
asm NOP;
asm NOP;
while((CRGFLG&0X08)==0);//时钟校正同步
CLKSEL=0X80;}
void initIOBoutput(void)//IO 口初始化,B 口为输出
{
DDRB=0XFF;
PORTB=0XFF;}
void initPIT(void)//定时中断初始化函数50MS 定时中断设置
{
PITCFLMT_PITE=0; //定时中断通道0 关
PITCE_PCE0=1;//定时器通道0 使能
PITMTLD0=240-1;//8 位定时器初值设定。240 分频,在24M 下,为0.1M即10us.
PITLD0=PITTIME-1;//16 位定时器初值设定。PITTIME*0.01MS
PITINTE_PINTE0=1;//定时器中断通道0 中断使能
PITCFLMT_PITE=1;//定时器通道0 使能}
void main(void)
{
pllclk();
initIOBoutput();
initPIT();
EnableInterrupts;
for(;;) {_FEED_COP();} /* wait forever */
/* please make sure that you never leave this function */}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0(void)
{
PORTB=~PORTB;//输出取反
PITTF_PTF0=1;//清中断标志位
}
作者: quanwenbin    时间: 2012-3-3 07:56





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2