采用就绪中断写EEPROM,会因为定时中断T0影响EEPROM,有什么办法解决?
我的系统中有五个中断1、定时器0中断(每隔20ms执行一次)----> 中断服务程序(执行中断程序)
2、定时器2中断(每隔2ms执行一次) ----> 每隔2ms刷新一次数码管(为了节省元器件,采用CPU直接控制数码管)
3、串口接收中断
4、串口发送中断
5、EEPROM就绪中断
由于我采用MODBUS协议,MODBUS协议中有预置单个寄存器命令和预置多个寄存器命令,
因此可能每次写一个字(WORD)或者写多个字(WORD)到EEPROM,所以我设计了一个堆栈,用来保存待写数据的地址和数值。
struct ELEMENT
{
unsigned char bVal;//待写数值
unsigned int Addr;//EEPROM地址
};
//堆栈用来存储待写数据
struct EEPROM_STACK
{
struct ELEMENT element;
unsigned char stack_SP;
};
以下是我的EEPROM程序,采用中断方式写EEPROM。
#pragma interrupt_handler vIvEeReady:iv_EE_READY
void vIvEeReady(void)
{
struct ELEMENT element;
CLI();//关总中断
if (!STACK_EMPTY())//堆栈是否为空
{
STACK_POP(&element);//从堆栈中弹出地址和数值
EEAR = element.Addr;
EEDR = element.bVal;
EECR |= BIT(EEMWE);
EECR |= BIT(EEWE);
}
else //已经写完
{
EECR &= ~BIT(EERIE); //关闭EEPROM就绪中断
}
SEI();//开放总中断
}
////在主程序中触发EEPROM就绪中断
void EEPROM_START(void)
{
if (!STACK_EMPTY())//如果堆栈不空
{
CLI();
EEAR = 0;
EECR |= BIT(EERIE); // Sure the EEPIE is enable even if do the thing before
SEI();
}
}
void main()
{
//系统初始化
while (1)
{
if (有写EEPROM标志)
{
EEPROM_START();//触发EEPROM就绪中断
//清除写EEPROM标志
}
}
}
问题是:
当中断服务程序T0中的代码稍微长一点(绝对未超过10ms,T0的中断间隔时间为20ms)时,写EEPROM时老是出错?
而当为减少T0中断服务程序的代码后,则写EEPROM则没出错过,为什么?
当我把定时中断0的程序代码减少后(缩短定时中断0的执行时间),结果采用EEPROM
就绪中断写EEPROM再没有出现过错误。百思不得其解。
我的定时中断0执行间隔为20毫秒,定时中断0的中断服务程序最多执行10毫秒,怎么
会影响到EEPROM就绪中断写EEPROM呢?
页:
[1]