问题标签 [68hc12]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
97 浏览

c - 缩小C中的一系列数字

我正在从电位计读取值,我可以旋转该电位计以产生 0-1023 范围内的数字。我希望能够在 LCD 屏幕上以水平条形图的形式显示这些数字。LCD 屏幕为 20 块宽,因此 0-1023 必须按比例缩小到 0-20。我想用来生成条形图的字符是一个块,它填充了 20 个可用块中的一个完整块。此块的位模式是0b11110001.

我希望有人可以向我解释如何实现这一点以及缩小电位器值的最佳方法。

0 投票
1 回答
222 浏览

assembly - 汇编语言,不懂指令代码和内存位置

我正在为我的数字设计课上的考试而学习,但我不明白一些事情。这是带有答案的工作表,在此处输入图像描述

  1. 我了解每条指令的 PC 地址。我不明白的是在b上,它说分支跳转到哪里,68hc12在分支之后获取并执行哪条指令。我看到 080B 20 F8,但这到底是什么意思,就像 080B 是内存中存放指令的插槽,但是后面的 20 F8 是什么意思?我也不太了解 C 部分中的 A,任何帮助都会很棒。
0 投票
1 回答
79 浏览

c - 在C中反转条形图的方向

我想编写我自己版本的变差计来表示以米/秒为单位的爬升下沉。这些值显示在 LCD 模块屏幕上。爬升和下沉值是从电位器按比例缩小的,我可以在程序运行时旋转该电位器来更改值。要显示的爬升值范围从climb: 0 m/sclimb: 300 m/s,下沉值范围从sink: 0 m/ssink: -300 m/s。这点没问题。

我现在要做的是以条形图的形式显示这些,中心为零点。随着climb增加到 300,零点右侧的块相应地从左到右填充。当sink值减小到 -300 时,我希望零点左侧的块从右到左相应地填充,基本上反转了右侧的方向。

DELVAL是从电位器读取的数据。我可以让条形图的右侧工作,但我不能让左侧工作。谁能让我知道我的代码有任何问题,并解释让左侧工作的最佳方法。

在我的代码中不起作用的部分是包含character2.

0 投票
1 回答
86 浏览

assembly - 管理参数和返回地址时处理堆栈的正确约定

当您需要访问堆栈中“下方”的参数时,处理将调用函数的返回地址置于堆栈中的任何参数之上的最佳方法是什么?我正在使用 S12 摩托罗拉/飞思卡尔处理器。(S12 有:16 位 D 寄存器,由 A 和 B 寄存器组成,每个寄存器有 8 位。X 和 Y 索引寄存器各 16 位,一个程序计数器和一个堆栈指针)代码示例如下:

问题是堆栈的顶部保存着下一条指令的地址,这使得操作变得困难。例如,如果我需要一个位于地址下方的参数,我将不得不手动调整 SP(这看起来相当 hacky)或者我将不得不拉出堆栈的顶部并将其存储在一个寄存器中向上空间。最后一种方法的一个转折是将返回地址存储在一个变量中,不幸的是,这里声明的变量是全局范围的,感觉并不理想。

还有其他我在这里看不到的选择吗?

0 投票
0 回答
88 浏览

assembly - 装配 - 寄存器 B HCS12 中的元素数量

我花了至少一周的时间寻找有关此问题的参考资料,我不得不说我开始放弃了。我似乎无法找到有关 HCS12 上寄存器 B 中存储的数组中元素数量的任何概念。该寄存器的内存地址存储在寄存器 X 中
。目的是找到元素的数量,以创建一个计算该数组元素平均值的子程序。我真的很感激任何帮助!

编辑:更正了我的问题中的一个错误

0 投票
1 回答
112 浏览

68hc12 - 反汇编没有入口点向量的 68xx 代码

我正在尝试从包含 68xx(类似 68hc12)微控制器的旧收音机中反汇编代码。问题是,我无法访问ROM顶部的micro的中断向量,所以我不知道从哪里开始看。我只有顶部下方的代码。有一些关于在哪里或如何在代码数据中找到有意义的例程的建议?

0 投票
1 回答
156 浏览

timer - HCS12 嵌入式:计数器定时器和计算的输出比较值

HCS12 上的定时器输出比较中断有问题。问题似乎是我正在将计算值写入输出比较寄存器而不是立即数,即......

OCval = x + y ; ldd OC1, OCval ; // 我需要做什么

ldd OC1, #3000 ; // 什么工作

使用计算值,定时器中断是不稳定的,这在我的应用程序中是不可接受的。该问题已被牢牢地归结为在单个周期内访问定时器和 OC 寄存器的记录要求,除了立即写入之外的任何操作都违反了这一点。我还注意到网络上的所有示例代码都使用即时操作。

只是想知道是否有软件解决方法。我需要让计数器自由运行(即没有重置),因为还有其他输出与必须保持运行的立即写入进行比较。只需要计算我的两个中断。

软件修复会很好,因为我能看到的唯一其他选项涉及额外的硬件来处理动态时序,很混乱。TIA

0 投票
0 回答
63 浏览

c - Sprintf 不能与 dragon12-light board 一起使用(C)

我正在尝试对 Dragon12-Light 板进行编程,以通过 Cool Term 终端软件向 PC 显示信息,但是我似乎无法让 sprintf 功能正常工作。目标是从温度传感器和光传感器向终端发送信息,但我什至用虚拟值尝试过它,但它运行不正常。这是代码:

我已经验证了所有函数都可以正常运行,如果我将具有定义值的 char 数组放入传输字符串函数中,当在键盘上按下“1”时,它将在终端上正确显示,但 sprintf 命令没有t 似乎正在向数组写入任何内容。任何帮助将不胜感激。谢谢!

0 投票
7 回答
270 浏览

c - 使用 HCS12 微控制器防止读取损坏

概括

我正在尝试为MC9S12VR 微控制器编写嵌入式应用程序。这是一个 16 位微控制器,但我处理的一些值是 32 位宽,在调试时,我捕获了一些异常值,这些值似乎是由于读取撕裂造成的。

我正在用 C89 为这个微控制器编写固件并通过飞思卡尔 HC12 编译器运行它,我想知道是否有人对如何在这个特定的微控制器上防止它们有任何建议,假设是这种情况。

细节

我的部分应用程序涉及驱动电机并根据编码器产生的脉冲估计其位置和速度(电机每转一圈就会产生一个脉冲)。

为此,我需要配置一个 MCU 定时器,以便跟踪脉冲之间经过的时间。然而,定时器的时钟频率为 3 MHz(预分频后),定时器计数器寄存器只有 16 位,因此计数器每 ~22ms 溢出一次。作为补偿,我设置了一个在定时器计数器溢出时触发的中断处理程序,这会将“溢出”变量增加 1:

然后我可以从中计算出当前时间:

main.c中,我临时编写了一些调试代码,以一个方向驱动电机,然后定期拍摄各种数据的“快照”:

在这个测试中,我MOTOR_GetCurrentTime()在两个非常接近的地方阅读代码并将它们分配给全局可用结构的属性。

在几乎所有情况下,我发现第一个读取的值比 while 循环应该终止的点多几微秒,而第二次读取是在那之后几微秒 - 这是预期的。但是,有时我发现第一次读取明显高于 while 循环应该终止的点,然后第二次读取小于第一个值(以及终止值)。

下面的屏幕截图给出了一个例子。在我能够重现它之前,我花了大约 20 次重复测试。在代码中,<snapshot>.elapsed是之前写入的,<snapshot>.time因此我希望它的值略小:

对于snapshot[8],我的应用程序首先读取20010014(超过应该终止忙循环的 10 毫秒),然后读取19988209. 正如我上面提到的,每 22 毫秒发生一次溢出 - 具体来说,_timerOverflowsNoReset一个单位的差异将产生65535 / 3计算出的微秒值的差异。如果我们考虑到这一点:

19988209 + \frac{65535}{3} - 20010014 = 20010054 - 20010014 = 40

40 的差异与我在其他读取对之间看到的差异(~23/24)相差不远,所以我的猜测是,涉及到_timerOverflowsNoReset. 就像在 while busy-looping 中一样,它会执行一次调用MOTOR_GetCurrentTime(),错误地认为_timerOverflowsNoReset比实际值大一,导致循环提前结束,然后在下一次读取时再次看到正确的值。

我的应用程序有其他问题,我无法确定,我希望如果我解决了这个问题,如果它们有类似的原因,它也可以解决这些其他问题。

编辑:在其他更改中,_timerOverflowsNoReset在我现在拥有的实现中,我已经将其他一些全局变量从 32 位无符号更改为 16 位无符号。

0 投票
2 回答
96 浏览

embedded - 中断服务程序以测量相位差

我目前正在使用飞思卡尔的 9S12,我真的需要一些帮助才能了解如何正确编写 ISR。特别是,我报告了一个练习的文本,他们要求我测量两个方波之间的相位差(在微控制器的输入端)。

总线时钟为 16 MHz,我必须使用系统的定时器模块,它提供了一个自由运行的计数器(TCNT @ 16 位)。计数器必须以 500 kHz 的频率工作,这是通过从总线时钟开始设置预分频器 5 来实现的。这两个信号具有相同的频率,即给定 (25 Hz),但无论如何都需要对其进行测量。

我必须使用 INTERRUPT 过程,使用正确的寄存器(实际上没有必要使用手册中完全相同的寄存器,我可以使用我想要的任何名称,而不是我必须注释代码的每一行)和变量。

我解决问题的方法非常理论化,但我需要 C 代码。

为了解决这个问题,我必须使用 INPUT CAPTURE MODE 来测量信号 1 的上升沿和信号 2 的上升沿之间的 TCNT(TICKS)计数单位的差异。我的疑问特别关于我必须使用的变量、类型(LOCAL、GLOBAL、UNSIGNED、LONG (?))、如何正确更新 ISR 中的值以及是否应该考虑计数器的溢出和相应的溢出它们产生的中断。

我陷入了这个问题,我希望有人可以帮助我提供一些代码示例,特别是对于我必须使用的变量以及如何编写实际的 ISR。谢谢大家!