我们不是在寻找简单的方法。

上
一篇 ,这是我的第一
本出版物,引起了Habr用户的共鸣。 决定不停止。 我们继续将不可能的事情从ATtiny13中挤出来。 我立即警告您,所描述的解决方案再次成为非标准解决方案,并且可能会引起愤慨和认知失调(“那么,本文的重点是什么?请说明可以连接哪些元素?”)。 而且,这样的解决方案也是不切实际的,我将在下面更详细地介绍。 但是,碰巧的是,标准解决方案早已为人所知,关于它们的阅读并不总是很有趣,但是写作却毫无意义。
我真的很喜欢这个孩子ATtiny13。 他有足够的大脑来解决许多日常问题(开灯,通风,
跑到商店去喝啤酒 )。 而且价格太荒谬了。 这里只有几条腿,根本没有把手。 因此,您必须采取各种技巧来解决腿部不足的问题。
在研究微控制器的编程过程中(在Arduino环境中,不要告诉任何人),我和许多人一样,经历了连接超声波距离传感器的步骤,如下所示:

由于将信息从传感器传输到控制器的方法不容易理解,因此ATtiny13可以轻松应对。 然后有必要使用移位寄存器在七段指示器上显示信息。 即,显示部分的方案比控制器本身大几倍。 那一刻,我玩转并继续前进。
我认为,最近要分配给Tinka的任务还很艰巨吗? 她在所描述的示例中仍然无法处理什么。 我记得有关适应症的第一件事。 前一段时间,我已经在寻找有关类似主题的信息。 然后我发现了一个
有趣的 选择。距控制器5英尺的21个分段。 哇! 我什至不需要太多,两个符号就足够了,加上一个点,总共15个细分。 如果有四只脚? 然后最多获取13个细分,这还不够。 在电路的视线中,立即出现了组装和尝试的愿望,尽管制定操作算法并不容易。 但是仔细一看,您就会知道收集起来是行不通的,这种七段动物在自然界中不存在(极有可能)。 当然可以,但是这是一个不同的层次。 然后这个想法被推迟到更好的时候。
题外话:为什么没有集成逻辑的七段指标? 开发商在哪里看? 安装和控制有多方便-两个电源脚和3个(1、2)数据脚。 毕竟,它们甚至出现在苏联:490IP1、490IP2。 在最普通的2 ... 4位数字指示器内,有足够的空间放置芯片微电路,移位寄存器的价格为0.064 cu(含表壳)。 哦好
因此,我再次考虑,如何减少使用七段指示器的支脚数量? 控制器的输出可以采用三种状态(实际上是4种,但是现在没关系)。 有什么办法使用吗? 如果相对于LED的两种状态只能解释为发光,而不是发光,那么对于三种状态,则更有趣。 我还没有弄清楚如何使用它,但是我想到了以下方案:

如果控制器输出处于零状态,则LED不会点亮(这很明显)。
如果输出处于单位状态,则LED发光,这也是可以理解的。
但是,如果输出根本不是输出,而是接通了输入,则电流流过两个电阻器和LED HL1的电路,从而在电阻器的连接点处产生大约(5-1.7)/(2.2 + 1.5)的压降。 * 1.5 + 1.7 = 3.0V。这不足以使电流流过VD1_R3_HL2电路(大约需要3.4 V)。 VD1是用作稳压二极管的附加LED(稳定器更为正确),因此我们不会将其视为LED,以免引起混淆。 上拉电阻是否在微控制器内部接通都没有关系,其电阻(20 kOhm)实际上不会影响这种情况。 在使用常规二极管VD1尝试之前,我并没有马上达到这样的额定值,它在相同的电阻R1和R2上也能很好地工作。 但是R2最好比R1大大约一半半。 我几乎忘了最重要的事情:所描述的一切只有在指示器和其他指示器中都使用
红色 LED才可能实现。 在极端情况下,指示器
或其他LED可以呈绿色亮起。 且电源电压为4.5 V至5V。
到底我们有什么? 三种状态:无LED(0)发光,HL1(1)发光或HL1和HL2(2)发光。 与三元系统非常相似。 但是没有HL1,我们不能点亮HL2,这一点必须牢记。 但是现在借助微控制器的四个支路,我们可以控制八个LED(我想是这样)。
然后,我尝试将指标细分为几对(就像在幼儿园一样:男孩女孩)。 主要条件是,在每一对中,这些段中的一个不能单独发光,这种区分。 这是我得到的:

四对段,在每个大写字母中指示主要段,它们可以单独工作,第二对只能使用它。 您可能会注意到,段“ a”一下子激起了两个,而根本没有人遇到麻烦。 生活看起来如何!
但是使用这些对,您可以显示(几乎)所有数字:
每对涂有自己的颜色。 细心的观看者注意到,平局出了点问题。 我们暂时不会专注于此。 我尝试了更多的分组细分选项,最好不要提出。 也许有人会建议。 也许神经网络可以处理它。
在实验的第二阶段,我必须使用带有公共阳极的指示器。 因此,最终方案如下:
有人可能会问:100欧姆电阻放在哪里? 早就知道(并积极使用)通过正确显示动态指示,可以省去限流电阻。 即使错误地将不断从控制器输出端施加的电压施加到串联连接的两个LED上,微控制器和LED仍能正常承受,电流仍受MC内部的过渡电阻限制。 还有更多关于电阻的信息。 根据以前的方案,通过HL1的最大电流约为2 mA,通过HL2的最大电流达到25 ... 40 mA(大概,稍后我会说这些数字从何而来)。 这意味着不同段的光输出将不同。 但是,由于将使用动态指示,因此由于段的显示时间不同,可以轻松解决此问题。
我在Arduino IDE中在Arduino Nano上进行的所有实验。 一个出色的原型开发板,可以很好地用于面包板,可以通过USB进行闪存,而不会出现问题。 失败了吗? 我修复了草图,并在一分钟内上传了新固件。 而且,当您调试代码时,可以转到ATtiny13中的固件,它仍然需要花费更多的手势。
顺便说一句,我也在Arduino环境中使用Arduino闪烁,这实际上消除了使用错误的保险丝锁定MK的可能性,并且更加容易。
这是在代码中显示数字4的示例:
pinMode(f_a, INPUT);
原则上,即使对于不熟悉Arduino但对控制器有所了解的人,所有内容也应该清楚。 通过段的亮度,实验性地选择了150微秒和2毫秒的数字。 在最终代码中,您需要将它们放在单独的变量中,以便可以在调试期间进行更改。 根据这些图,可以近似地确定一对中两个分段之间的电流差顺序。 由于G段的发光量比其他段少约13倍,并且提供相同的亮度,因此可以假定通过此段的电流比其他段多13倍。 实际上,亮度对电流的依赖性是非线性的,因此电流可以大25倍,即50 mA。 这样的占空比对于MK的输出是相当安全的。 顺便说一下,当解决图2的问题时,电流的这种差异会发挥作用。正如我在上面所写,段G只能与段C一起被照亮。但是如果将0传递给负责C和G的MK支路150μs,然后2毫秒以使其保持1,然后G段将以全亮度“工作”,而C段仅需要一点时间点亮相同的150微秒。 我们几乎得到了两个。 因此,我设法打破了我自己建立的规则。 绝望是无法完成的。
因此,我们用MK的四脚照亮了人物。 实际上,我自己错过了这个阶段,立即显示了两个字符。 为此,请从电源正端断开其中一个指示器位的公共阳极的输出,并连接至MC的另一个引脚,另一个放电的阳极连接至下一个输出(已经有6个支路)。 现在,依次将1设置在最低有效数字的阳极上,显示最低有效数字的数字,然后将1设置在最低有效数字的阳极上,并显示最高数字的数字,依此类推。 我用Arduino Nano进行了此实验,她有足够的腿。 所有代码都在上面调试过,而不是第一次。 因此,它按预期工作了。
由于阳极是依次连接的,因此可以通过简单的改进来释放MK的另一个输出。 这是摘要图:
总共使用5条腿的MK来显示两位数。 在此阶段,您已经可以尝试使用婴儿ATtiny。 我做到了 但不是马上。 在Arduino环境中为ATtiny13编译的草图占用了大约1.7 kB的内存,并且有1 kB的可用空间。 为了减小尺寸,我不得不直接转向端口,稍后将要做。 顺便说一下,在Arduino上,我使用了与ATtiny相同的端口,这非常方便。 它们已在最后的图中指示。 处理后,代码丢失了1 KB。
这是ATtiny13的结果代码:
上面的代码将允许您的ATtiny13从0到99进行读取。提供重新分配MK支路的可能性会更正确。 编程专家可能会减少几次代码(
AVR的最低Hello World限制在哪里? )。
您可以将必要的功能添加到代码中,以便MK显示出有意识的内容。 没错,Tinki已经把所有的腿都弄了。 还有一个复位引脚,可以用作输入/输出端口。 但是使用它比我想的要难。 因此,对于我自己,我“待会儿”。 但是有一个有趣的功能,并不是每个人都知道。 模拟输入ADC0输出到同一支路,并且可以工作! 的确,当其上的电压小于电源电压的1/4时,MK进入复位模式。 但是从1/4到电源电压,很可能测量输入电压。 我利用了这一点:
经验表明,该指标最多可以降低到21,只有MK进入重置模式,并在恢复到25以上时才开始工作。 因此,当然有可能在测量输入上使用分压器,从而制作出非常错误的“指示器”来指示25至99伏的电压。
现在介绍实际应用。 由于缺少一个数字输入,显示距离传感器数据的原始想法被推迟到更好的时间。 您为何还能在想法出现之前应用该计划。 另一个警告:毫无疑问任何盈利能力。 即使您还清所有段,也有2.5 mA的电流流经电阻R2(根据第一种方案),总共流向指示器10 mA,再加上晶体管的控制,大约增加了5 mA。 我没有提到,几乎任何pnp晶体管都是现代的。
关于权宜之计。 输出到七个部分的最便宜的选择是ATtiny13加74HC595。 两个SMD盒将花费我大约0.50立方 最简单的是ATmega8(仅此而已,没有电阻,仅此而已),它是0.68 cu 上述选项是ATtiny,9个电阻器,4个LED,一个晶体管(所有SMD)的成本-大约为0.46 cu,尽管有时它的价格会逐笔增加。 此外,将所有内容放在一起比以前的版本更复杂。
实际上,我可以看到的唯一选择是您是否拥有完整的ATtiny13,但是您仍然需要去商店购买ATmega。 好吧,如果七段指示器是设备的主要装饰,则我不建议您使用此方案,因为它的显示效果并不理想,在某些组合中,不必要的段会稍微突出显示。 碰巧在设置时偶尔需要指示,然后是地点本身。
总的来说,我白费了几天。
除了批评之外,我还在等待有关改进代码和简化方案的建议。 或改进的功能而不复杂。 我最感兴趣的是如何点亮观点,这将扩大范围。 但是,如果我们也可以从涉及的5个结论中得出一个结论,那么就有可能漫游。
如果我的非标准解决方案有一天(而不是现在)使某人受益,我将感到非常高兴。
UPD:我知道Charliplexing! 我在本文开头引用的第三方方案是Charliplexing。 我在那里写了为什么Charliplexing不适合的原因。
如果您斜阅读文章,请不要发表评论。