雷竞技注册
项目

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

2017年8月3日,经过Charles R. Hampton.

该项目介绍了Atmega328P保险丝位,并显示了如何设置它们使用外部16 MHz晶体振荡器。

该项目介绍了Atmega328P保险丝位,并显示了如何设置它们使用外部16 MHz晶体振荡器。

文章概述

熔断器位,也称为熔断器或配置位,是微控制器中的设置,以控制在程序代码执行期间通常不会改变的某些操作。本文将解释ATmega328P中的这些操作,以及如何一般地设置它们。选择时钟源的熔断器位将被更深入地处理,包括如何和为什么一个16mhz的外部晶体振荡器。

Atmega328p编程电路

ATmega328P的一个简单编程电路如下图所示。一个原理图,一个完整的零件清单,和结构细节包含在前一篇文章。为了继续这个项目,您将需要如下所示的ATmega328P编程电路。

Atmega328p保险丝位

三个保险丝字节

ATmega328P总共有19个保险丝位,它们被分成三个不同的保险丝字节。其中三个保险丝位包含在“扩展保险丝字节”中,八个包含在“保险丝高字节”中,八个包含在“保险丝低字节”中。

表31-5 2016年11月版本ATmega328 / P数据表下面是转载。如您所见,整个扩展保险丝字节处理电力减弱检测水平。断电检测是许多微控制器的一个特点,当电源电压低于某一水平时,它们可以进行复位。在ATmega328P的情况下,可以选择三种不同电压(名义上1.8V, 2.7V,或4.3V)中的一种作为最小允许供电电压。

也许从表中注意到最重要的事情是编程融合位,包括将其设置为低,即0(零),这与您所期望的相反。例如,请注意,当它设置为逻辑高时,每个位都未编程,即1(一个)。这有一些不寻常的方法适用于ATMEga328P中的所有保险丝字节中的所有位。

数据表31-6重现如下。位2-0用于设置ATmega328P的启动大小;引导大小指的是为安装一个“引导加载程序”预留的内存数量,这个“引导加载程序”的功能类似于Arduino开发板中使用的引导加载程序。Fuse High Byte中其余位的用途可以通过表项清楚地显示出来。的要避免的两位除非您绝对确信您知道您正在做的是BIT7,rstdisbl(外部复位禁用)位和位5,液体(串行外围界面使能)位。禁用一个人通常是“Branked”AtmelμC的原因;“留下他们”是好的建议。

所有19个保险丝比特的目的和设置过程的细节包含在Atmega328 / P数据表中;将保险丝低字节设置为本文将包含在本文中。但是,编程所有保险丝比特的一般过程是相似的。

保险丝低字节选项

该Fuse Low Byte为ATmega328P选择时钟源,并控制时钟操作的一些细节。表31-7从数据表复制如下。

不要忘记编程融合位,包括将其设置为低电平,即0(零)。例如,请注意,位7用于启用/禁用将时钟除以8;为了使时钟速率的划分为8,将位7设置为0(低),并且禁用时钟速率的划分为8,位7将被设置为1(高)。

  • 第7位控制是否启用时钟速率除以8特性,第6位决定微控制器的PORTB0上是否有时钟输出。
  • 位5和位4控制微控制器的启动时间,其目的是防止芯片在电源电压有时间达到可接受的最低水平之前尝试启动。
  • 位3到0用于选择时钟源,表13-1显示了可用的时钟源选项。

Fuse低字节默认值

哇!不可否认,这是要考虑的大量数据,以便设置熔丝低字节的8位,但这一切都是必要的,没有“Wiggle的房间”。(在似乎过于关键的风险,这位作者认为数据表可以更清楚地写一点,以传达这种相当复杂的过程的细节。)

幸运的是,数据表中有很多信息都写得很清楚;当ATmega328P从工厂发货时,它被编程成的默认值是明确无误的。回头看看前面提到的表31-7。

  • 将时钟除以8通过设置为0的比特7使能。
  • 时钟输出to PORTB0被禁用,因为6位被设置为1。
  • 选择时钟源通过比特3,2,1和0设置为内部校准的RC振荡器和0设置为0010.(见前呈现的表13-1,表13-11显示下面。)

  • 启动时间部分取决于所选择的振荡器类型,并由5位和4位设置。在内部校准RC振荡器的情况下,该信息来自表13-12。位5和位4 (SUT1和SUT0保险丝)的编程为三种电源条件中的每一种指定。默认是缓慢上升的功率和结果在断电或省电后的启动时间为6个时钟周期,加上额外的14个时钟周期和重置后的65毫秒启动时间。见下面的表31- 12。

您现在应该理解了保险丝低字节被预先编程为01100010(在十六进制记数法中是0x62),以及这对微控制器的操作意味着什么。如果其中任何部分不清楚,不要感到惊讶;这是一个复杂的问题。您的时间可能会花在重读ATmega328P数据表第13和31节的适用部分上。

现在,做一些改变

如果您熟悉微控制器平台的Arduino系列,尤其是Arduino Uno,您可能会记住它使用Atmega328pμc。也许您还记得UNO具有由16MHz晶体和两个小陶瓷电容器组成的外部振荡器电路(通常为约22pf)。您还可能还记得UNO的运行速度为16MHz。

但是atmega328p怎么样?你能确定它吗?默认从工厂出货时的操作速度?

你知道ATmega328P默认时钟是一个内部RC振荡器,但你记得它的速度吗?答案见表31-7的注释2:8MHz。因为Fuse Low Byte的第7位的默认值是0,所以时钟速率除以8是启用的。因此,ATmega328P的默认运行速度是…等待它…1MHz。

但是假设您的项目要求ATmega328P的时钟速度为16MHz;你知道该怎么做吗?和往常一样,这涉及到硬件和软件。

硬件:添加晶体振荡器

为了在16MHz处运行Atmega328p,您需要将外部晶体振荡器添加到本文开始时显示的电路。只需要三个新部件:16MHz水晶(jameco#325139)和两个22pf陶瓷电容器(Jameco#81533)。由此产生的原理图立即在下面复制,面包板电路的照片只是在原理图下面。

软件:改变保险丝低字节设置

添加了16MHz晶体振荡器电路并双击接线后,下一个目的是确定低功耗晶体振荡器需要对熔丝比特的更改。扩展的保险丝字节和保险丝高字节不受振荡器变化的影响;只需要更改熔丝低字节。

警告!除非您实际安装了晶体,否则请勿将时钟源更改为外部晶体。如果你这样做,Atmega328P将没有时钟,因此没有办法重新编程。

考虑熔丝低字节比特比特。

  • 位7控制除8操作,默认设置0启用了该功能,这是您不想要的。因此,第7位需要从0改为1。
  • 位6控制要对PortB0的时钟输出,您不关心。因此,位6可以设置为1。
  • 比特3-0控制振荡器选择,0010的默认设置是使用校准的内部RC振荡器,您不需要。您希望低功耗晶体振荡器,并根据表13-1,位3-0应设置为1111,1110,1101,1100,1011,1010,1001或1000,但是哪一个?继续读下去。

如表13-3所示,对于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。因此,新的Fuse Low Byte应该是11111111,它在十六进制记数法中是0xFF。唷!你终于到了!

Avrdude.

Avrdude是一个命令行驱动的实用程序,本文将对其进行更深入的解释这篇文章。它是唯一需要在Atmega328p中的熔丝字节的更改所需的软件工具以及其他Atmel微控制器的长期列表。下面的屏幕SNIP来自AVRDUDE的实际会话,与AVR Pocket Programmer连接到Atmega328p,如本文早些时候的原理图和无焊接面包板组件所示。线路编号已添加到屏幕剪辑中,以便更容易参考编程会话的特定部分。

程序一启动,avrdude就生成了第1-3行。

第5行显示了将Active Directory更改为安装Avrdude的位置。在这种情况下,创建和使用的目录也被称为“avrdude”。您应该更改为在计算机上安装AVRDUDE的目录。

第7行是一个命令,可以告诉avrdude正在使用哪些程序员以及附加atmel微控制器。在这种情况下,AVR Pocket Programmer使用互联网驱动器,使用的微控制器是ATMEGA328P。

第9-17行是Avrdude的响应。第13行介绍了十六进制表示法中的Atmega328p签名:0x1e950f。Line 15在十六进制符号中也呈现在Atmega328P中的熔丝位编程;在这种情况下,每个出厂默认值编程保险丝字节。扩展的熔丝字节为0xFF,保险丝高字节为0xD9,熔丝低字节为0x62。

第20行是一个命令,它告诉avrdude正在使用什么程序员,附加了什么Atmel微控制器,并将Fuse Low Byte更改为0xFF。

第22-45行是来自avrdude的响应。每一行表示所完成的步骤,第43行表示ATmega328P中新的保险丝位编程。扩展保险丝字节是0xFF,保险丝高字节是0xD9,保险丝低字节是0xFF。

第48行是一个命令,它告诉avrdude正在使用什么程序员,附加了什么Atmel微控制器,并将Fuse Low Byte更改为0x62。(将Fuse Low Byte设置为0x62只有在您想要更改回原来的配置时才有必要,因为0x62是默认值。)

第50-73行是来自Avrdude的响应。每一行表示所完成的步骤,第43行表示ATmega328P中新的保险丝位编程。扩展的熔丝字节为0xFF,保险丝高字节为0xD9,熔丝低字节为0x62。现在,保险丝字节每次出厂默认编程一次。

“燃烧”保险丝低字节

一旦一切(硬件和软件)准备就绪,实际上重新编程了保险丝字节相当反对;它发生得很快,如果你不仔细观察,你可能会错过它。因此,提供了一些有价值的改变的证据。通过使用使用的相同的LED闪烁软件,这很容易做到这一点Atmel Studio 7中的ATmega328P & ATtiny45的面包板和编程。如果它仍然在你的ATmega328P程序中,你就领先了;如果没有,请使用下面的按钮下载并安装它。

new_blink.zip.zip.

New Blink.c闪烁黄色LED为1/2秒,关闭½秒,每分钟60次。检查以确保在您的面包板装配中仍在这样做。

正如你(希望)回忆,ATmega328P使用其校准的内部振荡器,不依赖于你刚刚添加的16MHz晶体振荡器。此时,由于fuse低字节设置,晶体被忽略了。(请记住,保险丝低字节仍然设置为它的工厂默认值0x62,这指定使用内部振荡器。)幸运的是,晶体及其两个22pF电容的存在并没有阻止内部振荡器的使用。对16MHz晶体振荡器进行更改,执行以下两个步骤。

  • 首先,启动AVRDUDE,然后按照上面屏幕剪辑第4-17行中描述的过程进行操作。结果应确认熔丝低字节仍设置为0x62,这指定使用校准的内部振荡器。
  • 其次,遵循第20-45行中描述的过程。结果应确认熔断器低字节现在更改为0xFF,这指定了晶体振荡器的使用。

看黄色LED;您是否注意到闪光率已更改?这就是为什么。

不仅熔丝低字节值0x62呼叫用于使用内部8MHz振荡器,它还指定已启用8个功能。因此,振荡器的有效率为1MHz,这是在下面所示的新闪光链接代码的第3行中反映的事实。(这是重要的要了解第3行不能控制Atmega328p运行的速度,而是表示,它告诉编译器微控制器是应该运行在1MHz,以便代码以正确的速度执行。)

由于您已将熔丝低字节从0x62更改为0xff,因此您已将振荡器更改为16MHz水晶。此外,您已禁用除以8功能。这两个变化的净效果是Atmega328p时钟现在正在以16MHz运行,但新的Blink.c中的第3行仍然告诉编译器微控制器在1MHz处运行。因此,闪光灯速率比应该快16倍。该怎么办?

当然,开始Atmel Studio 7,并改变第3行。而不是#define.f_cpu.1000000UL,制作第3行读取#definef_cpu.16000000UL,它告诉编译器时钟现在以16MHz运行。然后,重新构建项目,并将修改后的代码下载到AT328P。几乎立刻,LED会恢复1 / 2秒的亮灯和1 / 2秒的灭灯,每分钟60次,这就是你想要的。

一个更简单的方法吗?

“没有更容易的方式?”你可能会问,答案是“是的”。有一些在线应用程序将确定熔丝字节设置,以反映所选的功能,最受欢迎的一个是engbedded之一AVR保险丝计算器。然而,网站有一种消失的方法,知道如何自己做到这一点,这总是很好;这样你就可以了解“如何”和“为什么”除了“什么”之外。

接下来是什么?

本系列的下一篇文章将更多详细讨论Atmel Studio 7的操作,并将呈现更便宜的方式来拥有真正的Atmel Ice程序员。它即将推出AllaboutCircuits.com.

自己试试这个项目吧!BOM。

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

    Arduino网站有一篇文章......

    https://www.arduino.cc/en/tutorial/arduinotobreadboard

    …这似乎意味着你不需要通过所有这些来让你的ATmega328P正确运行,独立,在16MHz与外部水晶/帽。还是我遗漏了什么?

    喜欢。 回复
    • Charles R. Hampton. 2018年3月15日
      您所引用的Arduino网站上的文章将引导加载程序的安装介绍到Atmega328P上,这有效地将其转换为Arduino,该arduino由引导加载程序启用以使用外部水晶。我的文章不涉及安装Arduino Bootloader,因此需要使用外部水晶所需的步骤。谢谢你的问题。
      喜欢。 回复
  • Charles R. Hampton. 2018年3月15日

    您所引用的Arduino网站上的文章将引导加载程序的安装介绍到Atmega328P上,这有效地将其转换为Arduino,该arduino由引导加载程序启用以使用外部水晶。我的文章不涉及安装Arduino Bootloader,因此需要使用外部水晶所需的步骤。谢谢你的问题。

    喜欢。 回复