Failing to access AVR ATTiny13A with very slow clock (128kHz/128 or 128kHz/256) (avrdude: error: program enable: target doesn't answer)

Failing to access AVR ATTiny13A with very slow clock (128kHz/128 or 128kHz/256) (avrdude: error: program enable: target doesn't answer)

我正在尝试使用 USBasp 适配器 (guloprog) 和 avrdude 对 AVR ATTiny13A 进行编程。上传程序和 运行 它第一次对新的 ATTiny13A 设备工作正常,但再次重新上传失败。 avrdude 根本无法 see/access 设备。 avrdude 的行为就像设备未连接一样。

>avrdude -c usbasp -p t13 -B120 -U lfuse:r:-:b 

avrdude: set SCK frequency to 8000 Hz
avrdude: error: program enable: target doesn't answer. 1 
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.

avrdude done.  Thank you.

如果我将通信速度降低到avrdude支持的最低速度

>avrdude -c usbasp -p t13 -B2000 -U lfuse:r:-:b 

我得到 set SCK frequency to 500 Hz 与上面相同的结果。

用示波器查看编程信号,所有信号看起来都不错,除了 MISO,它只显示 0V 和 0.2V 之间的基本通信。

我已将CKSEL 熔丝设置为11,选择内部128kHz 时钟源。在程序中,我将 CLKPR 设置为 8,将 128kHz 时钟除以 256,以获得可能的最慢时钟。 (我也将 CKDIV8 设置为 1,但这应该无关紧要。)

我把 IC 熔断了吗?我没有 HVSP 来清除保险丝。我还能做什么?

如何使用非常慢的时钟分频器设置解开 AVR

该问题是由于在程序中使用非常慢的时钟分频器设置(/128 或/256 与 128kHz 时钟)写入 CLKPR 引起的。程序启动后,编程不再起作用(不管avrdude的-B设置)。

没有 HVSP 的解决方案(带有 pull-down 电阻):在 RESET 和 GND 之间放置一个 pull-down 电阻(10k 对我有用)。现在您可以再次访问 AVR 并编写不同的程序,将时钟分频器设置为最多 /64。

pull-down 电阻器将在 power-up 之后将 AVR 保持在复位状态,不允许程序 运行,防止设置慢时钟。为了 运行 新程序,您需要移除 pull-down 电阻器。

HVSP 的替代解决方案

如果您有 HVSP,您可以再次将 CKSEL 重置为 10 以使用 9.6 MHz 内部时钟(并可能再次将 CKDIV8 设置为 0)。这将允许您再次访问该设备。

背景

avrdude 将最慢的通信速度限制为至少 500 Hz。这是在源代码中硬编码的,请参阅 https://github.com/avrdudes/avrdude/blob/5cbc9c37fc71c424e99bdcc00bb910fd581c2676/src/usbasp.c#L903

设备的时钟频率必须至少比该速度快四倍。对于 500 Hz 的通信速度,这意味着 AVR 必须 运行 2000 Hz 或更高。这意味着与 avrdude 兼容的 128kHz 时钟的最慢 clock-divider 设置是 128kHz/64 = 2000Hz(这已经处于边缘并且可能会失败,但它对我来说效果很好)。要获得最慢的 avrdude 通信速度 (500 Hz),请使用 -B 2000 选项,例如:

avrdude -c usbasp -p t13 -B2000 -U lfuse:r:-:b

有效:

avrdude: set SCK frequency to 500 Hz
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.15s

avrdude: Device signature = 0x1e9007 (probably t13)
avrdude: reading lfuse memory:

Reading | ################################################## | 100% 0.05s

avrdude: writing output file "<stdout>"
0b1101011

avrdude: safemode: Fuses OK (E:FF, H:FF, L:6B)

avrdude done.  Thank you.

上传程序会很慢,但是对于只有几条指令长的程序是可行的。