5332|12

136

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

CC2530中断寄存器问题 [复制链接]

IRCON是中断标志寄存器,为什么出中断了该寄存器相应位还是为1?不是应该清0吗?为什么程序运行到T1CCTL0 |=0x04;时,IRCON中的T1IF会被置1?
此帖出自无线连接论坛

最新回复

本帖最后由 dan158185 于 2015-11-24 13:34 编辑 我写的tinyos底层部分,虚拟定时器基础驱动两个部分: 1,定时器溢出初始化 只开启溢出中断 static error_t  HplCC2530Timer1AlarmCounterP__0__Init__init(void ) {   T1CTL = 0x00;   T1CCTL0 = 0;   T1CCTL1 = 0;   T1CCTL2 = 0;   T1CNTL = 0;   T1CNTH = 0;   T1CTL = (T1CTL & ~CC2530_T1CTL_DIV_MASK) | CC2530_TIMER1_DIV_128;   T1IE = 1;   TIMIF |= 1 = dt) {         set = now + 5;       }     else       {         uint16_t remaining = dt - elapsed;         if (remaining   详情 回复 发表于 2015-11-24 13:16
点赞 关注
 

回复
举报

136

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
图片忘加了
#include
int i=0;
void timer_config()
{
  T1CTL |= 0x02;
  T1CCTL0 |=0x04;
  T1CC0L = 0x40;
  T1CC0H = 0x1F;
  T1IE = 1;
}
void main()
{
  timer_config();
  P0DIR |= 0x02;
  P0_1=0;
  EA = 1;
  //int i=0;
  while(1)
  {
    if(i>=1000)
    {
      P0_1=~P0_1;
      i=0;
    }
  }
}
#pragma vector = T1_VECTOR
__interrupt void ISR_Timer1(void)
{
  i++;
}

截图20151120114249.png (14.67 KB, 下载次数: 0)

截图20151120114249.png

截图20151120114310.png (17.55 KB, 下载次数: 0)

截图20151120114310.png
此帖出自无线连接论坛
 
 

回复

111

帖子

1

TA的资源

一粒金砂(高级)

板凳
 
你的中断服务程序注意清除标志,初始化也要注意先清中断标志再去开启中断
此帖出自无线连接论坛

点评

清不掉,IRCON = 0x00;  详情 回复 发表于 2015-11-20 16:39
不能自动清零吗?  详情 回复 发表于 2015-11-20 16:35
个人签名https://open6lowpan.taobao.com/
 
 
 

回复

136

帖子

0

TA的资源

一粒金砂(中级)

4
 
dan158185 发表于 2015-11-20 15:26
你的中断服务程序注意清除标志,初始化也要注意先清中断标志再去开启中断

不能自动清零吗?
此帖出自无线连接论坛
 
 
 

回复

136

帖子

0

TA的资源

一粒金砂(中级)

5
 
dan158185 发表于 2015-11-20 15:26
你的中断服务程序注意清除标志,初始化也要注意先清中断标志再去开启中断

清不掉,IRCON = 0x00;
此帖出自无线连接论坛
 
 
 

回复

111

帖子

1

TA的资源

一粒金砂(高级)

6
 
T1STAT中断标志,IRCON是进入中断服务函数自动清除
你调试也不用关心 和你断点调试有关系 只要确保中断的进入正常
此帖出自无线连接论坛

点评

我看了一下是那个定时器1的0通道一直有中断标志,这是为什么?我选的是模模式,应该是溢出中断才对呀  详情 回复 发表于 2015-11-20 17:06
个人签名https://open6lowpan.taobao.com/
 
 
 

回复

136

帖子

0

TA的资源

一粒金砂(中级)

7
 
dan158185 发表于 2015-11-20 16:57
T1STAT中断标志,IRCON是进入中断服务函数自动清除
你调试也不用关心 和你断点调试有关系 只要确保中断的 ...

我看了一下是那个定时器1的0通道一直有中断标志,这是为什么?我选的是模模式,应该是溢出中断才对呀
此帖出自无线连接论坛
 
 
 

回复

111

帖子

1

TA的资源

一粒金砂(高级)

8
 
https://bbs.eeworld.com.cn/thread-477653-1-1.html
参考这个tinyos的2530源码 定时器部分 用系统点灯部分 要简单很多
可以去看看转成c文件后的timer1中断函数写法,主要是一个比较通道还有overflow,虚拟定时器可同时注册n个
分为周期性,一次性
此帖出自无线连接论坛
个人签名https://open6lowpan.taobao.com/
 
 
 

回复

111

帖子

1

TA的资源

一粒金砂(高级)

9
 
也可以看看这个视频
视频地址:http://v.youku.com/v_show/id_XMTM5MDM0MDk1Mg==.html?from=y1.7-1.2
blnk部分和2530例程是一样的,看看代码的简单性
此帖出自无线连接论坛
个人签名https://open6lowpan.taobao.com/
 
 
 

回复

111

帖子

1

TA的资源

一粒金砂(高级)

10
 

你注意看寄存器的复位 允许
此帖出自无线连接论坛
个人签名https://open6lowpan.taobao.com/
 
 
 

回复

111

帖子

1

TA的资源

一粒金砂(高级)

11
 
你现在设置的比较器通道
T1CCT0H:T1CCT0L
确定不是
T1CNTH:T1CNTL
此帖出自无线连接论坛

点评

是T1CC0H:T1CC0L,没有T1CCT0H:T1CCT0L  详情 回复 发表于 2015-11-23 08:54
个人签名https://open6lowpan.taobao.com/
 
 
 

回复

136

帖子

0

TA的资源

一粒金砂(中级)

12
 
dan158185 发表于 2015-11-20 17:16
你现在设置的比较器通道
T1CCT0H:T1CCT0L
确定不是
T1CNTH:T1CNTL

是T1CC0H:T1CC0L,没有T1CCT0H:T1CCT0L
此帖出自无线连接论坛
 
 
 

回复

111

帖子

1

TA的资源

一粒金砂(高级)

13
 
本帖最后由 dan158185 于 2015-11-24 13:34 编辑

我写的tinyos底层部分,虚拟定时器基础驱动两个部分:
1,定时器溢出初始化 只开启溢出中断
static error_t  HplCC2530Timer1AlarmCounterP__0__Init__init(void )
{
  T1CTL = 0x00;
  T1CCTL0 = 0;
  T1CCTL1 = 0;
  T1CCTL2 = 0;

  T1CNTL = 0;
  T1CNTH = 0;
  T1CTL = (T1CTL & ~CC2530_T1CTL_DIV_MASK) | CC2530_TIMER1_DIV_128;


  T1IE = 1;
  TIMIF |= 1 << CC2530_TIMIF_OVFIM;
  T1CTL = (T1CTL & ~CC2530_T1CTL_MODE_MASK) | CC2530_TIMER1_MODE_FREE;
  return SUCCESS;
}
2,不关心比较跳过;设定比较起通道1,你不用去关心的是那些中间的赋值计算,那是我的系统计算出来的时间剩余值
static    void HplCC2530Timer1AlarmCounterP__0__Alarm0__startAt(uint16_t t0, uint16_t dt)
{
  uint16_t set;
  uint16_t now;
  uint16_t elapsed;

  /* atomic removed: atomic calls only */
  {
    ((uint8_t *)&now)[0] = T1CNTL;
    (
    (uint8_t *)&now)[1] = T1CNTH;

    elapsed = now - t0;

    if (elapsed >= dt) {
        set = now + 5;
      }
    else
      {
        uint16_t remaining = dt - elapsed;
        if (remaining <= 5) {
            set = now + 5;
          }
        else
          {
            set = remaining + now;
          }
      }
    T1CC1L = (uint8_t )((uint8_t *)&set)[0];
    T1CC1H = (uint8_t )((uint8_t *)&set)[1];



    T1CCTL1 |= 1 << CC2530_T1CCTLx_MODE;
    T1CCTL1 |= 1 << CC2530_T1CCTLx_IM;
  }
  return;
}

3,中断函数:
//# 265 "/opt/tinyos-2.x/tos/chips/cc2530/timer_hpl/HplCC2530Timer1AlarmCounterP.nc"
#pragma vector = 75
  __interrupt void T__vector_75(void)
{
{ __nesc_atomic_t __nesc_atomic = __nesc_atomic_start();
    {
      if (* (uint8_t __xdata *)0x62A3 & (1 << CC2530_T1CCTLx_IM) && T1STAT & (1 <<                     CC2530_T1CTL_CH3IF)) {
        //比较器通道3中断
          * (uint8_t __xdata *)0x62A3 = 0X0;
          T1STAT &= ~(1 << CC2530_T1CTL_CH3IF);
          HplCC2530Timer1AlarmCounterP__0__Alarm2__fired();
        }
      if (T1CCTL2 & (1 << CC2530_T1CCTLx_IM) && T1STAT & (1 << CC2530_T1CTL_CH2IF)) {
       //比较器通道2中断
          T1CCTL2 = 0X0;
          T1STAT &= ~(1 << CC2530_T1CTL_CH2IF);
          HplCC2530Timer1AlarmCounterP__0__Alarm1__fired();
        }
      if (T1CCTL1 & (1 << CC2530_T1CCTLx_IM) && T1STAT & (1 << CC2530_T1CTL_CH1IF)) {
       //比较器通道1中断
         
          T1CCTL1 = 0X0;
          T1STAT &= ~(1 << CC2530_T1CTL_CH1IF);
          HplCC2530Timer1AlarmCounterP__0__Alarm0__fired();
        }

      if (T1STAT & (1 << CC2530_T1CTL_OVFIF)) {        //溢出中断
          T1STAT &= ~(1 << CC2530_T1CTL_OVFIF);
          HplCC2530Timer1AlarmCounterP__0__Counter__overflow();
        }
    }
    __nesc_atomic_end(__nesc_atomic); }
}

对于* (uint8_t __xdata *)0x62A3这种也是操作寄存器,这个是tinyos转成c文件后的代码,也是肯定能用的驱动,

对于比较起通道 上面已经说过注意芯片 上电初始化默认是开启的,再者就算不开启中断,屏蔽中断发生了该中断事件标志仍然会 置位;
添加中断服务函数标志判断,断点打开看看你进去的是那个中断,反过去查找手册了
T1CNTH:T1CNTL freemode的寄存器计数
通过看函数2已经能看出来假设我要在freemode中断 不影响T1CNTH:T1CNTL计数那就是读取当前T1CNTH:T1CNTL的值加上我要比较起通道定时的值设置
T1CCxH:T1CCxL
然后开启比较起通道
T1CCTLx |= 1 << CC2530_T1CCTLx_MODE;
T1CCTLx |= 1 << CC2530_T1CCTLx_IM;
看不看得懂将不再多说



此帖出自无线连接论坛
个人签名https://open6lowpan.taobao.com/
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表