sballbobo 发表于 2013-7-23 05:29:43

08A写EEPROM遇到奇怪问题.-----时间问题

在做灯控系统,用的08A-sop8芯片.
程序写好了,但发现一开始的时候,灯都会闪几灯,一直对程序进行分析,最终发现是写EEPROM时引起的.

现在写了个实验模式,LED每10MS反转一次.然后我的程序要求在第100MS,300MS,3S的时候向EEPROM写一个字节的数据.

问题来了.写EEPROM写数据的时候,不知道是不是子程序占用时间过长,在以述三个时间的时候,能看到LED闪一下.意思就是,本来LED亮10MS,灭10ms,在第100MS的时候写EEPROM,刚好LED在灭10MS的状态,这时不知道是不是写EEPROM占用时间过长,LED灭的时候超过10ms,就会明显看到LED灭一下.(本来10MS反转一次,看到的LED是半亮状态的,不细心不会看到闪烁,只是半亮状态)

在上述三个时间写EEPROM的时候,LED都会灭一下.


然后一步步分析可能出现问题的语句,最后注释掉"EEDR=data;"这句后,就完全正常了,难道这句占用时间太多???有谁能帮我解决一下这个问题吗?

注:EEPROM子程序是完全照搬LGT手册上的例程,前后加多开关全局中断的指令.

sballbobo 发表于 2013-7-23 05:48:53

LGT单片机,有内部EEPROM读写的硬件电路吧?应该数据送进去了,自动读写吧?PC指针不会停止在等待吧?

而且我上面注释掉就正常的那句,只是传送数据到寄存器而已,是不是我写错了什么?

sballbobo 发表于 2013-7-23 05:52:04

我在想,LGT是利用程序FLASH做EEPROM的,是不是在写EEPROM的时候,程序PC指针指向EEPROM的地址,从而本身的程序暂停运行了.

LGT 发表于 2013-7-23 09:18:27

sballbobo 发表于 2013-7-23 05:52 static/image/common/back.gif
我在想,LGT是利用程序FLASH做EEPROM的,是不是在写EEPROM的时候,程序PC指针指向EEPROM的地址,从而本身的程序 ...

是的, 内部的E2PROM是用FLASH模拟出来的, 当写E2PROM时, PC会hold住,直到写完成。 一次写操作的时间在30~40ms左右。

sballbobo 发表于 2013-7-23 15:18:38

LGT 发表于 2013-7-23 09:18 static/image/common/back.gif
是的, 内部的E2PROM是用FLASH模拟出来的, 当写E2PROM时, PC会hold住,直到写完成。 一次写操作的时间 ...

难怪了。30-40MS刚好看到LED闲一下。这个有什么好的解决办法?在EEPROM读写的时候也能做到其它程序照常运行?

xwkm 发表于 2013-7-23 23:48:16

sballbobo 发表于 2013-7-23 15:18 static/image/common/back.gif
难怪了。30-40MS刚好看到LED闲一下。这个有什么好的解决办法?在EEPROM读写的时候也能做到其它程序照常运 ...

外挂EEP咯……

xwkm 发表于 2013-7-23 23:48:59

另外就是建议用PWM控制灯。这样就不会闪了

sballbobo 发表于 2013-7-24 17:30:05

xwkm 发表于 2013-7-23 23:48 static/image/common/back.gif
外挂EEP咯……

可以外挂的话就有更便宜的芯片了,呵呵。体积限制啊。

sballbobo 发表于 2013-7-24 17:35:32

xwkm 发表于 2013-7-23 23:48 static/image/common/back.gif
另外就是建议用PWM控制灯。这样就不会闪了

写EEPROM时,PC指针应该是停止了,也就是说程序不会运行,那么那些延时什么的,都会暂停下来,原来延时10MS,就会变成30-40MS了,就是这里出现闪烁的现像了。所以用硬件PWM,应该也是一样。我现在是用软件PWM控制渐变,但有其它模式也是正常灯正常灭的。

xwkm 发表于 2013-7-24 23:38:53

那么暂存下数据。等待系统稳定后再写嘛

sballbobo 发表于 2013-7-25 04:13:00

xwkm 发表于 2013-7-24 23:38 static/image/common/back.gif
那么暂存下数据。等待系统稳定后再写嘛

系统功能限制,要在3秒左右保存一个数据.而如果灯是快闪模式,或是渐变模式,这时就很容易看到灯""闪""了一下.
我想请教一下,08A里面504字节的EEPROM,是不是一次全部擦除的?例如在地址0已经有一个数据1,我在地址1写数据的时候,他是不是先全部擦出504字节的空间,然后写地址0,再写地址1?是不是在504字节空间内,任何一个位置有数据,那么其它位置写数据的时候,都会先全部擦除?
我现在是想了解清楚里面的运行过程,看有没有办法分步操作,尽量减小这个暂停时间,只要不让用户擦觉出来就行.

rei1984 发表于 2013-7-25 08:03:37

sballbobo 发表于 2013-7-25 04:13 static/image/common/back.gif
系统功能限制,要在3秒左右保存一个数据.而如果灯是快闪模式,或是渐变模式,这时就很容易看到灯""闪""了一 ...

那是不可能的。 504 total erase!

Flash 模拟一般是差除一页,然后写一页。30_40ms的确慢了很多。

xwkm 发表于 2013-7-25 08:49:51

sballbobo 发表于 2013-7-25 04:13 static/image/common/back.gif
系统功能限制,要在3秒左右保存一个数据.而如果灯是快闪模式,或是渐变模式,这时就很容易看到灯""闪""了一 ...

不是。是如果侦测到你写的位置本身的值AND你写入的值不等于你写入的值的话,就擦除重写。
所以技巧是你可以在不同的地址上存值。这样写入时间就会变短。或者使用1<<数据法写。

sballbobo 发表于 2013-7-27 03:16:06

xwkm 发表于 2013-7-25 08:49 static/image/common/back.gif
不是。是如果侦测到你写的位置本身的值AND你写入的值不等于你写入的值的话,就擦除重写。
所以技巧是你可 ...

“”1<<数据法“”?什么意思?移位?能详细说一说吗?
页: [1]
查看完整版本: 08A写EEPROM遇到奇怪问题.-----时间问题