无法访问时钟非常慢的AVR ATTiny13A(128kHz / 128或128kHz / 256)(平均:错误:程序启用:目标不回答)



我正在尝试使用USBasp适配器(gulopg(和avrdude对AVR ATTiny13A进行编程。对于新的ATTiny13A设备,首次上传并运行程序运行良好,但再次上传失败。avrdude根本看不到/无法访问该设备。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的锁定

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

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

上电后,下拉电阻器将使AVR保持复位状态,不允许程序运行,防止设置慢时钟。为了运行新程序,您需要拆除下拉电阻器。

HVSP的替代解决方案

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

背景

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

该设备的时钟速度必须至少比此速度快四倍。对于500 Hz的通信速度,这意味着AVR必须在2000 Hz或更高的频率下运行。这意味着与avrdude兼容的128kHz时钟的最慢分频器设置为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.

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

最新更新