智能车制作

标题: 计数器对外部脉冲进行计数,我的程序哪里有错? [打印本页]

作者: 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://dns.znczz.com/) Powered by Discuz! X3.2