vb2002
发表于 2024-8-4 19:55:55
wnagming 发表于 2024-8-4 18:32
看看你的代码,逻辑有问题,Switch(dat) 你没有获取dat的数据,跑不了
switch可以跑,但是那个else里面不行,我是直接把那个switch剪切到那个中段里面,好几种办法我都试了,可以正常循环,但是就是不可以记忆上次的亮度
vb2002
发表于 2024-8-4 23:24:09
现在是 switch里面没问题..就是过了3秒不能执行 还是会换挡
vb2002
发表于 2024-8-5 10:56:04
wnagming 发表于 2024-8-5 06:16
这个程序的问题是不能检测什么时候关机,所以就不检测了,每次开机按照原来的代码切换亮度,然后时间过了 ...
好像懂了,,就是再程序开头已经定型了.
后面想加检测,不好加了.
只能通过曲线救国的方法来了
3秒内eepromid +1 ,,3秒后+2,来达到目的..
确实是有点浪费,我先实现功能先.
vb2002
发表于 2024-8-5 13:29:41
wnagming 发表于 2024-8-5 13:04
你在中断中写小于3S改EEPROM中的数据,大于3S不改,你怎么知道什么时候关机,要是不知道,那么我4S关机, ...
比如我是4个档位
正常是 eepromid +1
那我设定
if(time<=3000)
eepromid +1
else
eepromid +3(正好是一个循环回来这个档,,不过有点浪费eeprom)
李鑫发
发表于 2024-8-5 14:24:47
加个铁电吧,这样就不用考虑FLASH的寿命了{:lol:}
vb2002
发表于 2024-8-5 15:59:52
李鑫发 发表于 2024-8-5 14:24
加个铁电吧,这样就不用考虑FLASH的寿命了
手电驱动本来空间就小,不说成本,就是空间也捉襟见肘
Lkck8210
发表于 2024-8-5 16:26:54
本帖最后由 Lkck8210 于 2024-8-5 16:31 编辑
可以善用EEProm可写零的原理
上电后每375ms清零一个bit
关机再开机后读取EEProm,不等于零代表上次开机没到3秒,等于零代表过了3秒
流程如下
vb2002
发表于 2024-8-5 17:35:27
把这个判定放在初始化去?
然后上电就判定一次,判定3000ms
我去试试...
vb2002
发表于 2024-8-5 17:37:14
Lkck8210 发表于 2024-8-5 16:26
可以善用EEProm可写零的原理
上电后每375ms清零一个bit
关机再开机后读取EEProm,不等于零代表上次开机没到3 ...
这个逻辑是不是 过了3s就卡一个eeprom的数值,让其不为ff,就写不进去了. 然后就是读取当前值
好像是可以实现.
vb2002
发表于 2024-8-6 02:25:53
wnagming 发表于 2024-8-5 20:49
这个方法需要好好理解一下,新手不太容易想明白,而且我说的方法只需写入1-2次,我觉得我的方法比较好 ...
已经成功了.
第一次是第一个代码,,,但是在2亮度那个档位,会时不时跳到0 去,有时灵,有时不灵...第二个方案是按你说的+2...试了很多次,,除了3秒内的换挡有时候会错乱...3秒后的基本不会错....为什么会错,我想不明白void Timer0_Isr(void) interrupt 1
{
if(time<=100)
{
switch(dat)
{
case 253: IapProgram(EEPROMId+1,2);break;
case 2: IapProgram(EEPROMId+1,16);break;
case 16: IapProgram(EEPROMId+1,56);break;
default: IapProgram(EEPROMId+1,253);break;
}
}
else
{
switch(dat)
{
case 2:IapProgram(EEPROMId+2,dat);break;
case 16: IapProgram(EEPROMId+2,dat);break;
case 56: IapProgram(EEPROMId+2,dat);break;
case 253: IapProgram(EEPROMId+2,dat);break;
default:IapProgram(EEPROMId+2,2); break;
}
}
if(time<=200) time++;
}