我正在按照本教程使用Arduino对ATtiny85进行编程,并使用它来播放一些音(通过压电扬声器)。我正在努力以正确的音调(我正在手动创建波形,因为ATtiny85不支持tone()函数)。
我认为问题可能归结于Arduino和ATtiny上不同的时钟速度。我知道可以在ATtiny上更改时钟速度,如何在arduino环境下完成此操作?
我正在按照本教程使用Arduino对ATtiny85进行编程,并使用它来播放一些音(通过压电扬声器)。我正在努力以正确的音调(我正在手动创建波形,因为ATtiny85不支持tone()函数)。
我认为问题可能归结于Arduino和ATtiny上不同的时钟速度。我知道可以在ATtiny上更改时钟速度,如何在arduino环境下完成此操作?
Answers:
我相信Arduino软件(库和所有软件)都假定您以16MHz运行。如果您将该假设应用于时钟,则您实际上是在运行...事情应该会解决。假设您正在内部振荡器上运行Tiny85,我认为它的运行频率为1MHz,因此只需将所有延迟声明(以及其他时间概念)乘以16。
如果您需要比内部振荡器更好的精度,则应该考虑使用外部晶体或谐振器,但是您需要更改AVR的保险丝设置才能正常工作,我认为您需要像AVRISP这样的编程器mkII使用AVR Studio做到这一点(我的建议)。
我对ArduinoISP的草图了解不多,但是对我来说,它看起来有点像ISP协议那样将程序上传到目标芯片(不是板上的Mega328),不确定它是否具备操纵保险丝的能力。有关ArduinoISP的信息,请参见http://arduino.cc/en/Tutorial/ArduinoISP。请注意,您当前不能使用UNO来运行ArduinoISP草图。在我看来,您不可以使用草图使Arduino成为使用AVR Studio GUI工具的可行界面。
编辑:看起来事情已经赶上了,UNO现在可用于ArduinoISP-感谢所有评论
delay(20)
insted的的delay(40)
它的定义void heartbeat()
。)
我正在成功使用Arduino UNO + ArduinoISP。
-U
在avrdude
命令中添加标志,以设置三个或任意三个ATtiny保险丝。
avrdude -p attiny85 -P com8 -c stk500v1 -b 19200 -U lfuse:w:0x6f:m -U flash:w:main.hex
时钟选择在第三个保险丝的位[3:0](“保险丝低字节”)中完成。如下设置它们,以使用外部晶体(8MHz或更快):
-U lfuse:w:0x6f:m
其定义(我推断)必须类似于:[Fuse Low Byte]:[write]:[hex value]:[手动设置]
该字节的四个高比特的默认值0110
,因此,保持6
在0x6f
原样,且仅改变第二数字,f
(它的默认值是2
)。
注意:如果您的进程花费的时间比预期长或短,请检查时钟预分频器和F _ CPU的定义。
-U lfuse:w:0x6f:m
选项对AtTiny85进行了修改。我需要使用高压设置将其重置。因此,对于尝试重置保险丝而又不知道自己在做什么的人们(如我自己)要当心。
尝试使用同一小组(麻省理工学院的高科技)的相关教程,名为“ 使用Arduino 1.0编程ATtiny”。
快速摘要:从Arduino IDE的“工具”->“板”菜单中,选择ATtiny85和您希望运行的频率(1或8 Mhz内部时钟,或20Mhz外部晶体),然后使用“工具”->“烧录引导程序”我相信选择所需的速度板会修改delay()和其他与时间相关的Arduino函数的工作方式,以便与时钟速度同步。
我自己使用一些ATtiny84芯片在这种方法上取得了成功。简单的闪烁程序是固定的,还有使用delayMicroseconds()手动控制发送到伺服器的脉冲所需的更灵敏的时序。
看来您使用的是ArduinoISP,请尝试使用AVR Studio或的命令行选项avrdude
。根据ArduinoISP的编写方式,其功能可能类似于Atmel AVRISP mkII或类似的东西。
ATtiny85的默认熔丝设置为:熔丝0x62,熔丝0xdf,熔丝0xff。它使用内部RC(8 MHz)振荡器“除以8”,因此时钟为1 MHz。
请参阅http://www.engbedded.com/fusecalc更多保险丝设置,。
即使使用ArduinoISP作为编程器,您仍然可以直接使用avrdude来更改ATtiny85的保险丝设置。
如果最终确实要手动更改保险丝以更改时钟,请确保编辑attiny85.build.f_cpu
[arduino_folder] \ hardware \ attiny45_85 \ boards.txt文件的行。
我认为您可以使用ArduinoISP设置保险丝,但不能使用Arduino IDE而是使用avrdude来设置保险丝,请检查此链接。从来没有自己测试过。
本教程明确指出您可以使用Arduino UNO,并且我已经对其进行了测试和工作,因此我可以确认这一点,因此ArduinoISP页面已过时,应忽略UNO警告。如果您的UNO是第一批中的一个,则您的引导加载程序可能有问题,您将需要重新刷新引导加载程序。检查此页面以获取更多信息(忽略序列号,我所有的UNO都不来自该系列,并且有问题)。
您从本教程下载的移植核心库被编写为使用1MHz内部振荡器(已通过boards.txt文件确认),因此,定时问题可能出在移植核心库或您的代码中。
亲切的问候
从“板管理器”中选择一个包含ATTiny85的ATTiny板。在“工具”菜单中。我认为现在它包括“ 16MHz内部PLL”。(您可以从http://drazzy.com/package_drazzy.com_index.json安装一个)
如果需要,请明确选择ATTiny85。
选择一个时钟。在不知不觉中,选择一个内部时钟。
单击“刻录引导程序”作为菜单项。
注意,如果选择非常低的值,则可能无法再对MCU进行编程。如果这是您的意图,请最后执行此操作,除非您有备用零件或高压编程器来复位保险丝。