打印

关于CC253 硬件模式输出 IR PWM的问题

[复制链接]
1480|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
天凡云赐|  楼主 | 2015-10-11 21:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请各位帮忙看看 我的程序如下:
#include"bool_ir.h"

/*******************************************
定时器1装载比较寄存器以及 定时器3操作
*******************************************/

#define T1_0_set(dat)     T1CC0L = dat; T1CC0H = dat >> 8   //通道0
#define T1_4_set(dat)     T1CC4L = dat; T1CC4H = dat >> 8   //通道4

#define T3_start()  T3CTL |= 0x10    //启动定时器3
#define T3_stop()   T3CTL &= ~0x10   //停止定时器3

uchar flag = 1;

/********************************
系统32M晶振初始化
*********************************/
void init_sck(void)
{
  CLKCONCMD &= ~0X7f;      //系统时钟源是32MHZ    hig clock
  while(CLKCONSTA & 0x40); //等待时钟稳定     
  

}


/**************************************************************************
**********************                                 ********************
                   以下部分用于红外信号PWM发射配置
**********************                                 ********************
***************************************************************************/



/**********************************
配置IR输出IO引脚  IR输出引脚 P0.6
***********************************/
void init_IR_io (void)
{
  P0SEL |= 0x40;      //P0.6 选择为外设
  P0DIR |= 0x40;      //P0.6 选择为输出
  
  
  P0_6 = 0;         
}


/*************************************
定时器1的配置初始化
**************************************/
void init_T1_timer(void)
{
  T1IE = 0;              //关闭定时器1中断
  
  T1CTL = 0x02 ;         //定时器1设定在 摸模式
  T1CCTL0 = 0x04 ;       //定时器1通道0设定在比较值清除
  T1CCTL4 = 0x74 ;       //定时器1通道4设定在110 关闭中断  在T1CC0输出 T1CC4清楚
}

/**************************************
定时器3的配置初始化
**************************************/
void init_T3_timer(void)
{
  T3IE = 0;               //关闭定时器3中断
  T3CTL = 0x46;           //定时器3设四分频,莫模式
  T3CCTL0 = 0x04;
  T3CCTL1 = 0x24;         //定时器3开通道1 设定在101 同定时器1
  
  T3CC0 = 211;            //38K载波3分之1占空比
  T3CC1 = 70;
}


/*****************************************
睡眠定时器的配置
*****************************************/

void init_SLEEP_timer(void)
{
  ST2 = 0x00;
  ST1 = 0x00;
  ST0 = 0x00;
  
  EA = 1;        //开中断
  STIE = 1;      //睡眠定时器中断使能
  STIF = 0;       //中断状态置0
}



/***************************************
设置睡眠定时器时间,用来控制周期  1*大约30uS
***************************************/
void set_ST_period(uint sec)
{
  
  ulong sleeptime = 0;  //睡眠时间
  
  sleeptime |= ST0;                     //读初始值
  sleeptime |= (ulong) ST1 << 8;
  sleeptime |= (ulong) ST2 << 16;
  
  sleeptime += sec;   //睡眠时间
  
  ST2 = (uchar)(sleeptime >> 16);        //赋值睡眠时间
  ST1 = (uchar)(sleeptime >> 8);
  ST0 = (uchar) sleeptime;
}

/*********************************************
以NEC协议格式发送
包括9MS高电平+4.5MS低电平引导码
以及发送 双字节数据
*********************************************/
void send_IR_data()         //传输数据的类型可能需要改改
{
  
  IRCTL = 0x01;        //将定时器3和定时器1连接起来 定时器3的方波用作定时器1的脉冲
  T3_start();          //启动定时器3

  // 发送9MS 的高电平+ 4.5MS 的低电平 引导码
  
  T1_0_set(513);       //9+4.5 MS
  T1_4_set(342);       //9 MS
  set_ST_period(486);  //睡眠时间14.7MS
  while( flag);      //定时时间到                           
  flag = 1;                 //清除
  
  T3_stop();   //停止定时器3
}




void main(void)
{
  init_sck();
  init_IR_io();
  init_T1_timer();
  init_T3_timer();
  init_SLEEP_timer();
  
  P2DIR = 0x01;
  P2_0 = 0;
  
  while(1)
  {
    send_IR_data();
  }
}




#pragma vector =  ST_VECTOR
__interrupt void ST_ISR(void)
{
   STIF = 0;
   
   flag = 0;
}

相关帖子

沙发
天凡云赐|  楼主 | 2015-10-11 21:27 | 只看该作者
参考      不过我是使用的定时器通道4 因为控制IR的引脚我应的P0.6  但是这个发送出来的波形  我接收只有200-500us左右~  如果用定时器3做中断  定时器1计时的方法 可以正确输出IR信号 但是占空比和CPU资源被大量占用  所以请教一下 这个定时器通道4 能否和定时器3 组合起来 输出IR波

使用特权

评论回复
板凳
天凡云赐|  楼主 | 2015-10-11 21:34 | 只看该作者
还有就是 我之前使用的睡眠定时器控制时间是这样的


set_ST_period(486);  //睡眠时间14.7MS
while( !(IRCON & 0x80));  //定时时间到
    STIF = 0;                 //清除


结果发现程序会卡死在  while( !(IRCON & 0x80));  //定时时间到这个位置  所以换成了打开ST_VECTOR的中断改成flag检测 才不会卡死~这是什么原因呢~我的睡眠定时器触发了中断好像也不会停止~和手册说的有点不一样啊~

使用特权

评论回复
地板
dirtwillfly| | 2015-10-12 08:51 | 只看该作者
用的cc2530?

使用特权

评论回复
5
天凡云赐|  楼主 | 2015-10-12 09:44 | 只看该作者

是的 CC2530

使用特权

评论回复
6
dirtwillfly| | 2015-10-12 14:25 | 只看该作者
当设置了IRGEN 位,定时器1采用定时器3通道1的输出比较信号作为标记.
建议还是按手册里的方法使用定时器

使用特权

评论回复
7
dirtwillfly| | 2015-10-12 14:26 | 只看该作者
送你个中文版的手册
cc2530中文数据手册完全版.pdf (8.99 MB)

使用特权

评论回复
8
m503022388| | 2015-10-12 16:09 | 只看该作者
我是这么做的,控制空外对管发射,也是用2530,主频是32M

void T3_Init(void)
{
  T3CTL |= 0xA0;//32分频
  
  T3CTL |= 0x02;//模计数
  
  T3CC0 = 0x64;
  
  T3CTL |= 0x10;
  T3CCTL0 |= 0x44;
   
  T3CTL |= 0x08;//中断使能
  T3IE = 1;
  EA = 1;
}

void T4_Init(void)
{
  P1DIR |= (0x01 << 1);
  P1SEL |= (0x01 << 1);
  
  CLKCONCMD = 0;        //32M
  
  T4CTL |= 0x40;        //4分频,4/32000000=0.125us
  
  T4CTL |= 0x02;        //模计数
  
  T4CC0 = 211;             //
  
  T4CC1 = 70;
  T4CCTL1 = 0x1C;
  
  T4CTL |= 0x10;           //启动
  
  T4CTL |= 0x08 ;          //开溢出中断
  
  T4IE   = 1;                //开总中断和T4中断
  
  EA = 1;                  //开总中断

}

使用特权

评论回复
9
天凡云赐|  楼主 | 2015-10-12 17:59 | 只看该作者
dirtwillfly 发表于 2015-10-12 14:26
送你个中文版的手册

谢谢你啊~ 我英文的和中文的都反复看了 ~就是那个IRCON设置了之后 输出的引脚 是不是指定了的~

使用特权

评论回复
10
天凡云赐|  楼主 | 2015-10-12 18:00 | 只看该作者
m503022388 发表于 2015-10-12 16:09
我是这么做的,控制空外对管发射,也是用2530,主频是32M

兄弟 你这个是T4中断里面 翻转电平输出的IR信号吗?

使用特权

评论回复
11
天凡云赐|  楼主 | 2015-10-12 18:04 | 只看该作者
m503022388 发表于 2015-10-12 16:09
我是这么做的,控制空外对管发射,也是用2530,主频是32M

你用的是P1.1引脚~ 我这边是公司已经做好的硬件~使用的是P0.6 定时器3和4的比较输出我都用不上~很难受啊~

使用特权

评论回复
12
天凡云赐|  楼主 | 2015-10-13 15:43 | 只看该作者
别沉啊~求急啊这个问题

使用特权

评论回复
13
m503022388| | 2015-10-14 09:53 | 只看该作者
天凡云赐 发表于 2015-10-12 18:00
兄弟 你这个是T4中断里面 翻转电平输出的IR信号吗?

是的,这个是T4输出38Khz占空比大约为30%的PWM,然后在T3中断里控制T4PWM输出的开关。

使用特权

评论回复
14
m503022388| | 2015-10-14 10:24 | 只看该作者
天凡云赐 发表于 2015-10-12 18:04
你用的是P1.1引脚~ 我这边是公司已经做好的硬件~使用的是P0.6 定时器3和4的比较输出我都用不上~很难受啊~ ...
void T1_Init(void)
{
  P0DIR |= (0x01 << 6);
  P0SEL |= (0x01 << 6);
  
  CLKCONCMD = 0;        //32M
  
  T1CTL |= 0x04;        //8分频,8/32000000 = 0.125 * 2 = 0.25us
  
  T1CTL |= 0x02;        //模计数
  
  T1CC0H = 0;             //
  T1CC0L = 211;
  
  T1CC4H = 0;
  T1CC4L = 105;
  
  T1CCTL4 = 0x34;
  
  T1IE   = 1;                //开总中断和T4中断
  
  EA = 1;                  //开总中断
}

使用特权

评论回复
15
m503022388| | 2015-10-14 10:29 | 只看该作者
天凡云赐 发表于 2015-10-12 18:04
你用的是P1.1引脚~ 我这边是公司已经做好的硬件~使用的是P0.6 定时器3和4的比较输出我都用不上~很难受啊~ ...

上面那个是用定时器1通道4输出的,可以做到T1输出载波。占空比是50%频率38Khz,T1CCTL4.CMP的三个位是101。不过吐槽下。。。定时器1这么高级的家伙只用来输出载波有点浪费的感觉。。。

使用特权

评论回复
16
eggbiscuit| | 2015-10-30 09:48 | 只看该作者
官方不会提供例程么?

使用特权

评论回复
17
裁定心生| | 2015-10-31 14:35 | 只看该作者

学习了,收藏这个例程看看。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

60

帖子

1

粉丝