实验三 CC2530平台上CC2530平台上定时器组件的TinyOS编程
实验目的:
- 加深和巩固学生对于TinyOS编程方法的理解和掌握
- 让学生初步掌握CC2530定时器的PWM功能,及其TinyOS编程方法
- 学生通过本实验能够初步的了解和掌握TinyOS编程的整个过程
- 提高学生的上机和编程过程中处理具体问题的能力
实验要求:
- 实验要求自己独立的完成;
- 编写和调试过程中出现的问题要做好记录,并事后总结到报告中
- 实验程序调试完成后, 用给定的平台进行测试,由老师检查测试结果,并给予相应的成绩
- 实验完成后,要上交实验报告。
实验内容:
- 开发一个新的应用,能够利用Timer1或者Timer3或者Timer4的PWM功能,实现对LED灯亮暗的连续变化。
- 首先使得LED灯可以周而复始的由暗变亮,再由亮变暗;
- 然后在上述基础上加入按键功能实现按下逐渐变亮,放开逐渐变暗的功能。
- 在实验报告中分别给出上述两个阶段的源码。
实验代码:
(1)配置文件PWMAppC.nc
configuration PWMAppC
{ }
implementation{
components MainC;
components PWMAppM as App;
App.Boot->MainC.Boot;
components LedsC; //LED组件
App.Leds -> LedsC.Leds;
components HplCC2530GeneralIOC as GPIO;
App.OkKey->GPIO.P0_Port[1];
components new TimerMilliC() as Timer1;
App.Timer1 -> Timer1;
}
(2)模块文件PWMM.nc
module PWMAppM
{
uses interface Boot;
uses interface Leds;
uses interface Timer<TMilli> as Timer1;
uses interface GeneralIO as OkKey;
}
implementation{
int CNT=0;
uint8_t OkValue; //键值变量
enum {NoKey,KeyDown,KeyUp};//按键状态
uint8_t OkState; //按键状态变量
task void test(){}
event void Boot.booted()
{
P1SEL |= 0x01;
call OkKey.makeInput(); //设置为输入
call Leds.set(0);
OkState=NoKey;
OkValue=1;
T4CC0=0xFF;
T4CCTL0 |= BV(2);
T4CCTL0 |=(0x5 << 3);
T4CTL |= BV(2);
call Timer1.startPeriodic(20);
}
event void Timer1.fired()
{
OkValue=call OkKey.get();//获取键值
switch(OkState)
{
case NoKey:
if(OkValue==0)
OkState=KeyDown;
break;
case KeyDown:
if(OkValue==1)
OkState=KeyUp;
else
{
if(CNT<100)
CNT++;
else
CNT=100;
}
break;
case KeyUp:
if(OkValue==1)
{
if(CNT>0)
CNT--;
else
CNT=0;
}
else{
OkState=KeyDown;
}
break;
}
T4CC0=CNT;
}
}
(3)makefile 编译文件
COMPONENT=PWMAppC
include $(MAKERULES)
实验环境:
- 上位机操作系统为WindowsXP,在Cygwin环境下编译
2. 集成开发环境为Notepad++
event void Boot.booted()
{
call Leds.set(0xf);
T4CC0=0xFF;
T4CCTL0 |= BV(2);
T4CCTL0 |=(0x5 << 3);
T4CTL |=BV(2);
T4CTL |=BV(CC2530_T34CPL_START);
call Timer1.startPeriodic(50);
}
实验报告人:木舟 报告时间:2018.11.16