关于AVR和世界纪录的问题

做得好,结果会很糟糕


发表该帖子的原因是最近的一篇(当我开始写这篇文章时,它确实是最近的,但是在Unfinished文件夹中发生了很长时间),有关在AVR的MK上实现软件UART的方面。 自己提出的问题并非没有兴趣,但是给出了这样奇怪的答案,他们认为做出必要的解释是他的责任。 该主题带有标记,那些想要阅读“国王,白菜和鞋子”(即标准要求,阅读(正确的)技术文档和AVR汇编语言编程中的记录的人)可以单击下面的按钮。

让我们更详细地概述问题-使用内部生成器工作时,是否可以在AVR类型MK(具体为Tiny13)上实现IRPS(接口的常用名称,以UART的名称)。 事实是,该发生器没有很好的频率保持精度指示符,这就是为什么出现此问题的原因。 我必须立即保留一点,无论我们考虑采用软件实现(如原始文章中所建议)还是使用MK硬件模块都没有关系。 一种方法的结果(就时间精度参数而言)几乎完全转换为另一种方法。

基本问题是内部发生器是否可以提供所需的操作精度,因为如果对此问题的回答为否,那么进一步的研究就变得毫无意义。 为了比较两个独立的量,我们需要了解它们两者,因此我们将首先确定所需的频率限制精度以及此部分中此特定MK提供的功能。 对前一句话的重要说明-这并不意味着“感性地给予我们”的特定情况,而是特定的MK类型,通过其技术说明来呈现。

首先,我们将找到更容易找到的东西(我想是这样)-接口时间参数的准确性要求。 我们将打开RS232的标准,并立即查看您需要的一切。 事实证明,“您不能随便拿走……”,因为该标准是付费的,并且网络上的所有副本都是非法的。 好吧,我们将GOST的国产版本带到了联合C2上,除了前部的持续时间和脉冲切割,我们根本没有找到任何时间参数。 起初,这可能会引起一些混乱,但后来了解到C2接头仅描述了IRPS的接口部分,而要求则在后者中。 从原则上讲,一切都是合乎逻辑的,尚不清楚为什么GOST中没有对此进行明确描述,但最终,您有时可以自己考虑一下,尽管它仍然“以某种方式无法获得”。

当然,了解传输协议后,有可能从一般考虑中找出发送器和接收器速度之间的最大允许不匹配(0.5 / 9.5 = 5.2%),但这将是对您所知道的球形马的调查,因为:

  1. 该标准的要求可以而且应该比最大允许不匹配的类似理论计算要严格;
  2. 知道最终的失配值绝不会给我们发射机和接收机的预算。

徘徊在互联网上导致了Atmel的AppNote(好吧,因为我们仍在使用该公司的MK),它直接表示在预算相等的情况下允许2%的不匹配,这导致要求将发送器频率保持在1%的精度。 我们将信任一家信誉良好的公司,并假设他们可以使用机密材料,并且此数字是正确的,尤其是因为它看起来合理。 我知道这种职位的脆弱性,但是老实说,我已经厌倦了寻找这样一个简单问题的确切答案,迫不及待地想着下一部分。

答案的下半部分位于MK内部,并由其技术文档确定。 首先,对内部发生器的设备进行一些介绍,尤其是因为已对其进行了或多或少的描述。 生成器使用RC链作为计时元素,并且由于形成精确电容器和精确电阻器的集成电容器的任务非常重要,因此MC实例之间的最终频率会发生很大变化。 为了使该参数更可预测,制造商添加了一个通过校准字节控制的硬件节点。 该单元使您可以在很宽的范围内改变发生器的频率,从而以更高的精度获得所需的值。

确切地了解如何在硬件中实现控制将是很有趣的,我看到了一种选择,要么通过DAC控制电容器的充电电压,要么控制比较器上的比较电压。 然而,尽管这两种选择都很容易实现,但它们都导致控制特性的明显非线性。 但是建立生成器的内部实现不是我们的任务,我们对它的外部参数很感兴趣。

因此,我们打开了文档(您可以在查看器中打开文件,但是我有制造商自己印刷的描述的印刷版本-是的,它曾经是)并查找适当的部分。 我们感兴趣的参数位于“校准内部RC振荡器”部分,然后根据需要单击链接。 在这里,我们(当然,对您不确定,我不确定)正等待着第一次的失望-我使用Atmel产品已经有很长时间了(大约15年),并且一直认为他们拥有有关MK的良好文档。 根据精神科医生的说法,“没有健康的人,没有未开发的人”,对相关章节的仔细研究证实了这一事实,因为我以前在文档中没有注意到这种失败。 为了辩护,我只能说:

  1. 我从未在MK数据中使用内部生成器,因此我没有特别仔细地研究它。
  2. 当我开始使用这些MK(十多年前)时,我还很年轻(很好,肯定比现在年轻),而且很愚蠢,并且没有完全理解对好的(可理解的,全面的和明确的)文档的需求;
  3. 我已经准备好宽恕我自己了,只是因为我宽恕了自己,我的所有缺点也不是致命的(最后一个论点特别令人信服,不是吗)。

因此,在将头撒满烟灰后,我将开始对文件提出要求,并且制造商没有任何借口。 我们打开上面的部分并开始仔细研究它,如有必要,请转至必要的页面(您仍然单击链接)。 我们将一起寻找表征发电机时间特性的以下参数:标称精度,电源电压的影响,温度的影响和老化参数-这是评估任何发电机的精度参数所需的最小设置。

Marleson芭蕾舞的第一部分是标称精度。

立即我们找到所需的参数-发电机调谐精度表,在该表中,我们看到两行“出厂校准”,具有指定值±10%,“手动校准”,具有相同参数±2%。

关于这些数据,立即出现了许多问题-它们是什么意思,以及如何测量此参数。 对于第一行,该表指示(环境或MK本身的温度-尚不清楚,但这对我来说是个奇思妙想)以及电源电压,此外,注释还指出(我认为这是不必要的),该测量是在空间的特定点进行的外部条件。 可以猜测,在这种情况下,我们应该使用制造商记录的校准系数,尽管最好在注释中明确指出。 一切或多或少都清晰无误,并且几乎可以被明确地解释(尽管在研究技术文档的背景下,应该说一切都是模糊的,并允许各种解释,但这是不可接受的,但是如果这样做,进一步讨论的话题就不复存在了(接下来是什么)写,尚不清楚,因此,显示放纵)。

但是,在第二行的情况下,情况更糟-给出了温度和电源电压变化的极限,并且有人认为,通过使用某种魔术校准程序,您可以在整个范围内获得比工厂明显更好的结果。 我的问题马上出现-如果可以在任何地方(在温度和电源的任何位置)实现这一目标,并且制造商知道如何做到这一点,那么为什么她没有在工厂校准中在特定条件下自己做到这一点? 我们转到校准字节的描述,看到它有128个值,并且覆盖了标称值的50%至200%的范围,这对应于每单位校准值的频率变化的150/128〜1.17%,这应该比在1% 但是,然后我们应该考虑到,调节特性显然不是线性的,并且在较大的校准值区域内,我们有60%/ 32〜2%的步长(数据来自图表,我已经反复表达了对代表技术参数的类似方法的态度,但是我重复一遍-这是不可接受的该方法虽然总比没有好,但其准确度仅为1%,如果考虑到调整特征的单调性(是的,这就是文档所说的,它未在图形中绘制,但在文本中明确指出。)我坚决拒绝理解到 对,最重要的原因,该公司希望使调整的法律,但它管理),这是在指导方针明确指出,这是需要考虑的2%的精度是相当可以实现的。 我不是很喜欢我必须查看图表,但这不是必需的,并且表格数据就足够了。 在这一部分中,文档应被认为是完全可理解和一致的,正确性的标准超出了我们的能力范围。

Marlezon芭蕾舞的第二部分。 -外部条件的影响。

然后开始“垃圾,油烟和鸡奸”。 我们邀请您而不是值表来查看图片(由于某种原因,它们被称为文档中的典型值图),并且,您知道,“信息的图形表示的主要优点是它的可视性,而没有其他优点。” 如果在“典型特征”部分中未提供此图,则甚至可以使用此类信息并从图中删除边界值(“尽管这对团队而言是冒犯性的)”。 我不知道有谁会亲自说服我,我深信至少要以图表的形式甚至在表格中表示典型的含义(或者说在一部电影中他们说的是“典型的外观”)。 它们无法在设计中进行指导,因为这些参数不清楚含义,并且与典型值的任何偏差都是可以接受的,与最小值和最大值相反,后者的过渡表示设备发生故障。

好了,我们已经通过了,我们将尝试至少提取一些信息,然后观察一下,当温度从-40变为+ 80°时,发电机的频率将变化±4%。 与电源电压类似的图片-仅是典型图形,因此产生的误差在3.3±5.5范围内为-6 + 2%。 根本没有给出关于发电机老化的数据,这通常是合乎逻辑的,因为在已经给出的参数的背景下,5年内百分之一的精度(硅的特征值)不会困扰任何人。

现在,我们拥有所有数据,可以回答我们的第一个问题-在工厂校准期间,针对特定的应用条件进行校准时,发生器不满足接口对精度的要求-满足边界要求,但不满足标准。 还应考虑到,如果可以在设备的制造过程中对电源电压和特定的MK进行校准,并希望它们不随时间变化,则只能在运行中考虑温度,并且需要具有适当精度的外部时间标准。 由于设备的开发应遵循``我们相信上帝,其他所有东西都需要证明''的准则,并且我们还没有证明满足要求的可能性,因此正确的答案是,用内部发电机无法保证能够满足此MC中标准要求的IRPS的实施。 请注意,我们在分析文档时得出了上述结论,并以强调在MK的特定实例上一切都会并且如果恒星成功升起就会出现的方式来制定它。 也就是说,我们的结论与前面提到的帖子相矛盾,这怎么可能发生,因为一切对一个人都有效-让我们找出答案。

现在,将开始对以上职位进行批评。 首先,让我们考虑如何确保检查设备是否符合特定接口的要求。 我可以建议以下方法:

  1. 一种好方法是测量设备接口的关键参数并将其与标准要求进行比较-这可以使用通用仪器(在我们的情况下是示波器和位间隔的长度或完整的传输)来完成,或者使用经过认证可以测试此接口的专用设备来完成。
  2. 一般方式-组织与实现接口的响应部分并被证明符合标准要求的另一设备的交互。 当然,这样的检查是完全不够的,而是可以更多地用于确认被测设备的故障,但至少可以做些什么。
  3. 不好的方法是独立实现接口的响应部分(在同一设备或在另一设备中)并与之交互。 由于两种设备显然都未经验证,因此这种检查的用处非常非常令人怀疑。 这种方法的一个很好的例子是串行信道上的“回声”,除了设备已损坏并能够传输某些东西之外,它并不能证明任何事情,而且传输速度几乎没有。
  4. 糟糕的方法是将完全不符合标准要求(或与标准要求相抵触)且无法像上一段那样工作的设备作为测试仪。

正在考虑的帖子中使用的是后一种方法-实现了串行通道软件接收器,与标准要求相反,该接收器会更改其频率以适应输入信号(特别是起始位的长度),从而可以在时间参数方面稳定地接收质量较差的信号。 这并不是说永远不要这样做,而且,在模拟调制解调器中,采用了以类似方式实现的输入速度的调谐,但是它是通过改变分频器来精确地切换频率的,这显然不是我们的情况。 在此版本中,一切都可以完美获得,并且信息可以在任何外部条件下稳定地传输。 因此,如果我们讨论使用远程生成IRPS的接口在由内部生成器运行的两个MC之间传输信息的可能性,那么答案是肯定的。 如果我们在谈论与符合标准要求的外部设备进行交互,仅此而已,那么我们将期待许多不愉快的惊喜。

上面的一般结论:

  1. 设计设备时,您应该专注于文档(RTFM),
  2. 您需要研究文档并正确解释所读内容(RTFMF),
  3. 请记住,在我们这个时代,文档可能是误解,不准确(甚至是错误),因此
  4. 检查收到的信息的一致性和可信性,以及
  5. 使用实验获得的信息仅用于确认从文档分析中得出的结论,而
  6. 仔细选择用于测试设备的实验方法以获得可靠的结果。

好吧,总之,正如所承诺的,一个小汇编器。 我允许自己以正常形式重写作者给出的代码片段,因为内置在GCC中的汇编器不过是程序员的嘲笑,我可以说。 不,当然,我知道编译器的开发人员是有充分理由指导的,但结果令人痛苦地类似于“很好,它可以工作”。

.equ delay=15 TX_Byte: cli ; ld r18,Z+ ; cp r18,r1 ; breq Exit_Transmit ; dec r1 cbi port, TX_line Delay_TX: ldi r16,delay Do_Delay_TX: nop dec r16 brne Do_Delay_TX TX_Bit: sbrc r18,0 sbi port,TX_line sbrs r18,0 cbi port,TX_line lsr r18 lsr r17 brcs Delay_TX sbi port, TX_line ldi r16,delay Stop_Bit_TX: nop dec r16 brne Stop_Bit_TX Sei 

程序中的错误立即引起您的注意-在第3行(注释掉)中,寄存器1的值应为零,但该赋值未明确写入函数中。 单字节传输周期完成后,该值由第12行保证,但第一遍则不能保证。 因此,必须添加初始化,这将需要增加代码大小。

第二个缺点是第4-7行中的电平的实际形成,因为作者采用的发出下一位的方法将导致在各种转换(0-1和1-0)的两个时钟周期发生前抖动,这将导致对频率保持精度的要求增加。 并不是说这会产生很大的影响,但是如果您可以在不扩展程序的情况下纠正缺陷,那么为什么不呢? 原始版本用了4个单词,并且以4个小节进行了测试,新版本使用了4个单词,并且以相同的4个小节进行了。 是的,更正后的版本需要对MK架构进行更深入的研究,但谁说这很容易。 另一方面,在第一个版本中,端口修改是原子的,而在第二个版本中,则无所谓,在这种情况下,这无关紧要(我们明确禁止中断),但保留了沉积物。 如果所讨论的MK具有真正的位处理器(如体系结构51中那样),那么我们可以编写一个理想的片段,结合两种方法的所有优点(甚至更短一些),但是我们可以梦pipe以求……

第三个缺点是样式更多的问题。 我对本程序前言中提到的魔术常数一再表达了自己的态度。 我再次强调-由于作者在程序的序言中而不是直接在运算符中设置了一个常量,因此“普通的街头魔术”无处不在。 事实是,我们必须向读者明确介绍形成特定值的方法,而不是为以未知方式获得的值创建同义词。 当然,您可以在具有指定计算公式值的行上写注释,但是最好显式地使用计算公式来形成常量,然后就不需要注释(当然,带有所应用常量的口语名称)。 这是在下面的文本中完成的,请注意,我们仅在最后时刻转换为整数并正确舍入,这使我们不会失去结果的准确性。

还有另一个错误-起始位的长度与数据的位间隔有些不同。 尽管偏差不太大(3个时钟周期),但是,在高比特率(比特间隔持续约90个时钟周期)的情况下,这已经是百分之几的误差,这是不可接受的。 可以通过添加用于生成额外延迟的命令来轻松纠正此错误,但这会增加程序的长度,因此我们只需修复其存在,然后确保自动消除程序的正确体系结构(即即使是短期的情况)。

好了,既然我们已经修复了错误(除了最后一个错误),我们将尝试在主要标准(在这种情况下,要取得记录)的意义上改进程序-代码的长度。 首先引起您注意的是两个时间延迟的存在,这很糟糕,因为它违反了DRY原则(一般要求)并增加了代码大小(特定要求)。 可以以子程序的形式排列此片段,但我们仍然会赢得胜利,因为我们添加了3个代码字(两个地方每个调用1个代码,返回1个代码),并且保存了4个,但是还有一个更漂亮的方法-简洁字节传输周期的组织,可以在下文中看到。

 .equ delay=15 TX_Byte: cli sec ;   - clt ;  - TransBit: ;    in r17,port bld r17,Tx_line out port,r17 Delay_TX: ;     ldi r17,delay Do_Delay_TX: nop dec r17 brne Do_Delay_TX TX_Bit: bst r16,0 ror r16 clc brne TransBit ;    brcs TransBit ;  - Exit_Transmit: Sei 

请注意,我们如何将传输的字节与进位位一起用作位计数器,这是一个不错的解决方案,但它有一个缺点-由于转换的延迟,最后一个数据位的持续时间将比其余数据位长几(2个周期)。 如果我们在谈论停止位,那么“不要该死,不要忘记”,因为没有给我们两次传输之间的最小间隔,但是这是一个很大的时间,我们只是批评了原始程序的这种行为。 在别人眼中,我们不会将尘埃的比喻比作圣经的性格,并采取措施消除它。 通过引入2个小节的延迟可以很容易地补偿这种现象,但是代码长度会增加,这是关键参数。 因此,让我们采用经典的方式来更改存储时间-我们使用一个单独的寄存器来组织传输位的计数器,并且以相同的代码大小获得完全相同的位间隔。

下一个改进与位间隔持续时间的形成有关,该间隔在原始程序中以4个周期的周期执行。 如果将其设置为3时钟(此MK中可能的最小值),则可以节省一个字节的代码,并有可能改善精度参数,因为延迟的离散度将变小(通过适当的舍入,偏差不会超过离散度大小的一半)。 但是应该记住,在特定情况下,我们可能会失去准确性,这完全取决于源数据。 可能会影响这样一个周期持续时间选择的另一种情况-字节计数器的最大延迟大小为256个值-对于可用选项,您可以使用9600波特或更高的速度,但是3周期延迟是不可能的。 最好在程序注释中反映这种情况(最小允许的端口速度),并在违反此要求的同时显示警告消息。 好吧,对参数形成宏进行适当的修改以形成延迟,不要忘记使用“交谈”名称来表示变量。

 .equ Freq = 8000000 .equ BaudRate = 115200 .equ PayLoad = 9 ;     .equ CycleTime = 3 ;    .equ delay=((Freq*2/BaudRate - PayLoad*2)+CycleTime)/(CycleTime*2) TX_Byte: cli ldi r18,10 sec ;   - clt ;  - TransBit: in r17,port bld r17,Tx_line out port,r17 Delay_TX: ldi r17,delay Do_Delay_TX: dec r17 brne Do_Delay_TX TX_Bit: bst r16,0 ror r16 dec r18 brne TransBit Exit_Transmit: sei 

现在让我们看一下结果-代码大小从20个字减少到16个字(如果仅考虑传输本身,那么更惊人的是-从18个字减少到14个字,前端的抖动消失了(当然,仅是由程序功能引起的抖动部分在硬件组件上,我们我们没有侵权),维护时间间隔的准确性得到了提高,该程序变得更加可见和易于理解(由于有注释,因为即使编写得很好的汇编程序也通常不会自我记录)。

最后一部分的结论是,如果要在汇编语言编程中创世界纪录,那么我们应该非常深入地研究特定MK的体系结构,并应用获得的知识来获得理想的结果,同时要注意所有的细微之处。

好了,总而言之-如今编写最小大小的代码的任务看起来有些虚构,但出乎意料的是,它的生命力得到了确认。 去年年底(2016年,这是该职位等待等待的时间),宣布了MSP430系列的新MK,加上独特的低价(26美分-我们正在等待基于它的中国设备的出现),而且程序存储器的大小也非常小-512字节(不,我没有记错,数字后面没有字母“ k”)。 因此,使用该设备时,代码的大小可能至关重要。通常,编写这样的极端程序需要对MK进行深入研究,并且“工作本身就是福气”。

Source: https://habr.com/ru/post/zh-CN412959/


All Articles