智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 8544|回复: 19
打印 上一主题 下一主题

[单片机] XS128 PIT 模块标志位清除问题!!!!!

  [复制链接]

3

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
417
威望
319
贡献
62
兑换币
12
注册时间
2010-1-23
在线时间
18 小时
跳转到指定楼层
#
发表于 2010-5-7 18:21:54 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
3贡献
//下面的小程序是我测试 PIT 写的,目的是利用级联的24位计数器产生1ms的延时函数,然后调用该函数,使最小系统版上的LED亮一秒,灭一秒
#include <hidef.h>          /* common defines and macros */
#include "derivative.h"     /* derivative information */
static dword   PIT_Timing_00,PIT_Timing_00_Temp=0; //用于8位位计数器0和16位计数器0级联的计数器产生延时用的变量
static byte    Flag_Delay=0;    //定时完成标志

void InitialPLL(void)   //外部时钟为16MHz,PLLCLK=96MHz,BUSCLK=48MHz
{  CLKSEL=0X00;     //disengage PLL to system
   POSTDIV=0x00;    //后除数无效,则PLLCLK=fVCO
   SYNR=0xcb;       //PLLCLK =2*OSCCLK*(SYNR + 1)/(REFDV + 1)=120MHz
   REFDV=0x43;      //SYNR,REFDV最高两位的确定依据数据手册提供的资料
   PLLCTL=0xc0;     //打开时钟监视,并且打开PLL
   CLKSEL=0X80;     //选通PLL时钟提供给总线
   __asm {
     NOP;
     NOP;
     NOP;
    }
   while((CRGFLG&0X08)==0)
     {   }         //时钟校正同步,等待单片机内部时钟稳定
   CLKSEL=0X80;    //再次使能PLLCLK,确保不出错
}



void InitialPIT(void){ //定时计数器初始化,BUSCLK=48MHz
                                //8位微计数器0和16计数器0级联产生一个 1ms 的基准定时,用于其他程序
                     //其它几个计数器作用待定,暂时不用,所以是对位进行的操作
  PITTF=0xff;          //使用定时器前先将所有中断标志位清除,以免不必要错误,注意此寄存器需要写入"1"才能清除
  PITINTE=0x00;       //所有通道中断禁用
  PITCE=0x00;          //所有定时器通道关闭
  PITCFLMT_PITE=0;    //所有定时通道禁用
  
  PITMTLD0=0x2f;      //8位定时器0初值设定,48分频。溢出周期=(PITMTLD + 1) * (PITLD + 1) /BUSCLK。
  PITLD0=0x03e7;      //16位定时器初值设定,在8位微计数器基础上在1000分频,即是级联的24位计数器为BUSCLK的
                      //48*1000分频,所以计数周期为1ms,频率 1KHz
  
  PITMUX_PMUX0=0;     //选定16位计数器0所用的基准8位微计数器0
  
  //因为8位微计数器0和16位计数器0是其它程序调用,用于延时的,所以初始化时并不使能
  //PITINTE_PINTE0=1;   //定时器中断通道0中断使能
  //PITCE_PCE0=1;       //打开16位计数器0的
  //PITCFLMT_PITE=1;    //所有定时器通道使能
}

void   InitialPort(void){
  DDRB=0xff;       //B口作为输出,利用LED组合显示系统状态
  PORTB=0x00;         //复位时最小系统板上接B口的8位LED亮
   }

void   Delay(dword del_ms){
PIT_Timing_00 = del_ms;
  PITTF_PTF0=1;
  PITINTE_PINTE0=1;   //定时器中断通道0中断使能
PITCE_PCE0=1;       //打开16位计数器0的
PITCFLMT_PITE=1;    //所有定时器通道使能  
while(PIT_Timing_00 > PIT_Timing_00_Temp);
Flag_Delay=1;
PIT_Timing_00_Temp=0;
}

void main(void)
{   
  InitialPLL();
  InitialPIT();
  InitialPort();
  EnableInterrupts;
  for(;;) {Delay(1000);}
}

#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0(void) {
  PIT_Timing_00_Temp++;
  if(Flag_Delay){         //Flag_Delay为定时完成的标志位   
    Flag_Delay=0x00;      //达到想要的定时时间,清除标志位               
    PORTB=~PORTB;
    }
PITCE_PCE0=0;
  __asm {
    NOP;
    NOP;
    NOP;
    }  
  PITINTE_PINTE0=0;
  __asm {
    NOP;
    NOP;
    NOP;
    }
  PITTF_PTF0|=0x00;        __asm {
    NOP;
    NOP;
    NOP;
    }
  PITINTE_PINTE=1;
  __asm {
    NOP;
    NOP;
    NOP;
    }   
  PITCE_PCE0=1;}

我的测试结果是,只有这样LED才是亮1秒,熄1秒。问题来了,如果按照datashit所说的清除标志位需要在该计数器没启用或者PITE无效时,向该位写1,LED就一直亮着,只是1秒后亮度小了点(我的猜测是由于标志位没有清除,会一直执行中断函数,导致PB口输出的高低电平周期严重减小)……
在这执行“ PITCE_PCE0=0;”后标志位确实被清除了,但一运行到绿色那句时,PITTF_PTF0 标志位那上就变成 1 了!!!!!!实在是让我很无语有很无奈。。。。。

我在飞思卡尔板块也发了同样的求助帖,希望论坛里车友们解救小弟 ,谢谢!!!!! 由于我的贡献币不多,各位多多包涵~

2

主题

102

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1096
QQ
威望
583
贡献
189
兑换币
109
注册时间
2012-3-24
在线时间
162 小时
19#
发表于 2012-4-29 15:59:16 | 只看该作者
搞不懂
回复

使用道具 举报

2

主题

22

帖子

0

精华

高级会员

Rank: 4

积分
589
威望
359
贡献
106
兑换币
0
注册时间
2011-7-14
在线时间
62 小时
18#
发表于 2011-10-31 23:19:00 | 只看该作者
回复

使用道具 举报

20

主题

139

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5459

论坛元老奖章

QQ
威望
969
贡献
3928
兑换币
4
注册时间
2011-7-25
在线时间
281 小时
17#
发表于 2011-10-19 20:49:41 | 只看该作者
贴出我的PIT中断处理程序!
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 66 void PIT0(void)
{
    // PITTF_PTF0 = 1;
    //用这PITTF_PTF0 = 1清除不了标志位,翻了下数据手册看到
    //If flag clearing by writing a one and flag setting happen in the same bus clock cycle,
    //the flag remains set.The flag bits are cleared if the PIT module is disabled
    // or if thecorresponding timer channel is disabled.

   PITCE_PCE0=0;    //通道禁止
   PITCE_PCE0=1;
    i++;
    if(i==1000)
   {
    i = 0;  
    PORTB_PB0 = ~PORTB_PB0;
    }
   
}
回复

使用道具 举报

20

主题

139

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5459

论坛元老奖章

QQ
威望
969
贡献
3928
兑换币
4
注册时间
2011-7-25
在线时间
281 小时
16#
发表于 2011-10-19 20:49:32 | 只看该作者
贴出我的PIT中断处理程序!
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt 66 void PIT0(void)
{
    // PITTF_PTF0 = 1;
    //用这PITTF_PTF0 = 1清除不了标志位,翻了下数据手册看到
    //If flag clearing by writing a one and flag setting happen in the same bus clock cycle,
    //the flag remains set.The flag bits are cleared if the PIT module is disabled
    // or if thecorresponding timer channel is disabled.

   PITCE_PCE0=0;    //通道禁止
   PITCE_PCE0=1;
    i++;
    if(i==1000)
   {
    i = 0;  
    PORTB_PB0 = ~PORTB_PB0;
    }
   
}
回复

使用道具 举报

4

主题

221

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1161

优秀会员奖章

QQ
威望
452
贡献
673
兑换币
0
注册时间
2011-4-9
在线时间
18 小时
15#
发表于 2011-4-23 16:59:28 | 只看该作者
回复

使用道具 举报

1

主题

60

帖子

0

精华

高级会员

Rank: 4

积分
532
威望
376
贡献
66
兑换币
9
注册时间
2010-12-28
在线时间
45 小时
14#
发表于 2011-4-20 22:02:01 | 只看该作者
不懂
回复

使用道具 举报

3

主题

29

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1744
威望
985
贡献
547
兑换币
482
注册时间
2011-1-10
在线时间
106 小时
13#
发表于 2011-1-21 11:37:04 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

4

主题

114

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1487
威望
360
贡献
1085
兑换币
0
注册时间
2010-7-24
在线时间
21 小时
12#
发表于 2010-11-30 20:14:41 | 只看该作者
正在摸索。。。。。。。。。。。。
回复

使用道具 举报

4

主题

226

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1238
QQ
威望
472
贡献
584
兑换币
0
注册时间
2010-8-30
在线时间
91 小时
11#
发表于 2010-11-29 11:32:21 | 只看该作者
学习
回复

使用道具 举报

2

主题

203

帖子

0

精华

高级会员

Rank: 4

积分
741
QQ
威望
434
贡献
249
兑换币
0
注册时间
2010-11-1
在线时间
29 小时
10#
发表于 2010-11-29 10:46:59 | 只看该作者
我也是刚学 你可以参考下这个帖http://www.znczz.com/thread-16534-1-1.html
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-20 09:42 , Processed in 0.631741 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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