Contact me: hankecnc@gmail.com

消除了阻止 rs232 中断的 eeprom 问题 #641

推推 grbl 3年前 (2023-01-22) 214次浏览

对话

消除了阻止 rs232 中断的 eeprom 问题 #641

修复了与eeprom相关的一些问题,
如果未启用则不会启用中断。
它消除了阻塞中断问题。

消除了阻止 rs232 中断的 eeprom 问题 #641 cri-s 提到了这个 pull request 2019 年 4 月 20 日
贡献者
香奈儿 发表评论

这段代码直接来自 Atmel 软件框架,所以如果不需要的话,我对改变它持怀疑态度。我也看不出你是如何解决这个问题的。您仍在为原子写入暂时关闭中断。

消除了阻止 rs232 中断的 eeprom 问题 #641
作者

atmel 软件上的这段代码有两个问题。

  1. 如果中断被禁用,在 eeprom 写入之后,中断被启用,如果在初始化期间需要将默认值写入 eeprom,这可能会在设置期间产生很多副作用,
    在这种情况下不是问题。

  2. Atmel 代码块中断不必要。
    如果代码需要等待之前的 eeprom 写入,在写入浮点值的情况下,
    它会在等待之前的 eeprom 写入时间结束之前阻止中断。
    如果我没记错的话,最坏的情况是 5ms 的中断阻塞时间。
    在这 5 毫秒的时间里,在 115200 bps 下,由于缺少 rx 中断,可能会丢失 58 个字符。具体要求的中断阻塞时间需要6-10个指令时钟不多,表示半微秒。

问题是这样的。这里是实际代码:


	cli(); // Ensure atomic operation for the write operation.
	
       // the folling code waits 3.3ms or 1.8ms for write if previous eeprom was written.
	do {} while( EECR & (1<<EEPE) ); // Wait for completion of previous write.
	#ifndef EEPROM_IGNORE_SELFPROG
	do {} while( SPMCSR & (1<<SELFPRGEN) ); // Wait for completion of SPM.
	#endif
	// this is the end of the problematic code.

	EEAR = addr; // Set EEPROM address register.
	EECR = (1<<EERE); // Start EEPROM read operation.
	old_value = EEDR; // Get old EEPROM value.
	diff_mask = old_value ^ new_value; // Get bit differences.
	
     // insert here cli() instead of above


将 cli() 向下移动到“diff_mask = ”行之后,它应该可以使用最小的更改来避免 rs232 字符丢失。

               // the reason for interrupt disabling is this, the write to EEMPE and the setting of EEPE need
              // to be made quickly after
			EECR = (1<<EEMPE) | // Set Master Write Enable bit...
			       (0<<EEPM1) | (0<<EEPM0); // ...and Erase+Write mode.
			EECR |= (1<<EEPE);  // Start Erase+Write operation.`

从数据表。

  1. 等到 EEPE 变为零。
  2. 等到 SPMCSR 中的 SPMEN 变为零。
  3. 将新的 EEPROM 地址写入 EEAR(可选)。
  4. 将新的 EEPROM 数据写入 EEDR(可选)。
  5. 向 EEMPE 位写入逻辑 1,同时向 EECR 中的 EEPE 写入零。
  6. 在设置 EEMPE 后的四个时钟周期内,向 EEPE 写入一个逻辑 1。

注意:(
第3步和第4步的顺序不是必须的)
关键点是Nr 6“Withing four clock cycles”这就是阻塞中断的原因,
中断阻塞只需要在第5步之前,在第5步之后就可以解除6.

消除了阻止 rs232 中断的 eeprom 问题 #641 cri-s 关闭了这个 2019 年 4 月 20 日
免费注册 在 GitHub 上加入此对话。已有帐户? 登录评论
标签
还没有
项目

还没有

发展

成功合并此拉取请求可能会关闭这些问题。

还没有

2名参加者
消除了阻止 rs232 中断的 eeprom 问题 #641消除了阻止 rs232 中断的 eeprom 问题 #641

喜欢 (0)