微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > zstack协议栈中端口状态已经改变,但是不能给全局变量赋值

zstack协议栈中端口状态已经改变,但是不能给全局变量赋值

时间:10-02 整理:3721RD 点击:

void write_my_para()
{
if(P0 != switchstatus)
{
//osal_nv_item_init( ZCD_NV_OUT_STAT, 1, NULL );
switchstatus = P0;
}
}

在zstack协议栈里使用编写的这段代码,函数功能是当P0端口状态改变之后把新的状态值保存到一个全局变量。每次协调器发送控制指令P0端口都会响应,但是进不了if语句。

有两种情况可以进if语句保存P0端口新状态:一种方法是把同一条指令发送两遍;另一种方法是调试的时候设置了断点,可以一次进入。

请问这个问题出在什么地方?是速度太快吗?如果速度太快的话为什么第二次就可以改写状态,还是P0口需要其他的设置。

从现象来看是,它应该是需要一个应答时间的等待,写个微秒级的delay就行了

你看下编译器的设置,看设置编译和调试的过程中有没有选择优化的选项。如果是优化编译,可能有时候就会出问题。你可以关掉优化,试试。

建议P0口接上拉电阻!

另外switchstatus初始值是多少?感觉需要定义两个变量的。

编译的时候可以运行吗,可能是MCU反应不过来

应该需要加入一个延时吧

你把全局变量 switchstatus 设置成violatle int volatile  这样子 看看  ,有可能是你全局变量的原子性问题。从而导致你读错的  。要不你先把P0口读出给一个临时变量,看看。就可以知道是不是这个问题了。

编译软件设置正确吗? 速度太快?慢一点试试出不出错?

谢谢你的帮助!我参照你的方法试过了,加了一个100us的延时,还是不行!

谢谢你的帮助!你的方法我也试过了!刚开始的时候我的编译选项是High——balanced,改成None也不行

谢谢你的回复!我感觉现在不是P0口加上拉电阻的问题,这个引脚可以设置为输出模式,而且现在不是P0口不能动作,而且动作和状态寄存器值不能同步,本来端口状态已经改变,但是寄存器值没有发生变化。需要将同样的命令再发送一遍,这个时候端口的寄存器值才会更新,而实际上端口状态在第一次发送控制命令的时候已经变了。

switchstatus是一个全局变量,保存P0端口当前最新状态用的。

谢谢你的回复!程序可以运行,除了端口控制命令需要发送两次之外都正常。

谢谢你的回复!延时加了也不行!感觉不是延时的问题

在执行if语句的时候,CPU会去读取P0的端口状态,这个时候应该确认指令是否还处于应该的状态。

可以尝试两个试一下:一P0加10K上拉电阻

2,我觉得是不是PO的数据溢出了呢,用串口打印看一下

有可能是P0口响应有一定的时间延迟,速度太快状态还在保持状态。

P0表示的是一个port,8个口,你应该只需要一个pin就可以了吧

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top