ba_wang_mao 发表于 2007-10-15 13:07:23

采用就绪中断写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则没出错过,为什么?
 

ba_wang_mao 发表于 2007-10-15 15:04:06

当我把定时中断0的程序代码减少后(缩短定时中断0的执行时间),结果采用EEPROM
就绪中断写EEPROM再没有出现过错误。百思不得其解。
 我的定时中断0执行间隔为20毫秒,定时中断0的中断服务程序最多执行10毫秒,怎么
会影响到EEPROM就绪中断写EEPROM呢?
页: [1]
查看完整版本: 采用就绪中断写EEPROM,会因为定时中断T0影响EEPROM,有什么办法解决?