amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 405|回复: 24

stc15w408as比较器中断里不能写flash

[复制链接]
发表于 2019-8-26 11:17:58 | 显示全部楼层 |阅读模式
本帖最后由 myxiaonia 于 2019-8-26 11:31 编辑

我用比较器中断进行掉电保存,使用的stc的模拟eeprom,用镊子短接电阻模拟电压降,通过一个变量值已经确定进入了中断,结果重新上电发现没有保存成功  
我把掉电保存代码放在中断外是可以正常保存的

我使用stc15w408as,这个料不能在中断里写模拟eeprom吗?
 楼主| 发表于 2019-8-27 01:01:48 | 显示全部楼层
版主有stc15w408as的话,请测试下这个程序,我这里确实不能在比较器中断里写flash

test.rar

9.55 KB, 下载次数: 11

 楼主| 发表于 2019-8-26 13:30:04 | 显示全部楼层
没人能回答这个问题吗,呼叫版主
发表于 2019-8-26 13:49:58 | 显示全部楼层
是整个芯片供电都降低吗?这样的话,下载时不能勾选“低压时禁止EEPROM操作”,还有那个低压复位或中断的选项
 楼主| 发表于 2019-8-26 16:01:50 | 显示全部楼层
weavr 发表于 2019-8-26 13:49
是整个芯片供电都降低吗?这样的话,下载时不能勾选“低压时禁止EEPROM操作”,还有那个低压复位或中断的选 ...

不是的   我之前也造成误解了   后来我回过神来  你说的这个是lvd中断,等同于stm32中的lvd中断,这个中断没法用的,电压下降后写flash是不可靠的

我用的是比较器中断,是对降压前的电压用电阻分压再和内部参考源比较的

非常讨厌的是中断有了,我短接某个电阻模拟掉电,确实进入比较器中断,按理应该写flash,但是重新上电就是不行

发表于 2019-8-27 11:24:49 | 显示全部楼层
myxiaonia 发表于 2019-8-26 16:01
不是的   我之前也造成误解了   后来我回过神来  你说的这个是lvd中断,等同于stm32中的lvd中断,这个中 ...

会不会掉电太快,写入时间不够
你把指示变量放在写入之后看看
 楼主| 发表于 2019-8-27 11:58:00 来自手机 | 显示全部楼层
whatcanitbe 发表于 2019-8-27 11:24
会不会掉电太快,写入时间不够
你把指示变量放在写入之后看看

我是模拟掉电的呀,把检测脚拉低,就生成中断了,如果谁手头有板子,测试一下就知道了
 楼主| 发表于 2019-8-27 14:02:36 | 显示全部楼层
我再顶一顶
发表于 2019-8-27 16:04:37 | 显示全部楼层
本帖最后由 whatcanitbe 于 2019-8-27 16:07 编辑

你说通过一个变量判断进入中断
我的意识是你这个变量判断放到中断处理函数中保存数据的代码后面

而且你代码里面
//#define WRITE_INT
代码注释掉了,应该不会执行的
 楼主| 发表于 2019-8-27 16:34:56 | 显示全部楼层
whatcanitbe 发表于 2019-8-27 16:04
你说通过一个变量判断进入中断
我的意识是你这个变量判断放到中断处理函数中保存数据的代码后面

这个测试程序,我特意为了重现这个问题做的,你可以通过串口打印内容看到:如果成功写入,只输出8个值,否则输出11个值
发表于 2019-8-27 16:41:43 | 显示全部楼层
掉电检测,我是先把lvd中断电压设高点,进入中断再把电压设低,就可写操作了
发表于 2019-8-27 17:04:56 | 显示全部楼层
本帖最后由 whatcanitbe 于 2019-8-27 17:07 编辑
myxiaonia 发表于 2019-8-27 16:34
这个测试程序,我特意为了重现这个问题做的,你可以通过串口打印内容看到:如果成功写入,只输出8个值, ...


//#define WRITE_INT


void COMPARE_IRQHandler(void) interrupt 21 using 1
{
    age_delay = 100;
    sys[6] ++;
    #ifdef WRITE_INT
    write_pwd();
    #endif
    CMPCR1 = 0;
}


前面你把#define 注释掉了
所以你中断处理函数里面write_pwd是不执行的,并没有编译进去

不知道你测试的是不是就是这个工程?
发表于 2019-8-27 18:03:43 | 显示全部楼层
掉电写flash是个神操作,你得保证足够长的掉电时间,否则很容易冲掉代码
发表于 2019-8-27 19:21:28 | 显示全部楼层
我用STC文档推荐的方法做掉电比较器中断写flash,1年多运行良好。
近期想用5V供电,加3.3V稳压跑STC8F。采用掉电比较器中断写flash。
因担心3.3V下STC8F芯片的稳定性,一直没有尝试。
 楼主| 发表于 2019-8-27 19:34:09 来自手机 | 显示全部楼层
whatcanitbe 发表于 2019-8-27 17:04
//#define WRITE_INT



这个开关,可以演示在主循环写flash和在中断里写flash,注释掉就是在主循环里写
 楼主| 发表于 2019-8-27 19:35:08 来自手机 | 显示全部楼层
sunnyplus 发表于 2019-8-27 18:03
掉电写flash是个神操作,你得保证足够长的掉电时间,否则很容易冲掉代码

是外部电源掉电检测,不是lvd低压中断
 楼主| 发表于 2019-8-27 19:36:06 来自手机 | 显示全部楼层
su33691 发表于 2019-8-27 19:21
我用STC文档推荐的方法做掉电比较器中断写flash,1年多运行良好。
近期想用5V供电,加3.3V稳压跑STC8F。采 ...

我也是用的那种办法,但是死活不能在中断里写成功,你是哪个系列s t c
发表于 2019-8-27 19:41:14 | 显示全部楼层
myxiaonia 发表于 2019-8-27 19:36
我也是用的那种办法,但是死活不能在中断里写成功,你是哪个系列s t c ...

TEST1.rar (35.65 KB, 下载次数: 11)
发表于 2019-8-27 19:57:09 | 显示全部楼层
myxiaonia 发表于 2019-8-27 19:36
我也是用的那种办法,但是死活不能在中断里写成功,你是哪个系列s t c ...

我用STC8F2K32S2.
 楼主| 发表于 2019-8-27 21:48:21 | 显示全部楼层
weavr 发表于 2019-8-27 19:41
比较不喜欢读别人的程序,累,直接改了一下楼主的程序,简单验证应该是没问题的,楼主可以对比验证一下 ...

我尝试了下你的例子,结果真能保存,但是两者没有本质不同啊,真是百思不得其解
发表于 2019-8-27 22:07:03 | 显示全部楼层
su33691 发表于 2019-8-27 19:21
我用STC文档推荐的方法做掉电比较器中断写flash,1年多运行良好。
近期想用5V供电,加3.3V稳压跑STC8F。采 ...

STC8F的内核也是工作在1.8伏,所以5伏3.3伏供电没区别,就是对IO口速度有影响
 楼主| 发表于 2019-8-27 23:22:47 | 显示全部楼层
结贴结贴,终于发现问题了,长时间不用51生疏了

因为中断指定了寄存器组,因此它调用的子函数也必须指定寄存器组

stc没有毛病,问题在我
 楼主| 发表于 2019-8-28 14:30:57 | 显示全部楼层
weavr 发表于 2019-8-27 19:41
比较不喜欢读别人的程序,累,直接改了一下楼主的程序,简单验证应该是没问题的,楼主可以对比验证一下 ...

谢谢你,终于找到了问题所在,是程序的问题,不是stc的问题
发表于 2019-8-28 22:26:57 | 显示全部楼层
再次强调:现在的KEIL C已经很智能,中断函数不要指定寄存器组,否则KEIL编译时反而不好处理局部变量,造成编译的结果有问题,但是KEIL不会提示有问题。
发表于 2019-8-28 23:27:57 | 显示全部楼层
小李非刀 发表于 2019-8-28 22:26
再次强调:现在的KEIL C已经很智能,中断函数不要指定寄存器组,否则KEIL编译时反而不好处理局部变量,造成 ...

现在KEIL C已经能够自动分配寄存器组了吗,而不是把所有用到的寄存器一个一个的压入堆栈
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-9-15 18:51

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表