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

[复制链接]
1921|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?
 楼主| 天凡云赐 发表于 2015-10-12 09:44 | 显示全部楼层
dirtwillfly 发表于 2015-10-12 14:25 | 显示全部楼层
当设置了IRGEN 位,定时器1采用定时器3通道1的输出比较信号作为标记.
建议还是按手册里的方法使用定时器
dirtwillfly 发表于 2015-10-12 14:26 | 显示全部楼层
送你个中文版的手册

本帖子中包含更多资源

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

×
m503022388 发表于 2015-10-12 16:09 | 显示全部楼层
我是这么做的,控制空外对管发射,也是用2530,主频是32M

  1. void T3_Init(void)
  2. {
  3.   T3CTL |= 0xA0;//32分频
  4.   
  5.   T3CTL |= 0x02;//模计数
  6.   
  7.   T3CC0 = 0x64;
  8.   
  9.   T3CTL |= 0x10;
  10.   T3CCTL0 |= 0x44;
  11.    
  12.   T3CTL |= 0x08;//中断使能
  13.   T3IE = 1;
  14.   EA = 1;
  15. }

  16. void T4_Init(void)
  17. {
  18.   P1DIR |= (0x01 << 1);
  19.   P1SEL |= (0x01 << 1);
  20.   
  21.   CLKCONCMD = 0;        //32M
  22.   
  23.   T4CTL |= 0x40;        //4分频,4/32000000=0.125us
  24.   
  25.   T4CTL |= 0x02;        //模计数
  26.   
  27.   T4CC0 = 211;             //
  28.   
  29.   T4CC1 = 70;
  30.   T4CCTL1 = 0x1C;
  31.   
  32.   T4CTL |= 0x10;           //启动
  33.   
  34.   T4CTL |= 0x08 ;          //开溢出中断
  35.   
  36.   T4IE   = 1;                //开总中断和T4中断
  37.   
  38.   EA = 1;                  //开总中断

  39. }
 楼主| 天凡云赐 发表于 2015-10-12 17:59 | 显示全部楼层
dirtwillfly 发表于 2015-10-12 14:26
送你个中文版的手册

谢谢你啊~ 我英文的和中文的都反复看了 ~就是那个IRCON设置了之后 输出的引脚 是不是指定了的~
 楼主| 天凡云赐 发表于 2015-10-12 18:00 | 显示全部楼层
m503022388 发表于 2015-10-12 16:09
我是这么做的,控制空外对管发射,也是用2530,主频是32M

兄弟 你这个是T4中断里面 翻转电平输出的IR信号吗?
 楼主| 天凡云赐 发表于 2015-10-12 18:04 | 显示全部楼层
m503022388 发表于 2015-10-12 16:09
我是这么做的,控制空外对管发射,也是用2530,主频是32M

你用的是P1.1引脚~ 我这边是公司已经做好的硬件~使用的是P0.6 定时器3和4的比较输出我都用不上~很难受啊~
 楼主| 天凡云赐 发表于 2015-10-13 15:43 | 显示全部楼层
别沉啊~求急啊这个问题
m503022388 发表于 2015-10-14 09:53 | 显示全部楼层
天凡云赐 发表于 2015-10-12 18:00
兄弟 你这个是T4中断里面 翻转电平输出的IR信号吗?

是的,这个是T4输出38Khz占空比大约为30%的PWM,然后在T3中断里控制T4PWM输出的开关。
m503022388 发表于 2015-10-14 10:24 | 显示全部楼层
天凡云赐 发表于 2015-10-12 18:04
你用的是P1.1引脚~ 我这边是公司已经做好的硬件~使用的是P0.6 定时器3和4的比较输出我都用不上~很难受啊~ ...
  1. void T1_Init(void)
  2. {
  3.   P0DIR |= (0x01 << 6);
  4.   P0SEL |= (0x01 << 6);
  5.   
  6.   CLKCONCMD = 0;        //32M
  7.   
  8.   T1CTL |= 0x04;        //8分频,8/32000000 = 0.125 * 2 = 0.25us
  9.   
  10.   T1CTL |= 0x02;        //模计数
  11.   
  12.   T1CC0H = 0;             //
  13.   T1CC0L = 211;
  14.   
  15.   T1CC4H = 0;
  16.   T1CC4L = 105;
  17.   
  18.   T1CCTL4 = 0x34;
  19.   
  20.   T1IE   = 1;                //开总中断和T4中断
  21.   
  22.   EA = 1;                  //开总中断
  23. }
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这么高级的家伙只用来输出载波有点浪费的感觉。。。
eggbiscuit 发表于 2015-10-30 09:48 | 显示全部楼层
官方不会提供例程么?
裁定心生 发表于 2015-10-31 14:35 | 显示全部楼层

学习了,收藏这个例程看看。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

60

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部