智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4975|回复: 8
打印 上一主题 下一主题

[编程类] 计数器对外部脉冲进行计数,我的程序哪里有错?

[复制链接]

0

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
QQ
威望
229
贡献
49
兑换币
0
注册时间
2009-3-22
在线时间
45 小时
跳转到指定楼层
1#
发表于 2009-5-14 22:20:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
#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

0

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
QQ
威望
229
贡献
49
兑换币
0
注册时间
2009-3-22
在线时间
45 小时
2#
 楼主| 发表于 2009-5-16 10:31:30 | 只看该作者


没人知道的么?
回复

使用道具 举报

0

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
391
威望
269
贡献
76
兑换币
54
注册时间
2008-9-28
在线时间
23 小时
3#
发表于 2009-5-16 14:34:59 | 只看该作者
我来说下我的看法。
对于你上面的程序中的中断服务函数:
#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呢?很困惑。
回复

使用道具 举报

29

主题

260

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6709

论坛元老奖章

威望
505
贡献
5874
兑换币
2
注册时间
2009-3-2
在线时间
165 小时
4#
发表于 2009-5-17 08:06:44 | 只看该作者
取反貌似是因为灯亮需要低电平吧。。。
回复

使用道具 举报

0

主题

47

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
威望
276
贡献
71
兑换币
34
注册时间
2009-2-11
在线时间
21 小时
5#
发表于 2009-5-17 21:13:38 | 只看该作者
l楼上说的 很在理!顶!我们正困在此处,很是郁闷!
回复

使用道具 举报

0

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
368
QQ
威望
229
贡献
49
兑换币
0
注册时间
2009-3-22
在线时间
45 小时
6#
 楼主| 发表于 2009-5-18 19:25:27 | 只看该作者
3# jackyu613


我对计数器是完全搞不明白的,所以第一个问题回答不了。

~是取反的意思,因为LED灯是低电平亮。这个在其他模块里也经常用到的。
回复

使用道具 举报

0

主题

14

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
391
威望
269
贡献
76
兑换币
54
注册时间
2008-9-28
在线时间
23 小时
7#
发表于 2009-5-19 20:43:28 | 只看该作者
6# yala1987

原来是这样啊。明白了。
回复

使用道具 举报

13

主题

176

帖子

0

精华

常驻嘉宾

宝塔镇河妖

Rank: 8Rank: 8

积分
3622

活跃会员奖章

QQ
威望
832
贡献
2416
兑换币
258
注册时间
2009-1-23
在线时间
187 小时
8#
发表于 2009-5-22 23:39:57 | 只看该作者
我的几点看法:
一、加入汇编时,最好这样写_asm(nop);不能大写,在CW里大小写很敏感的。
二、中断向量号的计算:[100H-向量地址]/2-1
三、取反的问题:PORTB~=PulseCnt,或者PORTB^=PulseCnt也行,这样就是取反附值了
四、还有你这个TFLG1=0X01,我没看懂为什么,既然你在MAIN()里都初始化了,还在中断里加入一样的做什么?
五、至于加不加#pragma CODE_SEG__NEAR_SEG NON_BANKED,都是可以运行的,没什么影响。
六、在main()要加入开中断的语句 EnableInterrupts;,不然你的总有中断都是用不了的。
回复

使用道具 举报

5

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
868
QQ
威望
326
贡献
506
兑换币
0
注册时间
2009-12-18
在线时间
18 小时
9#
发表于 2010-4-21 14:00:08 | 只看该作者
同意三楼的说法
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-27 19:45 , Processed in 0.274123 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表