所有关于电路
项目

了解ATmega328P熔丝位和如何使用它们与外部晶体振荡器

2017年8月3日,通过查尔斯·r·汉普顿

本项目介绍ATmega328P熔丝位,显示了如何设置使用一个外部16兆赫晶体振荡器。

本项目介绍ATmega328P熔丝位,显示了如何设置使用一个外部16兆赫晶体振荡器。

文章概述

熔丝位,也称为保险丝或配置位,设置在微控制器来控制某些操作期间通常不改变程序的执行代码。这篇文章将解释ATmega328P这些操作是什么,以及如何设置它们。熔丝位选择时钟源将在更多的深度处理,包括如何以及为什么16兆赫外部晶体振荡器。

ATmega328P编程电路

一个简单的编程电路ATmega328P以下照片所示。原理图,一个完整的零件清单,和建筑细节包含在一篇文章。你需要ATmega328P编程电路如下所示,为了继续这个项目。

ATmega328P熔丝位

三个保险丝字节

总共有19个熔丝位用于ATmega328P,他们被分成三个不同的保险丝字节。三个熔丝位中包含“扩展字节融合”,八都包含在“融合高字节,”和八都包含在“融合低字节”。

从2016年11月版的表31-5ATmega328 / P数据表下面是转载。如您所见,整个扩展字节处理灯火融合检测水平。灯火检测是许多微控制器的功能,让他们重新设置当电源电压低于一定水平。之一的ATmega328P三种不同电压(名义上1.8 v, 2.7 v,或4.3 v)可能选为最低允许电源电压。

也许最重要的是注意到从表中,编程熔丝位由设置低,即。0(零),你可能预期的相反。例如,没有注意到每一位编程时设置为逻辑高,即。1(一)。这有点不寻常的方法适用于所有ATmega328P比特在所有保险丝字节。

下面表31-6数据表的复制。位2 - 0用于设置引导ATmega328P大小;引导大小指的是数量的内存用于安装引导加载程序”相似的函数中使用的引导装载程序Arduino开发板。剩余资产的保险丝的目的明确合理的高位字节表条目。的两位要避免除非你绝对肯定你知道你在做什么是bit7,的RSTDISBL(外部重置禁用)一点一点和5的SPIEN(串行外围接口启用)。禁用任何一个通常的原因“给”AtmelµCs;“别管他们”是好的建议。

目的的细节和设置程序的所有19熔丝位ATmega328 / P中包含数据表;设置熔断器低字节将被包含在本文中。然而,编程所有熔丝位的一般过程是相似的。

保险丝低字节选项

这个保险丝低字节ATmega328P选择时钟源,并控制时钟操作的一些细节。从数据表如下复制表的主场。

别忘了,编程熔丝位由设置低,即。,0(零)。例如,注意到一些7用于启用/禁用时钟除以8;使分裂时钟频率的8位7设置为0(低),时钟频率的和禁用部门8日7位设置为1(高)。

  • 7位控制时钟频率是否启用divide-by-8特性,和一些6决定是否存在PORTB0单片机的时钟输出。
  • 位5和4控制单片机的启动时间,这是为了防止芯片从尝试开始在电源电压有时间达到一个可接受的最低水平。
  • 位3通过0用于选择时钟源,和表的佳绩礼物时钟源选择可用。

保险丝低字节违约

哇!不可否认,这是一个很多数据需要考虑为了设置熔断器的8位低字节,但这都是必要的,没有“余地”。(At the risk of seeming overly critical, this author thinks that the datasheet could be written a bit more clearly to convey the details of this rather convoluted process.)

幸运的是,有很多的信息是非常明确的数据表;默认值设定到ATmega328P从工厂出货的时候是不会弄错的。回顾表的主场,之前提出。

  • 时钟除以8启用由7位被设置为0。
  • 时钟输出禁用PORTB0一点6被设置为1。
  • 选择时钟源设置为内部校准RC振荡器位3、2、1,0被设置为0010。(见表之前的佳绩,和下面的表骁将显示)。

  • 启动时间部分依赖于振荡器类型选择和设定的位5和4。内部校准RC振荡器,该信息来自13-12表。的编程部分5和4 (SUT1 SUT0保险丝)指定为每个三个动力条件。默认是慢慢崛起,结果6个时钟周期的启动时间后省电省电,加上另外14个时钟周期和65毫秒复位后启动时间。见表31 - 12所示。

现在,您应该了解,融合低字节是预先编程,以01100010(十六进制形式的,是0 x62),这意味着微控制器的操作。如果有任何不清楚的一部分,不要感到惊讶;这是一个复杂的话题。花你的时间可能是重读的适用部分章节13和31 ATmega328P数据表。

现在,进行一些更改

如果您熟悉单片机的Arduino家族平台,特别是Arduino UNO,您可能还记得,它使用一个ATmega328PµC。也许你还记得,UNO外部振荡器电路组成的16兆赫水晶和两个小陶瓷电容器(通常约22 pf)。您可能还记得,操作速度UNO是16兆赫。

但ATmega328P呢?你能确定它默认的操作速度从工厂发货的时候吗?

你知道ATmega328P默认时钟是一个内部RC振荡器,但是你记得它的速度吗?答案是在表的主场:注2 8 mhz。因为默认值的7位融合低字节为0,时钟频率的部门8启用。因此,默认操作的速度ATmega328P是……等待……1 MHz。

但是假设您的项目要求为16 ATmega328P mhz时钟速度;你会知道如何完成?像往常一样,有硬件和软件。

硬件:添加一个晶体振荡器

为了运行一个ATmega328P 16兆赫,您需要添加一个外部晶体振荡器电路显示本文的开头。只需要三个部分:一个16兆赫晶体(Jameco # 325139)和两个22 pf陶瓷电容器(Jameco # 81533)。结果下面立即复制原理图,电路试验板的照片下面的示意图。

软件:改变融合低字节设置

一旦你已经添加了16兆赫晶体振荡器电路和双重检查你的线路,下一个目标是确定需要哪些改变熔丝位低功率晶体振荡器。扩展字节融合和融合高字节的振荡变化不受影响;只有融合低字节需要改变。

警告!不改变外部晶体时钟源,除非你有水晶安装。如果你这样做,就没有ATmega328P时钟,因此没有办法重新编程。

考虑到逐位进行融合低字节。

  • 7控制divide-by-8操作和默认设置(0)启用了这个功能,你不想要。所以,有些需要更改7从0到1。
  • 6控制时钟输出PORTB0,你不在乎。6点可以设置为1。
  • 位3 - 0控制振荡器的选择,和0010年的默认设置是使用校准内部RC振荡器,你不想要。你想低功率晶体振荡器,根据表的佳绩,比特3 - 0应该设置为1111,1110,1101,1100,1011,1010,1001,或1000,但哪一个?继续读下去。

表13 -表明操作从8.0到16.0 MHz,比特3 - 1 (CKSEL[3:1])应设置为111。但是CKSEL[0]吗?继续读下去。

位5和4控制启动时间,默认设置为10 6个时钟周期的启动延迟从省电,省电,加上一个额外的启动延迟14从重置时钟周期+ 65毫秒。从常规表,在低功率晶体振荡器的安全起见,你想要16000个时钟周期的最大延迟可能从省电,省电,所以SUT[1]应该设置为1,再加上一个额外的启动延迟14从重置时钟周期+ 65毫秒,所以SUT[0]应该设置为1。此外,CKSEL[0]应该设置为1。

因此,7 = 1,6位是1,5位是1,4位是1,3 - 0 1111。因此,新的融合低字节应该11111111,在十六进制符号,是0 xff。唷!你终于到达那里!

Avrdude

Avrdude是命令行驱动的实用程序,更深入地解释这篇文章。这是唯一所需要的软件工具程序更改保险丝ATmega328P字节,一长串的其他Atmel微控制器。下面的屏幕剪是一个实际的会话的avrdude使用AVR口袋程序员连接到一个ATmega328P示意图所示,无焊料的试验板组装在本文前面。行号已经添加到屏幕上剪断,让它更容易参考特定部分的编程会话。

行1 - 3被avrdude一旦生成程序就开始了。

第5行显示了活动目录改为avrdude安装的位置。在这种情况下,目录中创建和使用也被称为“avrdude。”You should change to the directory where you installed avrdude on your computer.

第7行是一个命令告诉avrdude程序员使用Atmel单片机是附呈。在这种情况下,AVR口袋程序员使用USBTiny司机,和所使用的单片机是一个ATmega328P。

行上行线avrdude的反应。13号线提出了ATmega328P十六进制形式的签名:0 x1e950f。第15行介绍了熔丝位编程ATmega328P目前也在十六进制符号;在这种情况下,保险丝字节编程/出厂默认值。扩展字节0 xff融合,融合高字节0 xd9,融合低字节0 x62。

第20行是一个命令告诉avrdude程序员使用Atmel单片机连接和改变低字节0 xff融合。

行22-45 avrdude的反应。每一行介绍了一步完成,线43 ATmega328P提出了新的熔丝位编程。扩展字节0 xff融合,融合高字节0 xd9,融合低字节0 xff。

48是一个命令行告诉avrdude程序员使用Atmel单片机连接和改变融合低字节为0 x62。(设置熔断器低字节为0 x62是必要的只有如果你想更改回原来的配置,因为0 x62是默认值)。

50 - 73行从avrdude响应。每一行介绍了一步完成,线43 ATmega328P提出了新的熔丝位编程。扩展字节0 xff融合,融合高字节0 xd9,融合低字节0 x62。现在,再次融合字节编程/出厂默认值。

“燃烧”导火索低字节

一旦准备好了一切(硬件和软件),实际上重组融合字节而不是虎头蛇尾;它发生得如此之快,如果你不看仔细,那么你将要错过它。所以,提供一些证据的变化,都是值得的。它很容易做,通过使用相同的软件用于LED闪烁模拟板试验和编程ATmega328P & ATtiny45 Atmel工作室7。如果它仍然是ATmega328P编程,你领先;如果没有,使用下面的按钮下载并安装它。

New_Blink.zip

新的眨眼。c闪烁的黄色领导对½½第二,第二,每分钟60次。检查,以确保它仍然是这样做在你的试验板组装。

(希望)回忆,ATmega328P使用校准内部振荡器和不依赖16兆赫晶体振荡器就补充道。在这一点上,水晶被忽略,因为保险丝低字节设置。(记住,融合低字节仍将其出厂默认值0 x62,它指定内部振荡器的使用)。幸运的是,水晶的存在和它的两个22 pf电容器并不能阻止内部振荡器的使用。使改变16兆赫晶体振荡器,执行以下两个步骤。

  • 首先,avrdude开始,然后描述的过程线4-17屏幕的上面剪断。结果应当确认保险丝低字节仍然设置为0 x62,它指定使用校准内部振荡器。
  • 其次,遵循线20-45描述的过程。结果现在应该确认保险丝低字节改为0 xff,它指定使用晶体振荡器。

看黄色的领导;你注意到flash率改变了吗?这是为什么。

不仅融合低字节值0 x62呼吁使用内部8 mhz振荡器,它还指定了启用除以8特性。因此,有效率的振荡器是1 mhz,事实上这是反映在第3行新眨眼。下面的c代码描述。(这是重要的明白,第3行不控制ATmega328P运行的速度,而是它告诉编译器,单片机应该运行在1 mhz为了代码执行速度正确的。)

因为你已经改变了保险丝低字节从0 0 xff x62,你已经改变了晶体振荡器被用于16兆赫。此外,你有残疾除以8特性。这两个变化的净效应是ATmega328P 16 mhz时钟正在运行,但在新眨眼第3行。c仍然是告诉编译器,单片机运行在1兆赫。因此,闪光率是16倍。要做什么吗?

爱特梅尔公司工作室7开始,改变第3行,当然可以。而不是#定义F_CPU1000000 ul,第3行读#定义F_CPU16000000 ul,告诉编译器,现在运行在16兆赫。然后,重建项目,AT328P下载修改后的代码。几乎立刻,LED将恢复闪烁½第二,½第二,每分钟60倍,这正是你想要的。

一个更简单的方法吗?

“没有一种更简单的方法吗?”你也许会问,答案是“是的。”的re are some on-line applications that will determine the fuse byte settings to reflect the features chosen, and one of the most popular is EngBedded'sAVR保险丝计算器。然而,网站有消失的一种方式,它总是好的,知道怎么做自己;这样你能理解“如何”和“为什么”除了“什么”。

接下来是什么?

本系列的下一篇文章将讨论Atmel工作室7在一些更详细的操作,并将提供一个更昂贵的方法有一个真正的爱特梅尔公司冰程序员。这里即将到来AllAboutCircuits.com

自己尝试这个项目!BOM。

4评论
  • R
    ROTiree 2018年3月15日

    Arduino的网站上有一篇文章…

    https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard

    …这似乎意味着你不需要经历这一切为了得到您的ATmega328P运行正确,独立的、与外部晶体/ 16兆赫帽。还是我错过了什么吗?

    喜欢的。 回复
    • 查尔斯·r·汉普顿 2018年3月15日
      Arduino网站上的这篇文章你参考描述安装引导装载程序上有效地把它变成一个Arduino的ATmega328P,启用的引导装载程序使用一个外部的晶体。我的文章不涉及Arduino安装引导装载程序,因此我描述的步骤需要为了使用一个外部的晶体。谢谢你的问题。
      喜欢的。 回复
  • 查尔斯·r·汉普顿 2018年3月15日

    Arduino网站上的这篇文章你参考描述安装引导装载程序上有效地把它变成一个Arduino的ATmega328P,启用的引导装载程序使用一个外部的晶体。我的文章不涉及Arduino安装引导装载程序,因此我描述的步骤需要为了使用一个外部的晶体。谢谢你的问题。

    喜欢的。 回复