首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

再问脉冲累加问题??

再问脉冲累加问题??

我编写了,八位和十六位的脉冲累加器程序都有问题,请版主解决!
十六位的初始化,如下:
void PaiInit(){
TCTL4 = 0X03;
PBCTL = 0x40; //PBEN=1,事件技术模式,上升沿触发,PACLK 允许中断
ICPAR = 0X0F;
PACN0 = 0X00;
}
问题:对的脉冲个数不对?
八位初始化程序,如下:
void PaiInit(){
TCTL4 = 0X03;
PACTL = 0x00; //PBEN=1,事件技术模式,上升沿触发,PACLK 允许中断
ICPAR = 0X0F;
ICSYS = 0;
}
问题:读不出书,请版主解决,谢谢!
上传的是我的8位和16位的程序,请版主帮我解决!非常感谢!
程序上传!
我贴出来吧!上传不了,8位的如下:
#include /* common defines and macros */
#include /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

void PaiInit(){
TCTL4 = 0X03;
PACTL = 0x00; //PBEN=1,事件技术模式,上升沿触发,PACLK 允许中断
ICPAR = 0X0F;
ICSYS = 0;
}
/* 定时2ms*/
void MDCInit(void){
MCCTL = MCCTL&0Xfb; //模数计数器禁止运行
MCCTL = 0Xe3; //允许中断,模数计数方式
//返回时重新加载所用的常数,分频常数为16
MCCTL = MCCTL|0X04; //模数计数器使能
MCCNT = 500; //(32/8M)*1000 = 2ms
MCCTL = MCCTL|0X08 ; //把模数常数寄存器的值加载到模数计数器FLMC;

}

unsigned int number_flag;

void main(void) {
PaiInit();
MDCInit();
DDRB = 0xFF;
PORTB = 0xaa;
number_flag = 0;
for(;;) {
EnableInterrupts;
}
}
/*-------中断函数-------------------------------*/
void interrupt 26 MDC_ISR(void){
unsigned char out;
out = 0;
DisableInterrupts;
MCFLG = 0x80; //清标志位
number_flag ++;
if( 2000 == number_flag ) {
out = PACN3 ;
PORTB = out;
while(1);
}
}
十六位的,请版主帮忙解决!谢谢了!
#include /* common defines and macros */
#include /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

void PaiInit(){
TCTL4 = 0X03;
PBCTL = 0x40; //PBEN=1,事件技术模式,上升沿触发,PACLK 允许中断
ICPAR = 0X0F;
PACN0 = 0X00;
}
/* 定时2ms*/
void MDCInit(void){
MCCTL = MCCTL&0Xfb; //模数计数器禁止运行
MCCTL = 0Xe3; //允许中断,模数计数方式
//返回时重新加载所用的常数,分频常数为16
MCCTL = MCCTL|0X04; //模数计数器使能
MCCNT = 500; //(32/8M)*1000 = 2ms
MCCTL = MCCTL|0X08 ; //把模数常数寄存器的值加载到模数计数器FLMC;

}

unsigned int number_flag;

void main(void) {
PaiInit();
MDCInit();
DDRB = 0xFF;
PORTB = 0xaa;
number_flag = 0;
for(;;) {
EnableInterrupts;
}
}
/*-------中断函数-------------------------------*/
void interrupt 26 MDC_ISR(void){
unsigned char out;
out = 0;
DisableInterrupts;
MCFLG = 0x80; //清标志位
number_flag ++;
if( 2000 == number_flag ) {
out = PACN0 ;
PORTB = out;
while(1);
}
}
如果无法上传,就把整个project打包发到strongchen_free@yahoo.com.cn。
海纳百川  有容乃大
发过去了,请查收!谢谢!
看到你的project了。首先看到的问题是,中断函数必须放入非分页地址,所以应该在中断函数之前加上声明:

#pragma CODE_SEG __NEAR_SEG NON_BANKED

另外,在中断函数中,中断允许已经关闭了,就不用再执行DisableInterrupts了。
先试试看吧。
海纳百川  有容乃大
问题已解决,谢谢!
返回列表