智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 12881|回复: 33
打印 上一主题 下一主题

关于PIT模块同时使用两个中断实现两灯互闪的问题

  [复制链接]

4

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
411
威望
285
贡献
72
兑换币
0
注册时间
2010-10-2
在线时间
27 小时
跳转到指定楼层
1#
发表于 2010-10-5 23:39:44 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
我是个初学者,最近在实验的过程中想到同时使用PIT模块的0,1定时通道,实现两盏LED灯实现2比1频率的闪动。
程序代码如下:




#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#define unsigned int uint
#define BUS_CLOCK 24000000
uint i=0;
uint j=0;
byte shuma[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,       //0~9对应的段码
                0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
void INIT_PLL(void)
{
    CLKSEL &= 0x7f;       //set OSCCLK as sysclk
    PLLCTL &= 0x8F;       //Disable PLL circuit
    CRGINT &= 0xDF;
   
    #if(BUS_CLOCK == 40000000)
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #endif
    REFDV = 0x81;         //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
    PLLCTL =PLLCTL|0x70;  //Enable PLL circuit
    asm NOP;
    asm NOP;
    while(!(CRGFLG&0x08)); //PLLCLK is Locked already
    CLKSEL |= 0x80;        //set PLLCLK as sysclk
}
void PitInit(void){
  PITCFLMT_PITE = 1; //使能PIT模块
  PITCE = 0X00;      //通道0,1 PIT模块禁止
  PITINTE = 0x03;    //通道0,1中断使能
  PITMUX = 0x00;      //16位定时通道0使用0号8位微计数器,16位定时器1使用1号微计数器
  PITLD0 = 240-1;
  PITMTLD0 = 100-1;
  PITLD1 = 120-1;
  PITCE = 0X03;      //通道0,1 PIT模块使能
}
void InitPortb(void){
  DDRB = 0XFF;
  PORTB = 0XFF;
}
void main(void) {
  INIT_PLL();    //设置锁相环
  PitInit();     
  InitPortb();
EnableInterrupts;

  for(;;) {
   
  } /* loop forever */
  /* please make sure that you never leave main */
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 66 void PIT0(void){
    PITTF_PTF0 = 1;
    i++;
    if(i==1000){
    i = 0;  
    PORTB_PB0 = ~PORTB_PB0;
    }
}
interrupt 67 void PIT1(void){
    PITTF_PTF1 = 1;
    j++;
    if(j==1000){
    j = 0;
    PORTB_PB1 = ~PORTB_PB1;
    }
}


但是我实际运行发现,两盏灯居然同频率闪,我之前已经设置了PITLD0,PITLD1一个是240-1,一个是120-1,两个通道同时使用0微计数器,数值为100-1,中断向量也对了,感觉也没什么问题,大惑不解。我感觉两个中断都进入了,那么我就试着改了一下PITLD,把他们都改成同一个数值240-1,结果一运行,晕死我了,这回只有一盏灯在闪(亮一秒灭一秒),PIT通道2中断感觉是进不去了,非常疑惑。
请高手赐教到底什么原因。

3

主题

42

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2624
威望
1359
贡献
901
兑换币
895
注册时间
2014-9-11
在线时间
182 小时
34#
发表于 2015-5-6 20:52:38 | 只看该作者
;p
学习了
回复 支持 反对

使用道具 举报

0

主题

24

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3587
威望
1463
贡献
804
兑换币
727
注册时间
2012-3-16
在线时间
660 小时
毕业学校
csu
33#
发表于 2013-2-27 21:13:43 | 只看该作者
学习了,真的有用!还是要认真学啊!
回复 支持 反对

使用道具 举报

53

主题

2469

帖子

0

精华

跨届大侠

狙击手

Rank: 10Rank: 10Rank: 10

积分
11290

优秀会员奖章活跃会员奖章论坛元老奖章在线王奖章论坛骨干奖章资源大师奖章

威望
4701
贡献
3671
兑换币
2368
注册时间
2012-3-12
在线时间
1459 小时
32#
发表于 2012-10-22 17:50:04 | 只看该作者
:)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

0

主题

18

帖子

0

精华

高级会员

Rank: 4

积分
683
威望
314
贡献
193
兑换币
137
注册时间
2012-10-12
在线时间
88 小时
毕业学校
华南理工大学广州学院
31#
发表于 2012-10-21 14:39:38 | 只看该作者
interrupt 66 void PIT0
请问楼主,这个 66怎么来的?我看了中断向量,可我不知道这个66与中断向量什么关系,初学者求指教,
回复 支持 反对

使用道具 举报

1

主题

67

帖子

0

精华

高级会员

Rank: 4

积分
649
威望
368
贡献
179
兑换币
91
注册时间
2012-4-18
在线时间
51 小时
毕业学校
江南大学
30#
发表于 2012-10-13 21:28:40 | 只看该作者
学习
回复 支持 反对

使用道具 举报

1

主题

67

帖子

0

精华

高级会员

Rank: 4

积分
649
威望
368
贡献
179
兑换币
91
注册时间
2012-4-18
在线时间
51 小时
毕业学校
江南大学
29#
发表于 2012-10-13 19:35:47 | 只看该作者
Wonderful!
回复 支持 反对

使用道具 举报

10

主题

353

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1657
威望
1031
贡献
326
兑换币
60
注册时间
2012-2-23
在线时间
150 小时
28#
发表于 2012-8-7 01:39:25 | 只看该作者
xiaolezizhl 发表于 2010-10-21 10:11
我调试时看了下   用这PITTF_PTF0 = 1好像清除不了标志位,翻了下数据手册看到If flag clearing by writing ...

那么请问若是楼主的程序么有清楚标志位,为什么仅用一个中断的时候应该也没有清标志位,为什么程序能正常运行?
比如  switch(PORTE&0x14)
  
  {
    case 0x14:{
                    Object_speed=22;
                    break;
              }
    case 0x04:{
                    Object_speed=26;
                    break;
              }
    case 0x10:{
                    Object_speed=30;
                    break;
              }
    case 0x00:{
                    Object_speed=35;
                    break;
              }
    default:break;
  }
  delay2s();//延时2秒发车
EnableInterrupts;
  
  for(;;) {
    _FEED_COP(); /* feeds the dog */  
   saomiao();
   chuli();
   Tiaosu();
   driver();
  } /* loop forever */
  /* please make sure that you never leave main */  
}
/***********************测速***********************/
//#pragma CODE_SEG NON_BANKED
void interrupt 66 PIT0(void)
{
      PITTF_PTF0=1;
      pulse_speed=PACNT;
      PACNT=0x0000;
         
}
#pragma CODE_SEG DEFAULT
这是我的小车程序的一部分,我感觉程序是正常运行的,应该肯定出中断了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

10

主题

353

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1657
威望
1031
贡献
326
兑换币
60
注册时间
2012-2-23
在线时间
150 小时
27#
发表于 2012-8-6 23:19:42 | 只看该作者
赵超超 发表于 2011-3-7 10:28
其实我也能回答出来

2b  
回复 支持 反对

使用道具 举报

0

主题

99

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1299
威望
717
贡献
372
兑换币
244
注册时间
2012-7-19
在线时间
105 小时
毕业学校
TianJin University
26#
发表于 2012-8-3 00:05:12 | 只看该作者
E08610318 发表于 2010-10-23 14:48
恍然大悟,哎,还是你比较认真,DATASHEET这部分我之前也看了,没在意,当时没有做实验,原来是这么回事,还 ...

额,其实还有更深层次的原因,给你个链接吧
http://www.znczz.com/thread-56088-1-1.html

刚刚那位大神的解决方法也挺好的,因为关闭了PIT之后,标志位就自动清零了
不是因为写1 和置位同时发生的问题

加油
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 21:19 , Processed in 0.154380 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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