无线传感网络操作系统实验2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
LED_YELLOW_TOGGLE;
i++;
}
/**启动事件处理函数,在TimerLed.nc已经关联到MainC.Boot接口
系统启动后会调用此函数
*/
event void Boot.booted()
{
/**定时器1:持续工作,每隔1s触发一次*/
call Timer1.startPeriodic(1000);
}
else
{
LED_YELLOW_OFF;
}
}
}
3.简述定时器三个工作模式。
答:
1)自由运行模式
2)取模模式
3)递增计数/递减计数模式
4)通道模式控制
4.时钟分频有哪几种?
答:计数分频和取反分频
八、附录
实验名称
1、LED组件实验
2、CC2530定时器组件实验
3、CC2530串口组件通信实
4、ATOS点对点通信实验
1.将ATOS多模汇聚节点同电脑用烧录线连接好,打开其中任意WIFI节点的电源开关,同时将WIFI节点对应的编程开关打开。
2.打开Cygwin开发环境。
3.在Cygwin界面中执行cd apps/Demos/Basic/Timer,进入到定时器实验目录下。
4.在定时器代码目录下执行make antc5 install,进行编译和烧录。
无线传感器网络实验报告
班级: _14104341_姓名:__代姝佳__学号:_1410400111__
时间:2017-3-22_教师:_陈飞云__成绩ห้องสมุดไป่ตู้_________
实验名称:CC2530定时器组件实验
一、 实验目的
1.了解CC2530芯片的定时器。
2.学会使用CC2530芯片的定时器。
二、实验原理
/*定时器2:持续工作,每隔3s触发一次*/
call Timer2.startPeriodic(3000);
}
/*定时器1的事件处理函数*/
event void Timer1.fired()
{
/*事件处理中直接切换蓝色LED灯*/
ADBG(5, "led red toggle./r/n");
LED_RED_TOGGLE;
2.打开Cygwin开发环境。
3.在Cygwin界面中执行cd apps/Demos/Basic/Timer,进入到定时器实验目录下。
4.在定时器代码目录下执行make antc5 install,进行编译和烧录。
5.实验现象为WIFI节点上蓝灯1秒闪一次,黄灯3秒闪一次。
四、 实验过程
1)详细的调试步骤
定时器向上层提供的接口分为Timer和Alarm两种,使用Timer接口需要指定定时器的精度,分为TMilli(毫秒)、T32kHz(32KHz)、TMicro(微秒)三种;使用Alarm接口既要指定定时精度,还要指定定时器的位宽。
三、实验内容
1.将ATOS多模汇聚节点同电脑用烧录线连接好,打开其中任意WIFI节点的电源开关,同时将WIFI节点对应的编程开关打开。
5、ATOS射频广播实验
6、ATOS数字传感器采集实验
7、 无线远程点灯实验
8、 无线远程控制采集实验
}
}
/** \file
定时器示例程序的实现模块,间隔点亮两个LED灯
\author NUAA
\date
*/
configuration TimerLed
{
}
implementation
{
components TimerLedM; /* TimerLed模块程序,用于实现具体代码*/
components MainC; /* TinyOS2主模块,这里用于关联系统启动*/
TimerLedM.Timer1 -> Timer1;
/**
使用系统毫秒级Timer组件新建第二个定时器
*/
components new TimerMilliC() as Timer2;
TimerLedM.Timer2 -> Timer2;
components new TimerMilliC() as Timer3;
5.实验现象为WIFI节点上蓝灯1秒闪一次,黄灯3秒闪一次。
2)实验现象
在定时器代码目录下执行make antc5 install,进行编译和烧录。界面显示成功烧录,WIFI节点上蓝灯1秒闪一次,黄灯3秒闪一次。
3)必要的实验数据
#define DBG_LEV 5
module TimerLedM
{
uses interface Boot;
}
/**启动事件处理函数,在TimerLed.nc已经关联到MainC.Boot接口
系统启动后会调用此函数
*/
event void Boot.booted()
{
/**定时器1:持续工作,每隔1s触发一次*/
call Timer1.startPeriodic(1000);
/**定时器2:持续工作,每隔3s触发一次*/
CC2530芯片包含四个定时器(Timer1、Timer2、Timer3、Timer4)和一个休眠定时器(Sleep Timer)和一个看门狗定时器。
Timer1是16位的定时器,支持典型的定时/计数功能以及PWM功能,该定时器共有5个捕捉/比较通道,每个通道使用一个单独的I/O引脚。Timer1的时钟频率是由系统时钟分频得到,首先由寄存器中的CLKON.TICKSPD分频;分频后的时钟频率可以被T1CTL.DIV分频,分频数为1、8、32、128。因此,在32MHz的系统频率下,Timer1的最小时钟频率为1953.125Hz,最大时钟频率为32MHz。
module TimerLedM
{
uses interface Boot;
/* Timer为系统接口TMilli指明了定时器的精度为毫秒*/
uses interface Timer<TMilli> as Timer1; /* as关键字为接口别名*/
uses interface Timer<TMilli> as Timer2;
Timer2主要用于为802.15.4标准中的CSMA/CA算法提供定时。该定时器即使在节点处于低功耗状态下仍然运行。
Timer3和Timer4是两个8位的定时器,主要用于提供定时/计数功能。
Sleep Timer主要将节点从超低功耗工作状态唤醒。
TinyOS系统下,定时器组件一般为通用组件(generic components),通用组件类似于C++中的类,可以通过new来实例化最多255个定时器,类似于类实例化的对象。在Antc5下,定时器通用组件为TimerMilliC,是Timer1提供的,此外,Timer1还提供了Alarm32khzC等组件。
TimerLedM.Timer3 -> Timer3;
}
2.尝试用GeneralIO接口中的toggle( )命令编写代码控制蓝灯和黄灯闪烁,书上例子。
#define DBG_LEV 5
module TimerLedM
{
uses interface Boot;
/* Timer为系统接口TMilli指明了定时器的精度为毫秒*/
/* TimerLed模块程序的Boot接口与系统Boot接口关联
这样系统启动时会调用LedM的Boot接口?*/
TimerLedM.Boot -> MainC.Boot;
/**
使用系统毫秒级Timer组件新建第一个定时器
并且接口关联到TimerLedM处理模块
*/
components new TimerMilliC() as Timer1;
task void ToggleLedGreen()
{
LED_GREEN_TOGGLE;
}
/*启动事件处理函数,在TimerLed.nc已经关联到MainC.Boot接口
系统启动后会调用此函数*/
event void Boot.booted()
{
/*定时器1:持续工作,每隔1s触发一次*/
call Timer1.startPeriodic(1000);
七、习题答案
1.通过定时器让黄灯闪烁三次后停止闪烁,然后让蓝灯一直处于亮状态。
1.1实验现象如下:
在定时器代码目录下执行make antc5 install,进行编译和烧录。界面显示成功烧录,WIFI节点上黄灯闪烁三次后停止闪烁,然后让蓝灯一直处于亮状态。
1.2实验代码如下:
#define DBG_LEV 5
{
LED_YELLOW_OFF;
LED_BULE_ON;
call Time1_stop();
call Time2_stop();
}*/
event void Timer3.fired()
{
LED_YELLOW_OFF;
LED_BLUE_ON;
call Timer2.stop();
call Timer1.stop();
}
/*定时器2的事件处理函数*/
event void Timer2.fired()
{
ADBG(5, "led green toggle./r/n");
post ToggleLedgreen();
}
}
五、软件组成
1.ATOS物联网教学实验平台实验箱
2.烧录线一根
六、总结分析
该实验完成了对CC2530芯片的定时器的使用,通过LED来表现定时器的工作过程。在这个实验中用的定时器的精度为毫秒。这个实验中只使用了定时器的几个最重要的功能,还有好多接口都没有使用,比如timer.stop(),timer.isRunning()等,我们可以在课后自己动手尝试使用这些接口的功能。
uses interface Timer<TMilli> as Timer3;
//uses interface Timer<Tmilli> as Timer3;
}
implementation
{
/**任务:切换黄色LED灯*/
task void ToggleLedYellow()
{
LED_YELLOW_TOGGLE;
if (i<=3)
{
LED_BLUE_TOGGLE;
}
else
{
LED_BLUE_ON;
}
}
/**定时器2的事件处理函数*/
event void Timer2.fired()
{
ADBG(5, "led yellow toggle.\r\n");
if (i<=3)
{
post ToggleLedYellow();
ADBG(5, "led blue toggle.\r\n");
LED_BLUE_TOGGLE;
}
/**定时器2的事件处理函数*/
event void Timer2.fired()
{
ADBG(5, "led yellow toggle.\r\n");
post ToggleLedYellow();
}
/*event void Timer3.fired()
/**定时器2:持续工作,每隔3s触发一次*/
call Timer2.startPeriodic(3000);
}
/**定时器1的事件处理函数*/
event void Timer1.fired()
{
/**事件处理中直接切换蓝色LED灯*/
ADBG(5, "led blue toggle.\r\n");
uses interface Timer<TMilli> as Timer1; /* as关键字为接口别名*/
uses interface Timer<TMilli> as Timer2;
}
implementation
{
/**任务:切换黄色LED灯*/
int i=0;
task void ToggleLedYellow()
call Timer2.startPeriodic(3000);
call Timer3.startPeriodic(18000);
//call Timer3.startPeriodic(18000);
}
/**定时器1的事件处理函数*/
event void Timer1.fired()
{
/**事件处理中直接切换蓝色LED灯*/
/* Timer为系统接口TMilli指明了定时器的精度为毫秒*/
/* as关键字为接口别名*/
uses interface Timer<TMilli> as Timer1;
uses interface Timer<TMilli> as Timer2;
}
implementation
{
/*任务:切换黄色LED灯*/
相关文档
最新文档