我们现在有一个 Github 讨论部分。当一个问题肯定是核心缺陷时,如果你创建了一个问题,那么你会减少修复它所需的时间,因为我优先考虑问题而不是赶上讨论。
这纠正了 2.6.x 中存在的许多错误
2.6.x 显着改进了串行闪存占用空间,同时添加了功能,线路可以将从设备从睡眠状态唤醒而不会损坏数据,等等,请参阅变更日志。
只能使用从 arduino.cc 下载的 Arduino IDE 版本,切勿使用从 Linux 包管理器下载的版本。包管理器通常有 Arduino IDE,但对其进行了修改。尽管他们总体上对 Arduino 或嵌入式开发一无所知,更不用说他们成功修改它所需的知识了。这些版本因这些不明智的修改引起的微妙但严重的问题而臭名昭著。不应期望该核心在此类版本上工作,并且不会为了修复来自包管理器的 IDE 版本而进行任何修改。
这是 Arduino 客户端中的一个错误。
1.8.13 和 2.x 之间的 IDE 版本出现了重大的新缺陷。然而,IDE 版本 1.8.2 及更早版本具有未修复的严重缺陷。我相信他们终于推出了 IDE 的工作版本,并且我相信最新版本能够正确安装我的核心。
在 megaTinyCore 2.6.0 之前,当您在 arduino 文件夹中手动安装 core 时,手动安装 megaTinyCore 会导致 IDE V1.8.14 由于此错误而崩溃。 1.8.14及更高版本的用户必须使用megaTinyCore 2.6.0版本。
我在速卖通上买了很多电子产品。对于中国公司制造的产品来说,这是一个很好的市场,而且大部分都是通用的,包括大量西方国家的个人无法以任何其他方式获得的组件(例如,最小订单是卷轴或类似的东西 - 如果你甚至可以找到一个)与无名中国芯片制造商合作的组件供应商)。对于西方主要制造商的最新半导体产品线来说,这并不是一个好地方,特别是在上述芯片历史性短缺的情况下。现代 AVR 设备在通过这些渠道可用时,经常被报告为假冒或有缺陷(例如 ATtiny412 认为自己是 416,可能无法正确执行开机复位)。就这一点而言,您可能不想在速卖通上购买任何 AVR 微控制器……如果您避免使用第三方 LGT8 芯片并留意使用 ATmega168p 的主板,那么组装板(如 Arduino Nano 克隆版)通常可以工作。而不是 '328p - 但有很多关于假微控制器作为裸芯片出售时的报道(我听说过假 ATtiny85,实际上被标记为假冒 ATtiny85) ATtiny13s;不仅仅是现代 AVR 被伪造)。关于这些假芯片的来源有很多有趣的理论,而 Microchip 在这个问题上完全保持沉默。
本文档最好在线查看(而不是在您喜欢的文本编辑器中打开 Markdown 文件),以便可以单击链接并显示内联图像,并且可能最重要的是,有时可以使表格正确呈现。同样,这个[文档可以在 github 上找到](https://github.com/SpenceKonde/megaTinyCore)(https://github.com/SpenceKonde/megaTinyCore)
旧版本无法在工具 -> 程序员菜单中正确处理程序员,这会随着安装的内核数量的增加而迅速降低用户体验。他们不合适。从 1.8.14 开始的最新版本(包括 1.8.17、1.8.18 和 1.8.19)可能会生成“恐慌:未找到主要版本”错误,因为它们无法正确解析 platform.txt。从 2.6.0 开始,我们在发布之前直接手动修改 platform.txt,所以这不是一个问题
当通过板管理器安装megaTinyCore时,会自动安装所需版本的工具链。所有 0/1/2 系列部件均受支持,无需额外步骤。在 2.2.7 之前,我们使用 Arduino7 版本的 avr-gcc(gcc 7.3.0 和 avrlibc 3.6.1)以及截至 2020 年 6 月的最新 ATpack。从 2.2.7 开始,我们开始使用我的 Azduino 版本的工具链,其中已更新所有新支持部件的 ATpack。 2.2.7 使用 Azduino3,2.3.0+ 使用 Azduino4,从 2.6.0 开始,我们使用 Azduino5(尽管它对我们没有任何好处,除了节省四分之一 GB 的 HDD 空间和 40mb 的下载带宽(如果同时安装) megaTinyCore 和 DxCore 通过董事会经理。
手动安装更加复杂 - 特别是如果您想要支持 2 系列;有关详细信息,请参阅安装指南。
适用于 tinyAVR 0 系列、1 系列和现在的 2 系列的 Arduino 核心。与“经典”tinyAVR 部件(由 ATTinyCore 支持)相比,这些部件具有改进的架构,具有改进的外设和改进的某些指令的执行时间(这些部件在两个方面与高级 AVR Dx 系列相似,以及megaAVR 0 系列芯片(如官方 Nano Every 和 Uno Wifi Rev. 2 上使用的 ATmega4809 - 尽管 Arduino 团队已尽最大努力限制它们)以低成本、小型化ATtiny 系列的典型封装。所有这些部件都具有至少一个硬件 UART、一个 SPI 和 TWI 接口(没有像 ATtiny85 那样的 USI 垃圾)、一个强大的事件系统、可配置的自定义逻辑、至少一个片上模拟比较器,一个令人惊讶的精确内部振荡器,对于 1 系列来说,是一个实际的 DAC 输出通道,对于 2 系列来说,是一个奇特的差分 ADC。
此外,tinyAVR 0/1/2 系列部件价格便宜- 最高端部件 3226 和 3227,具有 32k 闪存和 3k SRAM(相对于 Uno/Nano/ProMini 中使用的 ATmega328p 的 2k SRAM)运行数量略高于 1 美元 - 少于许多 8k 经典 AVR ATtiny 部件(“AVR 指令集,PIC 价格”)。所有这些部件的额定运行频率为 16 MHz 或 20 MHz(4.5-5.5v),无需外部晶体,并且内部振荡器对于 UART 通信来说足够准确。
这些使用 UPDI 编程,而不是像经典 ATtiny 部件那样的传统 ISP。请参阅下文了解更多信息。获得 UPDI 编程器很简单 - 您可以使用基于 328p 的经典 Arduino 作为使用 jtag2updi 的编程器 - 或者为了使用更便宜的硬件获得更好的结果,您可以使用任何 USB 串行适配器和电阻器(最好是二极管),使用随附的 SerialUPDI工具,或者您可以将 AVRdude 与 Microchip 编程器之一(其开发板上基于 mEDBG/nEDBG/EDBG 的编程器、Atmel-ICE 或 SNAP)或任何UPDI 编程工具模拟其中之一(据我所知,它们都支持 - 如果 avrdude 支持其中一个,而我的核心不支持,请打开一个问题让我知道!)。
这些部件支持串行引导加载程序 Optiboot_x(基于与经典 Arduino Uno 引导加载程序相同的代码库,但经过了很大改动)(0/1 系列支持目前已上线,2 系列预计在 5 月第一周提供) ;对新部件的调整是微不足道的),允许它们通过传统的串行端口进行编程。有关此内容以及相关选项的更多信息,请参阅下面的 Optiboot 部分。安装引导加载程序确实需要 UPDI 编程器。我在 Tindie 上销售的组装分线板可以预先引导加载(它们是根据需要引导加载的)。话虽这么说, 0/1 系列部件以及 14 引脚 2 系列部件的 Optiboot 用户体验有点令人失望,因为它们缺少可与通常的自动重置电路一起使用的硬件重置引脚当串行端口打开时自动重置到引导加载程序。您需要完全禁用 UPDI 编程(如果在初始引导加载后需要更改保险丝设置或引导加载程序,则需要 HV 编程器)或保持 UPDI 启用,但在通电后 8 秒内开始任何上传。 20 引脚和 24 引脚 2 系列部件支持“备用重置引脚”,使它们的工作方式更像传统的 Arduino。
UPDI 编程接口是用于编程(和调试 -通用编程和调试接口)的单线接口,用于 tinyAVR 0/1/2 系列以及所有其他现代 AVR 微控制器。虽然人们总是可以从 Microchip 购买专用的 UPDI 编程器,但当您使用 Arduino IDE 而不是 Microchip 的(极其复杂的)IDE 时,不建议这样做。关于 Microchip 官方程序员在 Linux 上出现问题的广泛报道。有两种非常低成本的替代方法来创建 UPDI 编程器,Arduino 社区在这两种方法上比官方编程器拥有更多的经验。
在 megaTinyCore 出现之前,有一个名为 pyupdi 的工具 - 一个简单的 Python 程序,用于使用通过添加单个电阻修改的串行适配器上传到配备 UPDI 的微控制器。但 pyupdi 无法在 Arduino IDE 中轻松使用,因此这不是一个选择。从 2.2.0 开始,megaTinyCore 引入了可移植的 Python 实现,这打开了许多大门;最初我们计划改编 pyupdi,但在其作者和几位 Microchip 员工的敦促下,我们将此功能基于 pymcuprog,这是一个“更强大”的工具,由 Microchip 开发和维护,其中包括相同的串行端口上传功能,仅没有性能优化。如果手动安装,您必须添加适合您的操作系统的 Python 包才能使用此上传方法(系统 Python 安装是不够的,也不是必要的)。
有关接线的信息,请阅读SerialUPDI 文档。
从 2.3.2 开始,随着性能的显着改进,以及使用二极管代替电阻器的接线方案的可靠性得到验证,并且考虑到 jtag2updi 固件的不稳定,现在这是推荐的编程方法。从此版本开始,编程速度提高了 20 倍,现在远远超过了 jtag2updi 的速度(通过 jtag2updi 进行编程的速度大致与通过“SLOW”速度选项上的 SerialUPDI 进行编程相当,57600波特率;普通 230400 波特率版本的程序速度大约是 SLOW 版本或 jtag2updi 的三倍,而“TURBO”选项(运行于460800 波特率,上传速度比普通版本提高约 50%。TURBO 速度版本仅适用于运行电压为 4.5v 或更高的设备,因为我们必须更快地运行 UPDI 时钟才能跟上(这也是不期望的)。与所有串行适配器兼容 - 这是提高性能的有意权衡),但它允许在 4 秒内上传和验证 32kB 草图。
正在迭代三种设计:双端口串行适配器,其中两个端口都是串行端口,双端口串行适配器,其中一个端口始终为 UPDI,以及单端口一个,其中一个开关用于选择模式,以及一个可选的附加板LED 指示调制解调器控制线路的状态。
这些将允许使用 SMT JST-XH 连接器或杜邦连接器 - 无论哪种方式都有 6 个引脚用于串行(FTDI 引脚排列如所标记)和 3 个引脚(用于 UPDI)。
所有这三个都能够提供 3.3 或 Vusb(标称值 5V),或者断开 Vusb 和 3V3 的电源,并期望目标设备的供电电压为 5.5V > Vdd > 1.8V。在这种情况下使用的逻辑电平将是所施加的电压。请注意,在双串行设备上,VccIO 电源轨是共享的!它们必须运行在相同的电压下,属于同一设备,或者必须将适配器设置为为它们供电并断开电源。
根据适配器型号和操作系统的不同,需要不同的计时设置;然而,在 Linux/Mac 上,即使是 230400 波特率也需要进行设置才能避免失败,大多数适配器在 Windows 上会造成更大的时间损失,其中操作系统的串行处理速度足够慢,不需要任何延迟...
这里所说的“写延迟”是为了让页擦写命令执行完成;这需要非零时间。根据适配器、USB 延迟和隐式 2 或 3 字节缓冲区(它就像 USART,并且可能在内部实现为一个。到达的第三个字节无处可去,因为硬件缓冲区只有 2 字节深)可能是足以让它在没有明显延迟的情况下工作。或者,它可能会中途失败并报告“Error with st”。适配器的延迟超时越快,操作系统的串行处理越快,出现问题的可能性就越大。如果手动执行 prog.py,则由-wd
命令行参数控制。从 2.5.6 开始,此写入延迟更接近请求的实际时间(以毫秒为单位),以前它的粒度为几毫秒,而 1 就足够了,因此,它施加的惩罚是残酷的,特别是在视窗。
选型指南:
460800+ 波特率要求目标在 4.5V+ 下运行才能保持在规格范围内(实际上,它可能不需要那么高 - 但它必须是足够高的电压才能稳定在 16 MHz。我们设置对于高于 230400 波特的所有速度,将接口时钟设置为最大 - 而一些适配器有时在没有此步骤的情况下以 460800 工作(这本身很奇怪 - 460800波特是 460800 波特,对吧?),大多数都没有,并且 SerialUPDI 没有办法确定适配器是什么。
基于 CH340 的适配器在大多数平台上都具有足够高的延迟,并且几乎总是以任何速度工作,而无需诉诸写入延迟。所有选项都可以在不使用写入延迟的情况下工作。
几乎所有适配器都可以在 Windows 上以 230.4k 速度运行,而不使用写入延迟。极少数不这样做,包括一些编程为串行适配器的本机 USB 微控制器(例如:SAMD11C)。
无论平台如何,除了基于 CH340 的适配器之外,几乎没有任何适配器都可以在 460.8k 或更高速度下工作而不会出现写入延迟。
在 Windows 上,许多适配器(甚至是真正应该支持它的适配器)将无法成功切换到 921600 波特。我不知道为什么。症状是在尝试开始时暂停几秒钟,然后以 115200 波特率上传。奇怪的是,迄今为止我唯一成功使用的是 CH340。
Windows 上具有写入延迟的 460800 波特率通常比没有写入延迟的 230400 波特慢。在 Linux/Mac 上情况并非如此,页面大小越小,写入延迟对性能的影响就越大。
如果其他选项不起作用或在 Vcc = < 2.7V 下编程时,应使用 57600 波特率。
在某些适配器上,460800 波特率可以在没有写入延迟的情况下工作,这些适配器在 TX 和 RX 之间的肖特基二极管上放置了 10k 电阻器,而没有该电阻则无法工作,除非启用了写入延迟。不,我也不明白这是怎么回事!
从上面可以看出,这些信息很大程度上是经验性的;目前尚不清楚如何预测这种行为。
FTDI 适配器(FT232、FT2232 和 FT4232 等),包括在 eBay/AliExpress 上以 2 美元左右的价格出售的假冒适配器,在 Windows 上默认有 16 毫秒的长得令人难以忍受的延迟。即使我们为了限制必须等待的延迟时间而设置的长度,这也会将 2.2 秒的上传时间延长到超过 15 秒。您必须更改此设置才能获得可接受的上传速度:
打开控制面板、设备管理器。
扩展端口(COM 和 LPT)
右键单击端口并选择属性
单击端口设置选项卡
单击“高级...”打开高级设置窗口。
在“BM Options”部分下,找到“Latency Timer”菜单,该菜单可能会设置为 16。将其更改为 1。
单击“确定”退出高级选项窗口,然后再次单击“确定”退出属性。您将看到设备管理器刷新硬件列表。
现在上传应该快得多了。
一个可以由经典的 AVR Uno/Nano/Pro Mini 制作;廉价的 Nano 克隆是通常的选择,因为价格足够便宜,可以将其连接起来然后就这样离开。我们不再提供此过程的详细文档; jtag2updi 已弃用。如果您仍在使用它,您应该从工具->程序员菜单中选择 jtag2updi。这是我们之前推荐的选项。由于持续存在 jtag2updi 错误,以及它对很大程度上未维护的“avrdude”工具的依赖(该工具会在使用它进行的所有 UPDI 上传中插入虚假错误消息),因此不再建议这样做。
显然 Arduino 没有打包最新 avrdude 的 32 位版本。我定义了一个新的工具定义,它是 arduino18(最新)的副本,只不过它在 32 位 Linux 上引入版本 17,因为这是该平台可用的最佳版本。 arduino17版本无法正确支持使用某些Microchip编程工具进行上传。
目前,这仅用于最后几个版本,并且应该修复 avrdude 不适用于此平台错误。
tinyAVR 2 系列
ATtiny3227,1627,827,427
ATtiny3226,1626,826,426
ATtiny3224,1624,824,424
tinyAVR 1 系列
ATtiny3217,1617,817,417
ATtiny3216,1616,816,416
ATtiny1614,814,414,214
ATtiny412,212
tinyAVR 0 系列
ATtiny1607,807
ATtiny1606,806,406
ATtiny1604,804,404,204
ATtiny402,202
任何名为“AVR##XX##”的东西,其中 X 是字母,# 是数字 - 您需要我的 DxCore 来满足这些需求
所有经典(2016 年之前)tinyAVR 部件 - 这些几乎都由我的其他核心 ATTinyCore 之一支持
ATtiny 25/45/85、24/44/84、261/461/861、48/88,两个小号和一个(奇怪的43和4313/2313),在2.0.0中,26号以及决赛-四(显示了现代 AVR 方向的实验暗示),ATtiny 441/841、1634 和 828 加上更奇怪的 26。
其他任何内容请参阅本文档,了解 AVR 部件系列以及它们使用的 arduino 核心的列表- 几乎所有东西都有一个提供支持的核心,通常由我自己或 MCUdude 提供支持。
请参阅此文档,涵盖所有现代 AVR
特征 | 0系列 | 1系列 | 1+系列 | 2系列 |
---|---|---|---|---|
闪光 | 2k-16k | 2k-8k | 16k/32k | 4k-32k |
针数 | 8-24 | 8-24 | 14-24日 | 14-24日 |
静态随机存储器 | 128b-1k | 128b-512b | 2k | 512b-3k |
TCD | 不 | 是的 | 是的 | 不 |
TCB | 1 | 1 | 2 | 2 |
模数转换器 | 1x10位 | 1x10 位 | 2x10 位 | 1x12 位 带PGA |
VREF引脚 | 不 | 不 | 是的 | 是的 |
交流电 | 1 | 1 | 3 | 1 |
事件 * | 3 陈 | 6 陈 | 6 陈 | 6 陈 |
覆铜板** | 2个查找表 | 2个查找表 | 2个查找表 | 4个查找表 |
*
除 2 系列 tinyAVR(以及所有非微型现代 AVR)外,事件通道分为两种类型 - 同步(针对系统时钟)和异步。并非所有生成器都可以使用同步通道,并且某些事件用户只能使用同步通道,并且通道列表不太一致且较多。这种疯狂的做法一有机会就被放弃了——甚至连 mega0 也取消了这种区别。
**
只有 2 系列和非小型部件可以根据 CCL 状态触发中断。
所有器件的大多数引脚上都提供模拟输入(PORTA 和 PORTB 0-1 和 4-5 上的所有引脚)。 1-series+ 上的第二个 ADC 也可以使用 PORTC 上的引脚作为输入(有关使用这些引脚的信息,请参阅模拟参考)。
这些是预算选项。尽管它们受到支持,但不建议使用。这些永远不会获得tinyAVR 1系列在16k时获得的“提升”,在任何配置中都没有第二个TCB,没有TCD,只有3个事件通道,其中没有一个可以承载RTC事件输出。这些器件与 1 系列一样具有 2 个 CCL LUT,并可在 14、20 和 24 引脚配置中配备高达 16k 的闪存(8 引脚器件仅为 4k)以及高达 1k SRAM。
这些具有 2k、4k 或 8k 闪存以及 128、256 或 512b 内存,就像 0 系列一样。他们没有第二个 ADC、三重 AC 配置或第二个 TCB,尽管他们有 TCD。
突然之间,在 16k 时,1 系列零件变得更加有趣。伴随更大的闪存的是一系列外围设备,似乎适合更大的芯片,无论是 16k 还是 32k,它们都具有 2k 的 SRAM。整个第二个 ADC 在 AVR 中是独一无二的。它似乎是许多功能的测试场,这些功能以精致的形式出现在 AVR Dx 系列上。定价似乎并未考虑到 16k 1 系列上极其优越的外设,
从上表中可以看出,2 系列几乎更像是一个侧级产品,而不是升级产品。他们有一个更好的 ADC,事件系统和 CCL 是“正常的”,并且他们有更多的 RAM,14 针部分可使用 32k 闪存(3214 显然是计划中的,但后来被取消了;它已经足够远了在被删除之前在 ATPACK 中存在一段时间)
如果现在还不清楚正确的选择,我已经写了一个简短的总结,说明您何时想使用哪个系列。
在其“megaavr”硬件包的官方 Arduino 板定义中,他们暗示 megaAVR 0 系列部件上的新架构(与tinyAVR 0 系列和 1 系列上使用的几乎相同)被称为“megaavr” “ - 这不是一个官方术语。 Microchip 使用术语“megaAVR”来指代任何“ATmega”部件,无论它具有旧式外设还是现代外设。没有官方术语来指代一个系列或另一个系列的所有 AVR 部件,一位 Microchip 员工甚至否认内部有这样一个术语。我不知道如何制造两套零件,每套零件之间有很多共同点,而与另一套零件却很少有共同点,没有人创造一个短语来指代它们中的任何一个。
在本文档中,在 2.0.2 之前,我们使用 Arduino 约定,尽管从那时起已经过去了一年多,我仍然不断寻找我称之为 megaAVR 的地方。如果您发现任何问题,请使用 github 问题报告此问题。请注意,术语avr
和megaavr
仍在内部使用(例如,在库中,标记给定库与哪些部分兼容,或者根据文件将运行的内容分隔文件的不同版本)。这将继续下去 - 我们必须坚持这一点,以便与 Arduino 团队从 Uno WiFi Rev. 2 和 Nano Every 的核心开始的兼容性。
无论如何,需要一些词来指代这两个群体,而 Microchip 没有提供任何词。在没有官方术语的情况下,我将 2016 年之前的 AVR 设备(带有 PORTx、DDRx 等引脚寄存器)称为“经典 AVR ”,将 Arduino 称为 megaavr 的设备称为“现代 AVR ”。还有一些部件的 I/O 模块在很大程度上更像经典的 AVR,但其指令集版本也明显较差,并且典型的闪存大小为 1k 或更小。它们使用 AVR 的 AVRrc(用于精简核心)变体,而大多数经典 AVR 使用 AVRe 或 AVRe+,而现代 AVR 使用 AVRxt。该核心不支持 AVRrc 部件,并且在不幸的情况下,我需要讨论这些非常令人失望的部件,我将它们称为“精简核心 AVR ”部件,因为这是它们的官方名称,尽管我有很多为他们提供更多丰富多彩的短语。建议任何设计都不要使用精简核心 AVR 。并不是说它们过时了,而是它们很糟糕。建议所有新设计使用“现代 AVR ”(具有新外设和AVRxt指令集的 AVR) - Ex 系列、Dx 系列、tinyAVR 0/1/2 或 mega0
新的tinyAVR 2系列的数据表 - 虽然数据表仅“涵盖”16k部件,但它们明确指出具有相同引脚数的部件之间在功能上没有差异(也就是说,不存在像16k/32k 1 系列),仅在具有不同引脚数的部件之间,并且仅由引脚数决定(即 24 引脚部件上的功能将在 14 引脚部件上使用,除非14针的没有它需要的引脚,而且是没有引脚就不能使用的东西)。 14、20、24针零件均列出4k、8k、16k、32k flash;这些闪存大小选项分别配备 512、1024、2048 和 3072 字节的 SRAM(即 4k 和 8k 部件具有双倍的 SRAM),4/8k 部件获得 128 字节 EEPROM,较大的部件获得 256 字节14 引脚器件采用 SOIC 和 TSSOP,20 引脚器件采用(宽)SOIC、SSOP 等。像 1616 一样的小 QFN(这次他们也给了我们该封装中的 32k 部件,但祝你好运,得到一个,它到处都缺货 - 我无法获得一个)和 24 引脚与 1616 相同的 VQFN 3217.
TWI、SPI、USART0、AC0 未更改,NVMCTRL 也未更改(引导加载程序所需的更改仅与支持第二个 USART 有关)。时钟选项不变。 TCB0 和 TCB1 已升级到 Dx 系列中的版本:时钟关闭事件选项、级联以及用于 OVF 和 CAPT 的单独 INTCTRL 位(很好的补充,但与内核本身无关),并且所有部件都具有 TCB。我们现在有 4 个 CCL LUT 和 2 个定序器,而不是 2 个和 1 个 - 并且它们可以像其他具有 CCL 的部件一样触发中断(与tinyAVR 0/1 系列不同)。最令人兴奋的功能之一是,正如预期的那样,它们有第二个 USART(您听到的噪音是 ATtiny841 和 ATtiny1634 在角落里哭泣)。 PORTMUX 寄存器现在的命名与其他现代 AVR 类似 - 但我们并没有失去对每个 TCA WO 通道引脚的单独控制。 EVSYS 现在的工作方式就像在非微型 AVR-0/1 系列部件上一样(这是一个值得欢迎的变化 - 0/1 系列是奇特的,并且他们的 EVSYS 的一些不同之处被吸收了)。 TCD0、AC1/2、DAC0 和 ADC1 的 1 系列功能已消失。取而代之的是,ADC0 更加精美,几乎无法辨认,这是自收购以来发布的第一个具有真正差分 ADC 的新 AVR。 (可怜的'841又发出一声痛苦的哀嚎,它也有一个令人难以置信的奇特ADC,具有出色的差分选项,但与新的ADC相比,它看起来完全过时了)……从我已经发表的不同主题的帖子数量来看看来,我有一种感觉,差分 ADC 并不是您大多数愿望清单中的首选 - 但它却位于主要芯片客户的首选清单中,所以这就是我们所得到的。我们很快就需要一款合适的差分 ADC,而不是 Dx 系列上的 ADC。它真的非常非常奇特。见下文。
megaTinyCore 提供了analogRead() 实现,以及使用过采样和PGA 的更强大的功能(请参阅下面的模拟功能部分)。
哦,还有一件事...UPDI 引脚配置有旧选项 - UPDI、I/O 或复位...以及一个新选项:PA0 上的 UPDI,PB4 上的硬件 RESET 引脚! Optiboot 最终将成为一个可行且舒适的选择,至少对于具有 PB4 的部件而言,即不是 14 针部件。这也恰好是(如果我的 Tindie 商店销售额有任何迹象的话)最受欢迎的一种。
你觉得会有3系列吗?我不知道。 DD 和 EA 显然正在追随他们,并在tinyAVR 领域占据战略地位。我认为这个品牌被淘汰只是时间问题,就像他们在 megaAVR 0 系列之后对 megaAVR 所做的那样。这不一定是坏事:所有 Dx 和 EA 系列部件在引脚映射和行为方面都非常相似,这非常好。尽管它们将引脚分配给更多的外围设备,但它们的系统性较差。指导原则似乎是“不遗漏任何外围”。与 Dx 和 EA 系列的引脚映射形成对比,其中一切都遵循固定的总体规划。零件要么有要么没有给定的引脚,如果没有,则不具有可用的功能。在这两个广泛的群体中,我认为都有一个产品经理,他的工作就是对那些想对神圣引脚分配制定“例外”的工程师进行鞭打(因为这些例外不可避免地会激增,这也是我们最终蒙上眼睛的飞镖板引脚分配的原因)在经典的tinyAVR上)
tinyAVR 上的引脚编号很奇怪,这是 Microchip 的错 - 他们对端口内的引脚进行了奇怪的编号:它按顺序开始,除了 PA0 是 UPDI 并且通常不可用,然后 PORTB 的引脚以相反的顺序编号,然后 PORTC 回到与 PORTA 相同的逆时针编号。 让我休息一下吧!因为传统上是使用引脚 0 作为第一个引脚,最后一个数字是如果不设置保险丝就无法使用的引脚,这会使芯片难以编程。我更希望能够从 A0 开始逆时针编号,而不破坏 Arduino 代码的不成文约定。有人可能会说我在引脚映射上做出了一个糟糕的决定——也许他们应该从 PA0(除非设置保险丝否则不可用,在这种情况下芯片很难编程)作为引脚 0 开始,然后按逆时针方向对引脚进行编号。但是,如果所有端口都按顺序排列,您仍然无法实现这种技巧,除非您将 PORTB 引脚向后编号。如果您能够摆脱所有引脚按顺序编号的期望(并且仅使用 PIN_Pxn 表示法),则可以实现显着的节省
我预测,在 2-4 年内,将会出现 AVR DA、DB、DD。 DU(USB 之一)、EA 和 D/E/F 系列器件的引脚数降至 8(或至少 14),以及具有 128k 闪存和新 ADC 的 64 引脚器件。没有其他任何品牌的 ATtiny。剩下的最大问题可能是他们是否会用总引脚数为 100 个(可能其中 80-88 个是 I/O)且闪存选项高达 256k 的现代 AVR 来取代 ATmega2560;这将带来三个问题 - 首先,过去 56 个 I/O 引脚不再剩下 VPORT 寄存器 - 低 I/O 空间已满,有 28 个 VPORT 和 4 个 GPIOR。他们将如何处理这 4 个额外的端口? (在 2560 上,它们只是访问速度较慢且没有单周期访问的二类端口。我对此有一些思考,以及附录 A 中可用操作码的可行性。第二,违反闪存中的 128k 屏障,您必须转到 17 位程序计数器。所有跳转都需要一个额外的周期,所有返回都需要一个额外的周期。最后,如果保留 AVR DB ram 比率,则此“D X部分”。现在,256K的闪光灯将有32k的RAM回想一下,Progmem在DX上的工作原理 - 他们不能一直到32。24KRAM肯定是可能的,甚至可能是28没有SFR的空间,在相同的地址空间中。
我在Tindie Shop以及Baare Boards上使用监管机构,Updi标头和串行标头出售突破板。从我的商店购买有助于支持核心的进一步发展,这是开始使用Arduino使用这些令人兴奋的新部分的好方法。目前可以使用Attiny1624板,但是直到新修订的PCB设计从董事会返回以启用Autoreset上的Alt-Reset PIN,才能将20和24针零件作为组装板出售。还有一个14针板修订 - 认为它在很大程度上是化妆品。黄色焊料面膜必须走,因为在最后几批批次中的可读性似乎变得更糟。新板还标准化了一排针之间的0.6“间距,而不是当前的0.7”间距,因此您将可以将加工的销钉标头放在它们上,并将其插入宽dip插座或将它们与针对该行间距进行优化的原型板一起使用。组装的0系列板正在停止,一旦售罄,就不会被补货。一旦有32k的零件,16k 2系列的零件也会发生同样的情况。
在2系和EA系列的ADC是现代AVR时代在AVR上发布的最好的ADC。除了这两个。最接近的比较是经典的AVR,它具有具有顶级功能的差异ADC(T841,Mega2560和(令人惊讶的是)T861是最强大的竞争对手)。虽然在经典的AVR时代某些部分吹嘘的是疯狂的100倍和200倍,但对我来说,放大的内容中的多少是噪音(考虑到我公认使用差异ADC的经验有限的经验,我要说的是“大概大部分,如果您让我设计硬件,我不知道模拟!”)。这个新的ADC当然具有很高的能力,具有真正的差异能力(与DA和DB系列不同),并且迄今为止其他任何现代AVR上可用的任何东西都抬高了头和肩膀。可编程增益放大器是一种新功能,人们能够摆脱模拟测量的壮举是什么样的;当然,这似乎很有希望。了解使用PGA以1倍增益,与不使用PGA的差异以及这样做的益处和缺点之间的差异将非常有趣。 (在一般情况下,Microchip将由一份文档进行良好的服务,该文件讨论了如何为任务选择正确的ADC配置;我已经对Microchip和我交谈的人提出了这种关注,并表示这是一个很高的优先级;而这是一个很高的优先级;而这种情况得到了极大的改善,看来DOC组被专门指示不要对任何类型的任何实际具体建议。
出于过度采样和拆卸的目的增加了1024个样本的积累是一个受欢迎的补充,尽管这也有可能低估了偏移误差的幅度和相关性。 (取1024个样本(所有均具有给定的偏移错误),然后删除总和以产生17位ADC测量,可以轻松地想象任何错误都将局限于最低的几个位。但是,如果错误是,在单个测量中说5 LSB,当您累积1024个样品并脱节时,您的偏移误差为160,很容易看到它,并认为它是信号而不是噪声。
带有新ADC的第一个完整尺寸(非小)芯片可在28-48 PIN包中提供,最多可容纳64K闪光灯。通常有人猜测是否会有什么变化从两个系列变为EA系列:似乎答案是,一个令人困惑的旋钮被删除了,并且自动签名砍伐以进行累积的测量(
D Type D计时器仅在默认的PWM PIN设置上的20/24 PIN 1-SERIES零件上用于PWM。在较小的零件上,它不会让我们增加PWM引脚的总数。仅WOC和WOD引脚(分别在PC0和PC1上)上没有TCA驱动的PWM。因此,由于AnalogWrite()不支持通过关闭拆分模式(例如16位PWM)或通过使用D Type D Timer(例如调整频率)来增强的任何功能,因此会更糟,因为它需要额外的空间来存储例程以从两种类型的计时器而不是一个类型的PWM打开和关闭PWM。这在较小的闪光零件上不可忽略。它的订单为600个字节。 150对于DigitalWrite(),对于AnalogWrite(),如果曾经在TCD PWM引脚上调用这些()。在这种情况下,优化器应该能够优化这些功能的部分,只要这些功能与这些功能使用的引脚不包括任何TCD PWM引脚。请注意,优化器将独立考虑它们,也就是说,DigitalWrite()将包含代码以关闭TCD PWM,如果它与PIN一起使用,该PIN使用TCD用于PWM,无论您是否曾在该引脚上调用AlaigWrite()。
与几乎所有其他AVR不同(我可以想到3个示例,其中只有一个是“奖金”不是“ unbonus”),基于家庭中零件的闪光灯,还有其他“奖励”功能。 16K和32K版本(仅)具有一些额外的功能(似乎也没有考虑到定价) - 它们都有2K RAM,无论是16K还是32K,它们都有3个模拟比较器(包括窗口模式选项),第二个 - 迫切需要的 - B型计时器 - 最奇怪的是,它们具有第二个ADC,仅在销售频道对应的销钉中有所不同!
与经典的AVR不同,在这些部分上,闪光灯映射到与其余内存的地址空间相同的地址空间。这意味着不需要直接从Flash读取pgm_read_*_near()
。因此,编译器会自动将所有声明const
的变量放入progmem中,并适当地访问它 - 您不再需要明确将其声明为Progmem。这包括引用的字符串文字,因此不再需要f()宏,尽管为了保持与某些第三方库的兼容性,但F()仍然声明其参数progmem。
但是,请注意,如果您明确声明可变的progmem,则必须像在经典AVR上一样使用pgm_read
函数来读取它。当变量在带有内存映射闪光灯的零件上声明变量时,指针被偏移(地址相对于闪存的开始,而不是地址空间的启动);使用pgm_read_*_near()
宏时,也会应用相同的偏移量。请注意,声明progmem并使用pgm_read_*_near
访问功能的内容虽然效果很好,但较慢,并且浪费了少量的闪存(与简单地声明变量const相比);对于2.1.0和更高版本的F()宏的F()宏也是如此(在2.1.0之前的一段时间内, F()
什么也没做 - 但这引起了第三方库的问题)。作者坚持认为,问题与核心有关,而不是库,我的选择是接受较低的效率,或拒绝我的用户访问流行的库)。使用F()
宏可能是与某些第三方库的兼容(迫使F()
向我们返回的具体情况并非如此)可能是必需的f() - AS-NOOP代码,因此它们少了几个字节)。
汽车版本也应起作用。您必须始终在这些零件上选择16个MHz衍生的时钟速度。它们不支持20 MHz操作,不应使用调谐的时钟选项。
现在,我们可以在这里谈论MegatinyCore如何暴露这一切。我们将从如何参考PIN以获取最佳结果的问题开始,然后转到核心功能,菜单选项,然后再以一系列链接到文档的链接,并提供有关各种子系统的详细信息。
如何指代Alagread()和DigitalRead()的PIN(尤其是在非标准硬件上)的简单问题一直是Arduino用户混淆的持续来源。我认为,大部分责任都取决于Arduino团队(以及在他们面前的布线作者)所做的关于针刺的决定的决定;将某些引脚称为“模拟别针”使人们认为这些销钉不能用于数字操作(它们可以更好地认为是“具有模拟输入的销钉”,例如有“可以输出PWM”的“销钉”)。传统上销售销钉的事实进一步使水混淆了。对于非标准的经典AVR零件,多年来,由多个作者创建的多个不兼容的“ PIN映射”通常使事情变得更糟以这种方式混乱,某些部分具有三个完全不同的引脚映射,在至少一种情况下,其中一种替代映射是一部受魔鬼启发的纯粹邪恶的作品,不需要额外的查找表即可将模拟销转换为数字引脚)。
该核心使用一个简单的方案来分配Arduino引脚编号:PIN从最接近VCC的I/O引脚开始编号为引脚0,然后逆时针继续执行,然后跳过(主要是)不可用的Updi Pin。然后将UPDI PIN分配给最后一个引脚号(如上所述,即使不是将其设置为GPIO,也可以读取Updi Pin(模拟和数字读取工作)。我们建议这样做是最后的度假胜地:Updi Pin在未设置为GPIO PIN时始终启用其引体式,并且看起来太像Updi启用序列的信号会导致不希望的操作。
为了防止所有有关引脚身份的混乱并消除歧义,我们建议使用PIN_PXN符号来指示引脚,除非您使用具有不同数字或名称的开发板上打印的引脚。这将使您的代码的可移植性最大化到其他类似的硬件,并使您在相关数据表中使用的引脚上查找信息,如果有必要的话。
这是指参考#defines
的推荐方法,其中PIN_Pxn
的形式为x, x
是a,b或c,而n
为a number 0-7-(不要与下面描述的PIN_AN定义相混淆)。这些只是解决了相关PIN的数字引脚编号 - 它们不会经历其他代码路径或其他任何内容。但是,它们在编写代码方面具有特殊的实用性,这些代码与大多数外围设备一样,与与某些引脚相关的外围设备(通过端口)链接的外围设备。文档中的几个演示代码利用了这一点。直接的端口操纵也是可能的 - 实际上,它可以使用几种强大的其他选项 - 请参阅直接端口操纵。
PIN_Pxn
不是Pxn
,而不是PIN_xn
这些意思是不同的东西!
当单个数字用于引用PIN时 - 在文档中或您的代码中 - 始终是“ Arduino Pin Number”。这些是橙色(适用于Analogread())和蓝色(针对未销钉的销钉的销钉)的引脚编号。参考引脚的所有其他方法均定义为相应的Arduino Pin编号。
核心还提供An
和PIN_An
常数(其中n
是0到11的数字)。与官方核心一样, PIN_An
定义为与模拟通道共享的PIN的数字引脚编号,这些n是指ADC0通道编号。这个命名系统类似于许多经典的AVR核心上使用的命名系统,但是在这里,它们只是#DEDINES作为相应的Arduino Pin编号。如果您需要在数字引脚上获取模拟通道编号,请使用digitalPinToAnalogInput(pin)
宏 - 但是,只有在编写高级ADC库时才需要它。
这些零件(嗯,至少是1/2系列 - 0系列是预算选项,除了它们未能缩小预算,而且它们只有几美分便宜)提供了一种出色的工具箱和强大的外围设备;高端与经典的Megaavr零件相当或更好 - 价格为Tinyavr。与我的其他核心一样,MegatinyCore设计的指导原则之一是允许受支持的部分发挥其全部潜力 - 或在Arduino的局限性内尽可能接近它。该部分(非常大)涵盖了这些部分的特征以及它们如何被MegatinyCore揭露,以及核心本身的特征。这个(非常大)的部分试图覆盖每个特征区域。如果您想使用一些芯片功能并遇到麻烦,请尝试找到正在使用的功能!
20 MHz内部(4.5V -5.5V-典型的5V系统)
16 MHz内部(4.5V -5.5V-典型的5V系统)
10 MHz内部(2.7V -5.5V-典型的3.3V系统)
8 MHz内部(2.7V -5.5V-典型的3.3V系统)
5 MHz内部(1.8V-5.5V)
4 MHz内部(1.8V-5.5V)
2个MHz内部(1.8V-5.5V,测试不佳)
1 MHz内部(1.8V-5.5V,测试不佳)
20 MHz外时钟(4.5V-5.5V,测试不佳)
16 MHz外时钟(4.5V-5.5V,测试率较差)
12 MHz外时钟(2.7V-5.5V,测试不佳)
10 MHz外时钟(2.7V-5.5V,测试不佳)
8 MHz外时钟(2.7V-5.5V,测试不佳)
6 MHz内部(经过调整,未经测试)
5 MHz内部(调谐,测试不佳)
4 MHz内部(经过调整,测试不佳)
2 MHz内部(调谐,测试不佳)
1 MHz内部(调谐,测试不佳))
7 MHz内部(对受虐狂,未经测试)进行调整)
8 MHz内部(经过调整,测试不佳)
10 MHz内部(经过调整,测试不佳)
12 MHz内部(调整,未经测试)
14 MHz内部(对受虐狂,未经测试)进行调整)
16 MHz内部(调谐)
20 MHz内部(调谐)
24 MHz内部(调谐,超频,测试效果不佳)
25 MHz内部(调谐,超频,测试效果不佳)
30 MHz内部(调谐,超频,测试率较差)-0/1系列需要“ 20MHz” OSCCFG保险丝设置;选择“ 16 MHz”的两个系列零件可能无法达到30。
32 MHz内部(调谐,超频,测试较差) - 仅2系,非常乐观的超频,可能是不稳定的。
24 MHz外时钟(超频,测试不佳)
25 MHz外时钟(超频,测试不佳)
30 MHz外时钟(超频,测试不佳)
32 MHz外时钟(超频,测试不佳)
我们对超频零件的电压或温度范围没有任何要求 - 我们声称的是,我们至少在室温下以这种速度工作的芯片中的至少有一个芯片,在5V时运行特定的草图。您的里程预计会有所不同,但通常使用F规格与N或U规格部分更好。
重要的 - 在选择任何调整选项之前,请阅读有关调整的信息!
有关这些时钟速度的更多信息可以在时钟参考中找到
显示的电压是制造商规格保证工作的电压(除非按下操作温度范围的边界,否则这些零件通常会做得更好(通常在32 MHz和5V @室温下,即使从内部振荡器则可以工作; 0 /1系列同样,如果电源为稳定的5.0-5.5V,则通常在32 MHz的情况下使用32 MHz。
当草图通过UPDI上传时,无需采取任何措施来设置OSCCFG
保险丝。当通过Optiboot上传时,将无法更改保险丝,因此在燃烧引导加载程序时选择的任何选择是所使用的,并且只有“燃烧启动加载程序”或通过UPDI上传素描才能改变。
除非选择“调谐”选项,否则所有内部振荡器时钟速度选项都使用出厂默认校准,在这种情况下,按照调整参考中的记录进行了调整校准。这可用于在20 MHz的Optiboot芯片上进行16 MHz操作,反之亦然。
有关制造商的速度等级的更多信息,请参见速度等级参考。请注意,这些是保证它可以正常工作的电压和时钟速度。这些零件旨在适合在应用程序中使用,在某种程度上出乎意料的故障可能会对人或财产构成危害(例如汽车,工业设备,飞机,核反应堆 - 如果零件发生故障,人们可能死亡)和我仅出于相反的原因,也相信军事应用具有相似的可靠性要求。典型的爱好用户将在稳定问题的潜力上更加放松,崩溃只不过是一个麻烦,而且延长温度范围零件的极端远远超出了我们所需要的。假设板上有防水涂层,则n等级零件应能够在一锅沸水中每个速度等级起作用。那只是n-spec。 F-Spec应该好至125!
已经确定,延长的温度零件越过超频,这是有道理的。预计将在125C下以20 MHz运行的部分在室温下以32 MHz运行的机会比仅在105C下以20 MHz运行的机会更高
从2.4.0版开始,我们现在提供“官方微芯片板”选项。除了将LED_BUILTIN
定义为具有LED在该板上而不是A7的PIN之外,并定义一个宏PIN_BUTTON_BUILTIN
定义为带有用户按钮的PIN并用非非载荷“上载”,这无需做任何特别的事情。 -Optiboot版本始终使用板载程序员/调试器;工具 - >程序员将仅用于“ Burn Boot Loader”和“使用程序员上传”。对于Attiny416 Xplained nano,它还选择了使用替代引脚的引导加载程序的版本,该销售端端端口 - 它不会自动使用usart0的备用销钉,就好像您完成了serial.swap(1)一样 - 支持串行引脚的默认交换的功能将在以后的更新中进行,以及PINSWAP机制基础机械的其他一些更改,这也有望减少闪光使用。
如上所述,这些可能无法在32位Linux平台上正确工作。这是我无法控制的;我不构建Avrdude二进制文件AMD,我也没有承担该任务。我已经有太多了。
blink()
在Xpl的Mini和Xplained Pro上会闪烁更多?两者都有相同的attiny817!它们如何与众不同?
出于同样的原因,如果将闪光更改为使用PIN_PC0
而不是Xplained mini上使用的PIN_PB4
:PC0,则需要更多的闪光灯,而Xplained Pro使用的PB4则不是。由于这是使用DigitalWrite()使用的唯一PIN,因此编译器可以免费优化该PIN上DigitalWrite()不需要的任何内容,包括在支持PWM的PIN上关闭PWM输出的功能。 。如果digitalwrite()也用于支持两个设备上的PWM(导致较高的闪光使用结果)或DigitalWrite()替换为DigitalWriteFast(),那么差异就会消失。 't将其称为销输出PWM)。
每当使用UPDI程序员上传代码时,所有可以“安全”设置的保险丝(如,如果没有砖头的风险,或者如果无法访问HV程序员,则可以将董事会进行砖块),并且具有任何内置配置选项将设置。因此,除了注意到,行为始终将与所选工具菜单匹配。总而言之,这些处理如下:
WDTCFG will not be changed - it is not configured by megaTinyCore except to reset it to the factory default when doing "burn bootloader".
BODCFG will not be changed - not safe, you could set the BOD level to 4.3 on a 3.3v system, and then it would need to get > 4.3v applied to reprogram it. If it is on the same circuit board as parts that would be damaged, this is a difficult situation to recover from.
OSCCFG will be set
TCD0CFG will not be changed - it is not configured by megaTinyCore except to reset it to the factory default when doing "burn bootloader".
SYSCFG0 will not be changed - not safe
SYSCFG1 will be set
APPEND will not be changed - it is not configured by megaTinyCore. There is insufficient demand to justify the development effort.to make use of this as DxCore does
BOOTEND will be set
LOCKBIT will not be changed - it is not configured by megaTinyCore; supporting the lockbits presents several additional complications, and commercial users with need of this facility are unlikely to be using the Arduino IDE to program production units.
BODCFG
并不安全,因为将其设置为高于板的电压,并使板将其“砖”“砖”板“砖”,直到提供更高的操作电压为止;如果将其焊接到与无法忍受这些电压的设备相同的PCB上,这可能会特别尴尬。
SYSCFG0
不安全,因为这是RSTPINCFG
所居住的地方;除了通过HV Updi编程外,更改此操作可能会使董事会无法编程,而且并不是每个人都有HV Updi程序员。将来,如果/当保证可以选择作为程序员选择的HV Updi功能的程序员(即,可以使用仅与HV程序员一起使用的工具 - >程序员选项)将在使用时自动设置此保险丝那个程序员。
结果,在2.2.0和更高版本中,您不再需要“燃烧启动加载器”才能在使用UPDI上传时在16 MHz衍生和20 MHz衍生的速度之间切换
该核心始终使用链接时间优化来减少闪光使用 - 支持TinyAVR 0/1/2系列零件的所有版本也支持LTO,因此无需像AttinyCore那样使其可选。这是在引入时的代码方面的巨大改进,通常以5-20%的订单!
这些部分都有大量的模拟输入 - DA和DB系列具有多达22个模拟输入,而DD系列的每个引脚都在不用于驱动HF晶体的每个引脚上输入模拟输入(尽管Portc上的PINS是仅当关闭MVIO时才支持)。可以像在正常的AVR上一样用analogRead()
读取它们,我们默认为10位分辨率。您可以使用analogReadResolution()
更改为完整的12位,并使用增强的分析函数自动进行过度采样,衰减的读数,以进行更高的分辨率并进行差异测量。 1.024、2.048、4.096和2.5V中有4个内部电压参考,加上对外部参考电压的支持(当然是VDD)。 ADC读数的速度比经典的AVR快3倍,如果您的测量值是低阻抗,或者将采样时间扩展到了一个因素,则可以将速度再次加倍,以读取非常高阻抗来源。这在模拟参考中详细介绍。
DX系列零件具有10位DAC,可以生成真实的模拟电压(请注意,这提供了低电流,并且只能用作电压参考或控制电压,不能是