智能车制作
标题:
计数器对外部脉冲进行计数,我的程序哪里有错?
[打印本页]
作者:
yala1987
时间:
2009-5-14 22:20
标题:
计数器对外部脉冲进行计数,我的程序哪里有错?
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
unsigned char PulseCnt;
void main(void) {
DDRB=0XFF;
PORTB=0XFF;
asm sei;
TIOS=0x00;
TSCR1=0x80;
TSCR2=0x01;
TCTL4=0x02; //捕捉
TIE=0x01;
TFLG1=0x01;
PulseCnt=0x00;
asm cli;
for(;;){}
}
#pragma CODE_SEG__NEAR_SEG NON_BANKED
void interrupt ICO_ISR(void) {
PulseCnt ++;
TFLG1=0X01;
PORTB=~PulseCnt;
}
#pragma CODE_SEG DEFAULT
作者:
yala1987
时间:
2009-5-16 10:31
没人知道的么?
作者:
jackyu613
时间:
2009-5-16 14:34
我来说下我的看法。
对于你上面的程序中的中断服务函数:
#pragma CODE_SEG__NEAR_SEG NON_BANKED
void interrupt ICO_ISR(void) {
PulseCnt ++;
TFLG1=0X01;
PORTB=~PulseCnt;
}
首先你没有在函数头部interrupt后面写明中断向量号。每个中断对应哪一个中断处理函数,是由这个中断向量号给出的。所以你应该添上定时器通道0的中断向量号。
另外,我有两点不太明白,顺便向你请教:
1、中断函数前到底是写#pragma CODE_SEG__NEAR_SEG NON_BANKED,还是#pragma CODE_SEG NON_BANKED?我写的是后者,同样也能正确执行,所以我也不知道你这样写是不是也是对的。
2、PORTB=~PulseCnt;这句中PulseCnt前的~符号是什么意思?C语言中这个应该是取反吧?可是在这里看来,似乎又应该是把PulseCnt的值赋给PORTB,可是你为什么不直接写成PORTB=PulseCnt呢?很困惑。
作者:
iamstar24
时间:
2009-5-17 08:06
取反貌似是因为灯亮需要低电平吧。。。
作者:
xiaopang1989
时间:
2009-5-17 21:13
l楼上说的 很在理!顶!我们正困在此处,很是郁闷!
作者:
yala1987
时间:
2009-5-18 19:25
3#
jackyu613
我对计数器是完全搞不明白的,所以第一个问题回答不了。
~是取反的意思,因为LED灯是低电平亮。这个在其他模块里也经常用到的。
作者:
jackyu613
时间:
2009-5-19 20:43
6#
yala1987
原来是这样啊。明白了。
作者:
lim1t
时间:
2009-5-22 23:39
我的几点看法:
一、加入汇编时,最好这样写_asm(nop);不能大写,在CW里大小写很敏感的。
二、中断向量号的计算:[100H-向量地址]/2-1
三、取反的问题:PORTB~=PulseCnt,或者PORTB^=PulseCnt也行,这样就是取反附值了
四、还有你这个TFLG1=0X01,我没看懂为什么,既然你在MAIN()里都初始化了,还在中断里加入一样的做什么?
五、至于加不加#pragma CODE_SEG__NEAR_SEG NON_BANKED,都是可以运行的,没什么影响。
六、在main()要加入开中断的语句 EnableInterrupts;,不然你的总有中断都是用不了的。
作者:
姚先生
时间:
2010-4-21 14:00
同意三楼的说法
欢迎光临 智能车制作 (http://111.231.132.190/)
Powered by Discuz! X3.2