关闭 JTrantow 打开了这个问题 2014 年 4 月 3 日 · 6条评论 关闭 MAX6675 HEAT_INTERVAL 未定义。#867 JTrantow 打开了这个问题 2014 年 4 月 3 日 · 6条评论 评论 特兰托 评论了 2014 年 4 月 3 日 选择 MAX6675 作为温度传感器时,代码将无法编译。 看起来有人将 HEAT_INTERVAL 更改为 MAX6675_HEAT_INTERVAL 但忘记在初始化程序中使用它。 read_max6675() 仍然插入了完全不必要的延迟。没有理由向中断中调用的函数添加不必要的延迟。 read_max6675() 不检查可用于检测设备是否存在的状态位。 我附上了解决这些问题的代码以及相关评论。 请用此改进替换现有功能。问题 2) 和 3) 很久以前就已涵盖,但从未将其写入代码。 如果已定义(HEATER_0_USES_MAX6675) 定义 MAX6675_HEAT_INTERVAL 250 //!< 读取 MAX6675 的时间 [毫秒]。 静态长 max6675_previous_millis = -MAX6675_HEAT_INTERVAL;// 初始化以便第一次调用将更新读数。 静态 int max6675_temp = (4*500); //!< 以摄氏度为单位的温度的四倍(每次计数 0.25 度) /*! 使用 SPI 总线读取 MAX6675 热电偶。 MAX6675 执行冷端补偿并将来自 K 型热电偶的信号数字化。 数据以 12 位分辨率、SPI™ 兼容的只读格式输出。 该转换器可将温度解析为 0.25°C,允许读数高达 +1024°C,并在 0°C 至 +700°C 的温度范围内表现出 8LSB 的热电偶精度。 这个函数由定时器 isr 每 8 毫秒调用一次。 相关的 MAX6675 时序: CSB 下降到 SCK 上升 tCSS CL = 10pF 100 ns 最小值。 CSB 下降到输出启用 tDV CL = 10pF 100 ns 最大值。 CSB 上升到输出禁用 tTR CL = 10pF 100 ns SCK 下降到输出数据有效 tDO CL = 10pF 100 ns / int read_max6675() { / 查看是否到了更新温度读数的时间。 / if (millis() – max6675_previous_millis < HEAT_INTERVAL) { return(max6675_temp); // 不要改变这个值。回来就好。 }else { / 是时候阅读了。 重置 previous_millis。 / max6675_previous_millis = millis(); } / 必须将 Power Reduction SPI 位 PRSPI 写入零才能启用 SPI 模块。 */ #ifdef PRR PRR &= ~(1<<PRSPI); #elif 定义 PRR0 PRR0 &= ~(1<<PRSPI); #万一 /* 初始化 / SPCR = (1<<MSTR) | (1<<SPE) | (1<<SPR0); / SPI 主机在拉低所需从机的从机选择 SS 引脚时启动通信周期。 / 写(MAX6675_SS,0);// 使能 TT_MAX6675 从机选择。 #if (0) / 我在运行 1Mhz SPI 的 16Mhz Mega 上测量了 SS 和 SCLK 之间 610usec 的延迟,没有任何延迟。 不需要延迟,在中断中添加不必要的延迟是不可原谅的。 / 延迟微秒(1);// 在时钟开始之前从选择后确保 100ns 延迟。 #endif / MAX 的第一位在从选择变低和时钟启动的 100 纳秒内可用。 所有位都将在 16*sclk+100nsec 内计时。 SPI 系统在接收方向采用双缓冲。 这意味着必须在下一个字符完全移入之前从 SPI 数据寄存器 (SPDR) 读取第一个字符。 否则,第一个字节将丢失。 */ // 读取 MSB。 SPDR = 0; // 启动 SPI 时钟发生器。 对于 (;(SPSR & (1<<SPIF)) == 0;); max6675_temp = SPDR<<8; // 读取 LSB,我们不需要读取 SPDR。 SPDR = 0; 对于 (;(SPSR & (1<<SPIF)) == 0;); max6675_temp |= SPDR; 写(MAX6675_SS,1);// 禁用 TT_MAX6675 从机选择。 /* MAX6675 在从机选择变高后的 100 纳秒内离开 SPI 总线。 */ /* 如果 MAX6675 未连接,它可以输入所有时钟(MISO 高)。 检查高位和设备存在位是否为零,表明 MAX6675 存在。 / if (0 == (max6675_temp & 0x8002)) { / 检查热电偶开路条件。 位 D2 通常为低电平,如果热电偶输入打开则变为高电平。 为了允许开路热电偶检测器运行,T-必须接地。 / if (max6675_temp & 4) { max6675_temp = 2000; // 热电偶打开 }else { / 底部三位是打开指示器、设备 ID、三个状态位。 将这些位移出返回值。 / max6675_temp >>=3; } }else { / 我们没有从 MAX6675 获得有效读数。 */ max6675_temp = 2000; // MAX6675 不存在。 } 返回(max6675_temp); } // read_max6675()。 万一 JTrantow已完成 关闭 2014 年 4 月 3 日 喜欢 (0) 无法访问此网站#138 BLTouch问题 #139 v1.3.8-EDGE 重启后键盘快捷键消失 #427 关闭 无法在 gsender 1.2.0 中打开 .gcode 文件 #367 RaspberryPi 运行 gsender 时出现问题 #89 向 fluidnc 发送 $$ 会导致 gsender 崩溃 #473 v1.3.8-EDGE 重启后键盘快捷键消失 #427 关闭无法在 gsender 1.2.0 中打开 .gcode 文件 #367RaspberryPi 运行 gsender 时出现问题 #89向 fluidnc 发送 $$ 会导致 gsender 崩溃 #473功能请求:抑制发送到机器的 gcode 中的 gcode 注释。 #444 关闭通过网络连接进行连接 #171操纵杆运动的剩余问题 #204 关闭新版本认为我的机器一直处于锁定状态 #474 关闭
选择 MAX6675 作为温度传感器时,代码将无法编译。
看起来有人将 HEAT_INTERVAL 更改为 MAX6675_HEAT_INTERVAL 但忘记在初始化程序中使用它。
read_max6675() 仍然插入了完全不必要的延迟。没有理由向中断中调用的函数添加不必要的延迟。
read_max6675() 不检查可用于检测设备是否存在的状态位。
我附上了解决这些问题的代码以及相关评论。
请用此改进替换现有功能。问题 2) 和 3) 很久以前就已涵盖,但从未将其写入代码。
如果已定义(HEATER_0_USES_MAX6675)
定义 MAX6675_HEAT_INTERVAL 250 //!< 读取 MAX6675 的时间 [毫秒]。
静态长 max6675_previous_millis = -MAX6675_HEAT_INTERVAL;// 初始化以便第一次调用将更新读数。
静态 int max6675_temp = (4*500); //!< 以摄氏度为单位的温度的四倍(每次计数 0.25 度)
/*!
使用 SPI 总线读取 MAX6675 热电偶。
MAX6675 执行冷端补偿并将来自 K 型热电偶的信号数字化。
数据以 12 位分辨率、SPI™ 兼容的只读格式输出。
该转换器可将温度解析为 0.25°C,允许读数高达 +1024°C,并在 0°C 至 +700°C 的温度范围内表现出 8LSB 的热电偶精度。
这个函数由定时器 isr 每 8 毫秒调用一次。
相关的 MAX6675 时序:
CSB 下降到 SCK 上升 tCSS CL = 10pF 100 ns 最小值。
CSB 下降到输出启用 tDV CL = 10pF 100 ns 最大值。
CSB 上升到输出禁用 tTR CL = 10pF 100 ns
SCK 下降到输出数据有效 tDO CL = 10pF 100 ns
/
int read_max6675()
{
/
查看是否到了更新温度读数的时间。
/
if (millis() – max6675_previous_millis < HEAT_INTERVAL)
{
return(max6675_temp); // 不要改变这个值。回来就好。
}else
{ /
是时候阅读了。
重置 previous_millis。
/
max6675_previous_millis = millis();
}
/
必须将 Power Reduction SPI 位 PRSPI 写入零才能启用 SPI 模块。
*/
#ifdef PRR
PRR &= ~(1<<PRSPI);
#elif 定义 PRR0
PRR0 &= ~(1<<PRSPI);
#万一
/*
初始化
/
SPCR = (1<<MSTR) | (1<<SPE) | (1<<SPR0);
/
SPI 主机在拉低所需从机的从机选择 SS 引脚时启动通信周期。
/
写(MAX6675_SS,0);// 使能 TT_MAX6675 从机选择。
#if (0)
/
我在运行 1Mhz SPI 的 16Mhz Mega 上测量了 SS 和 SCLK 之间 610usec 的延迟,没有任何延迟。
不需要延迟,在中断中添加不必要的延迟是不可原谅的。
/
延迟微秒(1);// 在时钟开始之前从选择后确保 100ns 延迟。
#endif
/
MAX 的第一位在从选择变低和时钟启动的 100 纳秒内可用。
所有位都将在 16*sclk+100nsec 内计时。
SPI 系统在接收方向采用双缓冲。
这意味着必须在下一个字符完全移入之前从 SPI 数据寄存器 (SPDR) 读取第一个字符。
否则,第一个字节将丢失。
*/
// 读取 MSB。
SPDR = 0; // 启动 SPI 时钟发生器。
对于 (;(SPSR & (1<<SPIF)) == 0;);
max6675_temp = SPDR<<8;
// 读取 LSB,我们不需要读取 SPDR。
SPDR = 0;
对于 (;(SPSR & (1<<SPIF)) == 0;);
max6675_temp |= SPDR;
写(MAX6675_SS,1);// 禁用 TT_MAX6675 从机选择。
/*
MAX6675 在从机选择变高后的 100 纳秒内离开 SPI 总线。
*/
/*
如果 MAX6675 未连接,它可以输入所有时钟(MISO 高)。
检查高位和设备存在位是否为零,表明 MAX6675 存在。
/
if (0 == (max6675_temp & 0x8002))
{ /
检查热电偶开路条件。
位 D2 通常为低电平,如果热电偶输入打开则变为高电平。
为了允许开路热电偶检测器运行,T-必须接地。
/
if (max6675_temp & 4)
{
max6675_temp = 2000; // 热电偶打开
}else
{ /
底部三位是打开指示器、设备 ID、三个状态位。
将这些位移出返回值。
/
max6675_temp >>=3;
}
}else
{ /
我们没有从 MAX6675 获得有效读数。
*/
max6675_temp = 2000; // MAX6675 不存在。
}
返回(max6675_temp);
} // read_max6675()。
万一