实验五 DIO中断实验
一、实验内容
1. 分别为 Coordinator 和 EndDevice 设计一个程序,运用 DIO 中断的方式分别用按键控制切换对方对应 LED 亮/灭状态。如 Coordinator 的 SW3 控制 EndDevice 的 LED3,EndDevice 的SW0 控制 Coordinator 的 LED0 等等。
2. 分别为 Coordinator 和 EndDevice 设计一个程序,运用 DIO 中断的方式分别用 DIO4、DIO5、DIO6、DIO7 切换对方相应 LED 亮/灭状态。如 Coordinator 的 DIO4 控制 EndDevice 的 LED0,EndDevice 的 DIO5 控制 Coordinator 的 LED1 等等。
二、实验原理
1. 介绍几个常用函数:
(1) vAHI_DioSetDirection( )函数
该函数用来设置DIO引脚的方向(输入或输出),
(2)vAHI_DioInterruptEdge( )函数
当某个 DIO 作为输入引脚时,则用该函数设置中断产生时是采用上升沿还是下降沿触 发。该函数的原型如下:
void vAHI_DIOInterruptEdge ( uint32 u32Rising, uint32 u32Falling ); u32Rising 对应为1表示文上升沿触发中断,其中21—31没有用 u32Falling 对应为1 表示下降沿触发中断,其中21—31没有用
注:该函数仅将 u32Rising 中为 1 的位对应的引脚设置为上升沿触发中断,u32Falling 中为
的位对应的引脚设置为下降沿触发中断,没有涉及到的引脚保持它原来的状态。如果某一个 引脚在 u32Rising 和 u32Falling 中都进行了设置,则默认为上升沿触发。该函数仅对设置为 输入的 DIO 引脚有效。如果一个 DIO 引脚已安排给另一个外设且该外设已启用,则该函数 对该 DIO 引脚不产生影响。
(3) vAHI_DioInterruptEnable( ) 函数
当某个 DIO 作为输入引脚时,则该函数用来设置接收或屏蔽该引脚发来的中断,及使 能/屏蔽中断。该函数的原型如下:
void vAHI_DIOInterruptEnable (uint32 u32Enable, uint32 u32Disable);
注:该函数仅使能 u32Enable 中为 1 的位对应的引脚中断,屏蔽 u32Disable 中为 1 的位对应 的 引脚中断 ,没有涉 及到的引 脚保持它 原来的状 态。如 果某一个 引脚在 u32Enable 和 u32Disable 中都进行了设置,则默认为屏蔽中断。该函数仅对设置为输入的 DIO 引脚有效。 如果一个 DIO 引脚已安排给另一个外设且该外设已启用,则对该 DIO 引脚不产生影响。DIO 引脚中断可用来唤醒处于睡眠模式的设备。 (4)JZA_vPeripheralEvent( )函数
该函数在中断上下文时调用,即微处理器在执行中断处理程序的过程中调用,用于处理硬件中断。 该函数的原型为:
PUBLIC void JZA_vPeripheralEvent(uint32 u32Device, uint32 u32ItemBitmap);
16
2. DIO中断实验,主要是采用使用DIO口中断实现,当有按键按下时,对应的DIO口就会有电平的变换。当有下降沿时就会触发中断。就会响应中断响应函数JZA_vPeripheralEvent( )函数。发送数据,EngDevice接受数据点亮对应LED灯。同样EngDevice也是一样,又中断就响应中断函数。Coordinator就收数据处理点亮LED灯。除外还有去抖动函数,
三、软件设计
1. 程序流程图:
冷启动初始化函数冷启动初始化函数Coordinator建网N EndDevice建网N 建 网?等待 建 网?等待Y改变灯状态表示建成Y改变灯状态表示建成N节点加入?Y设置Coordinator的中断DIO9,10,11,20N等待中断发生?Y调用Coordinator发送数据函数Coordinator接受数据处理 点亮对应的LED灯等待中断发生?节点加入?YN设置EndDevice的中断DIO9,10,11,20调用EndDevice发送数据函数EndDevice接受数据处理 点亮对应的LED灯
此处用到DIO口中断,当网络建成,并节点也加入;扫描是否有DIO9,10,11,20 有中断,有发送协议数据。当EndDevice接受端接受到协议数据点亮对应的LED灯。同样 EndDevice有中断产生,也发数据;此时Coordinator接受数据点亮对应的LED灯。 2.
第二题原理与第一题一样,只是第一题是通过按键产生DIO口中断,本题采用给对应的DIO口高低电平来产生中断实现。 流程图如下:
17
建网N成功入网Y入网N成功YNN成功YNCoordinator中断DIO4?YEndDevice中断NDIO4?YNDIO5DIO5YYDIO6YDIO7DIO6Y响应对应中断响应对应中断发送数据接收数据控制对应LED灯响应对应中断响应对应中断发送数据接收数据控制对应LED灯DIO7
四、实验结果与分析
1. 实验现象: 按动Coordinator的SW0—SW3,分别点亮EndDevice的LED0—LED3亮,再按动EndDevice的SW0—SW3,分别Coordinator的LED0—LED3亮。再次按下对应的按键,将点亮的LED灯熄灭。
分析:按下按键,松手时就会产生一个下降沿,触发中断。发送数据 ,接受数据的那端就会点亮对应的LED灯;从而实现了题目要求。
2.实验现象:给Coordinator的DIO4口一个电平触发,EndDevice的LED0亮,给EndDevice的DIO4口一个电平触发,Coordinator的LED0亮。Coordinator的DIO5口一个电平触发,EndDevice的LED1亮,给EndDevice的DIO5口一个电平触发,Coordinator的LED1亮。 给Coordinator的DIO6口一个电平触发,EndDevice的LED2亮,给EndDevice的DIO6口一个电平触发,Coordinator的LED2亮。 给Coordinator的DIO7口一个电平触发,EndDevice的LED3亮,给EndDevice的DIO7口一个电平触发,Coordinator的LED3亮。再次给相应DIO口电平触发,对应的LED灭。 分析:Coordinator建网成功,EndDevice节点加入成功后,获得各自的短地址实现相互之间的通信。通过在程序中设置中断函数及相应的DIO口作为中断口,且对LED设定了相应的程序,从而实现了相应的灯的控制。
五、存在问题和解决方法
1. 在进行按键产生中断时,由于按键的不灵敏性,按键按下产生混乱现象,通过查明原因,由于在使用按键时没有加入按键去抖动程序。通过加入去斗程序,效果明显改善。当下降沿来到时LED灯的状态改变。
2、再设计第二程序时,我们要找到对应的DIO口,开始实验效果不正确,经发现有写DIO口上电时呈现的是低电平,所以不能像以前那样通过接地给个下降沿。于是我调用个拉高函数 vAHI_DioSetPullup ( ),将一些引脚拉高,这样通过接地可以产生下降沿。
3.去抖动程序,用源程序发现数据发了两次,后来知道硬件问题,在屏蔽中断发了一次,于是我们采用了以前的按键去抖动程序。
18
实验六 定时器实验
一、实验内容
1. 设计一个程序,运用 Timer1 中断实现流水灯,周期 1 秒。
2. 设计一个程序,初始化 DIO16(LED0)为输入,运用 Timer0 PWM 输出控制 LED0 的亮灭状态,一个周期内亮 2 秒,灭 1 秒。
二、实验原理
1. 三个定时器函数:
(1)vAHI_TimerEnable ( )函数
该函数用来使能指定的定时器,并为该定时器设置参数。
void vAHI_TimerEnable ( uint8 u8Timer,
uint8 u8Prescale, bool_t bIntRiseEnable, bool_t bIntPeriodEnable, bool_t bOutputEnable);
各参数的具体含义描述如下:
注:u8Timer:定时器的标识,在JN5121/JN513x微控制器中有两个应用级定时器/计数器, 用E_AHI_TIMER_0和E_AHI_TIMER_1分别标识Time0和Timer1。
u8Prescale:时钟的预分频值,它的最大值为16。分频后的频率为原频率的1/2 。 bIntRiseEnable:该参数值为TRUE时,当定时器的输出变为高电平时使能中断。 bIntPeriodEnable:该参数值为TRUE时,当定时器的一个周期到且输出变为低电平时, 使能中断。
bOutputEnable:该参数值为TRUE时,使定时器的输出出现在与PWM相关的输出引脚上。 Timer0 使用DIO8-10引脚,Timer1使用DIO11-13引脚
(2) vAHI_TimerClockSelect ( )函数
选择内部或外部时钟,当使用内部时钟时要设置输出门。该函数的原型如下:
void vAHI_TimerClockSelect( uint8 u8Timer, bool_t bExternalClock, bool_t bGateControl);
注:各参数的具体含义描述如下:
u8Timer:定时器的标识,与函数vAHI_TimerEnable )中的用法相同,用E_AHI_TIMER_0 和E_AHI_TIMER_1分别标识Time0和Timer1。
bExternalClock:该参数值为TRUE,表示使用外部时钟;为FALSE,表示使用16MHz 的内部时钟。
bGateControl:该参数值为TRUE时,表示当定时器的门输入是高电平时,打开输出引脚; 为FALSE时,表示当定时器的门输入为低电平时,打开输出引脚。
3)AHI_TimerStartRepeat ( )函数
设置重复定时器。该函数的原型如下:
void vAHI_TimerStartRepeat( uint8 u8Timer, uint16 u16Hi, uint16 u16Lo);
注:各参数的具体含义描述如下:
u8Timer: 定时 器的标 识, 用E_AHI_TIMER_0 和E_AHI_TIMER_1分别标 识Time0和
19
Timer1。
u16Hi:该参数值表示在开始一个定时器之后,在定时器的输出变为高电平之前经历的 时钟周期数。
u16Lo:该参数值表示在开始一个定时器之后,在定时器的输出变为低电平之前经历的 时钟周期数。即定时器有效时间内的时钟周期数。
2. 定时间计算:
T=1/16MHz×2 ×u16Lo,定时周期计算公式 3. 中断响应函数:JZA_vPeripheralEvent( )
定时器定时时间到时,就会响应定时器中断响应函数:JZA_vPeripheralEvent( )函数。在 Jennic ZigBee 协议栈处理硬件中断时调用,定时器中断也属于外部中断,
三、软件设计
1.
开始建网N建成Y按SW0启动定时按SW1停止定时器响应中断Y控制LED亮延迟时间1s
流程图分析:建网入网成功后,等待按键SW0 来启动定时器,当按下SW0时,定时器开始定时,定时时间为1S,一秒到响应定时器中断响应函数,控制LED的流水灯(程序前面相似);在按下SW1时,关闭定时器,从新开启时,接着上次LED的地方顺序执行。 2.
20
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库通信新技术综合训练报告在线全文阅读。
相关推荐: