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++;
       
}

页: 1 [2] 3 4 5
查看完整版本: 被这个代码卡脖子了..有大佬伸出援助之手吗?