智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 3020|回复: 4
打印 上一主题 下一主题

[求助]关于多通道PIT使用问题

[复制链接]

2

主题

4

帖子

0

精华

注册会员

Rank: 2

积分
166
威望
205
贡献
41
兑换币
0
注册时间
2009-9-30
在线时间
9 小时
跳转到指定楼层
1#
发表于 2011-3-7 21:23:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当开两个PIT通道时,总是进不了第二个PIT中断。部分代码如下
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt VectorNumber_Vpit1 Vpit1_ISR(void){



   PITTF=0x02;

PIT初始化如下:
void PIT_init(void) //PIT初始化
{
  PITCFLMT_PITE=0;   
  PITCE_PCE0=1;      
  PITCE_PCE1=1;
  PITMTLD0=40-1;      
  PITMTLD1=40-1;
  PITLD0=PITTIME1-1;   //PITTIME1,PITTIME2有define
  PITLD1=PITTIME2-1;   
  PITINTE_PINTE0=1;  
  PITINTE_PINTE1=1;
  PITCFLMT_PITE=1;   
}


请高手不吝赐教。

17

主题

74

帖子

0

精华

常驻嘉宾

有那么点坏把

Rank: 8Rank: 8

积分
4913

论坛元老奖章

QQ
威望
347
贡献
4280
兑换币
0
注册时间
2010-12-7
在线时间
143 小时
2#
发表于 2011-3-13 15:08:57 | 只看该作者
因为你的PITTF只清除了一道PIT通道而已。 你换成PITTF_PTFx去清除吧
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
威望
242
贡献
49
兑换币
0
注册时间
2011-5-15
在线时间
1 小时
3#
发表于 2011-5-15 10:32:35 | 只看该作者
这样好像也不行也
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
293
威望
242
贡献
49
兑换币
0
注册时间
2011-5-15
在线时间
1 小时
4#
发表于 2011-5-15 10:32:39 | 只看该作者
这样好像也不行也
回复 支持 反对

使用道具 举报

20

主题

139

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5459

论坛元老奖章

QQ
威望
969
贡献
3928
兑换币
4
注册时间
2011-7-25
在线时间
281 小时
5#
发表于 2011-10-19 20:51:40 | 只看该作者
同时使用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;
    //用这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;
    }
   
}
interrupt 67 void PIT1(void)
{
    //PITTF_PTF1 = 1;
    PITCE_PCE1=0;
    PITCE_PCE1=1;
  
    j++;
    if(j==1000)
   {
    j = 0;
    PORTB_PB1 = ~PORTB_PB1;
    }

}
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-26 13:04 , Processed in 0.220391 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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