问题标签 [pic18]
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.
c - 如何使用 PIC18 写入和读取内存?
我想将一个数字存储到 PIC18,然后即使断电或设备重置也能保留它。我认为我的编写代码部分看起来不错,只是单元重置后它的读取部分看起来很奇怪。
我正在使用从 Microchip 获得的以下代码。
代码:
输出:1
但是,当我重置单元并仅使用读取代码时,我总是得到 255。
代码阅读:
输出:255
为什么会这样?我假设可能没有保存该值或读取部分不正确。谢谢!
c - 如何为 PIC18 制作计时器?
在我的一生中,我无法为 PIC18 或精确的 PIC18f87j11 制作计时器。我想要做的就是拥有一个每 1 秒递增一次的计数器。我只想以秒为单位监控 PIC18 运行了多长时间。
那里的大多数教程都是针对 PIC16 的并且是汇编的。我正在尝试使用 C 编程来做到这一点。对于初学者来说,如果我看到示例,我会更好地理解,所以没有示例我无法进步。
请有人给我一个例子,谢谢!
c - 如何在使用 TCP/IP 堆栈的 PIC18 上对引导加载程序进行单元测试?
我正在使用Microchip的MPLAB X 1.60中的XC8 C编译器1.12开发引导加载程序。目标芯片是PIC18F87J60。我的引导加载程序做了一些引导加载程序通常不会做的额外事情。它将应用程序映像从服务器下载到闪存,并通过计算MD5哈希和来验证其完整性。此外,它必须通过特定于该项目的服务器上的身份验证测试。为了使所有这些工作,我使用 Microchip 的 TCP/IP 堆栈v5.42。
我现在要做的是彻底测试引导加载程序,但我在选择正确的方法和工具时遇到了一些麻烦。我可以使用Pickit 3 ICD,但不能使用任何其他专用硬件,例如逻辑分析仪等(示波器除外)。引导加载程序被实现为分层FSM,它可能(或可能不会)使事情变得更加复杂。
我在考虑至少对引导加载程序的所有不同部分进行单元测试/模块测试,并将 FSM 的所有状态视为单独的功能。互联网上有一些单元测试框架,其中一些声称可以在像我这样的嵌入式和受限环境中使用。
问题在于,大多数都是作为某种 C 库实现的,可以与程序的其余部分一起编译,但他们都希望编译器遵循一些标准。XC8编译器实际上确实遵循C90标准,但没有完全扩展(显然是文档中的“与 ANSI C 标准的分歧”一章)。这给编译框架带来了麻烦。
我可以通过模拟所有硬件和注册访问并在我的 Windows 7 开发机器上测试来解决这个问题,但这将是大量的工作,因为我使用引导加载程序严重依赖的 TCP/IP 库。另一个缺点是最终我想在芯片上进行测试,因为 C 代码在 PIC 芯片上的行为可能与我的intel i7上的行为不同。
有人对如何正确安装unit-/moduletest
我的引导加载程序有任何想法吗?在这样的平台上对这样的程序进行单元测试甚至是一个好主意吗?还有其他我可能使用的测试方法吗?
要求/预/注释:
- 我说的是白盒测试方法。黑盒测试目前并不痛苦。此外,从功能上讲,引导加载程序没有被编译,所有功能要求都是可测量的。
- 我想尽可能地自动化测试,甚至在我按下“编译”时自动触发测试。
- 没有任何严格的性能要求,而且我有一些备用 ROM 内存,因此像放入大量探针这样的代码检测应该不是什么大问题。
- 我远不是一个测试大师。我上面使用的任何花哨的词都来自几个小时的研究,但我没有任何实际的测试经验。
提前感谢您的任何想法和建议。
比特垃圾,
c - 使用 PIC18 的 C18 库中的延迟函数实现长延迟
我使用的是 Fosc = 10MHz 的 PIC18。因此,如果我使用 Delay10KTCYx(250),我得到 10,000 x 250 x 4 x (1/10e6) = 1 秒。
如何使用 C18 中的延迟功能进行很长的延迟,比如 20 秒?我正在考虑只使用二十行Delay10KTCYx(250)。还有另一种更高效、更优雅的方式吗?
提前致谢!
output - pic18f14k50 不输出
我正在使用 pic 18f14k50,我正在尝试使用它进行简单测试。只需让 LED 闪烁即可。问题是,我已经将 ANSEL、ANSELH、ADCON1 等全部设置为 0,还将所有端口都设置为输出。我还没有看到 LED 闪烁。
这是代码(我正在使用MicroC)
感谢所有的帮助!
embedded - 定时器不是依靠 PIC18F 的睡眠模式吗?
我有带有 MPLAB C18 的 PIC18F87J11。我试图通过强制它进入睡眠状态来限制设备对电池的消耗。我注意到进入睡眠模式后,timer0 停止计数,直到唤醒。此外,我知道唤醒设备的唯一方法是当它从另一个节点接收到消息时,因为我有一个 MRF89XA 收发器。
为了让我的设备进入睡眠状态,我只需调用它在编译器头文件中定义的这个函数。
Q1:除了从某个节点接收消息外,我如何唤醒设备?在 DataSheet 中,它说 EXIT BY INTERRUPT 或 EXIT BY RESET 但是如果没有计时器,你怎么做呢?
通过阅读数据表,它声明必须使用Timer1才能监控时间,真的是这样吗?
我真正想要的只是尽可能降低电池使用量并让计时器在睡眠模式下工作。
谢谢!
c - XC8 PIC18 上的 24 位 const 指针不起作用
我在我的项目中两次遇到这个问题,最后一次我使用了一种肮脏的解决方案。
平台:PIC18F87J60,XC8 v1.12
我正在尝试使用函数指针指向可能位于我的 ROM 上半部分(> = 0x10000)的函数。这意味着指针本身需要为 17 位或更大(最多 20 位)才能处理这样的函数。
这是相关的代码片段(简化):
发生的事情是测试实际上从未被调用。当我使用调试器 ( PICKIT 3 ) 时,我可以看到 testPointer 中的值是 0x0C000。似乎指针中的地址被四舍五入到最大只有 16 位,而且这种情况总是会发生。但是当我将 test() 放在 0x10000 以下的某个地方时,一切正常,因为指针只需要最大 16 位。
当我从设备中读回程序时,test() 确实位于 0x1C000,所以这不是问题,代码就在那里。
上次我通过将文字 long 转换为指针来解决这种情况,这很有效,但它很脏,现在我想避免它。
有没有人认识到这个问题?这是编译器错误吗?如果是这样,Microchip 是否已经知道这一点?有什么干净的解决方法吗?XC8 编译器是否完全支持 20 位 const 指针?
编辑:修复 &testPointer(); 上面代码中的错字 --> (*testPointer()); (不,这不是我的问题)
c - 将 0-5v 模拟转换为等效的旋转编码器
我目前正在以实习生的身份研究机器人,并且必须为电机选择替换驱动器。轴的位置信息由模拟电位器给出。我确实有 3 个由 technosoft 提供的驱动程序,它们需要旋转编码器(正交)信息来完成他们的调节工作。我正在考虑将此模拟信号转换为正确的正交信号以使其工作。
我设计它的方式是 pic18 以 150hz 对电位器值进行采样,将前一个值减去当前值以了解速度(一种推导)。它产生一个速度的绝对值和一个方向信号,这些信号通过正交编码器的 4 个状态调节状态机的变化率。我最终将这些信号发送到 2 个输出。
我的问题如下。
是否可行。或者有没有聪明的方法呢?甚至是可以完成这项工作的专用芯片?我在网上搜索了一个已经做过类似事情但一无所获的人。
我花了最后两天的时间来编写这个解决方案并对其进行调试但没有成功......在示波器上,正交信号在那里,但它的行为没有真正的逻辑。无论我移动或不移动底池,变化的速度或快或慢。
这是我的代码
部分代码注释是法语的,我翻译了重要的。您是否看到任何明显的错误/错误的编码方式。您对“在哪里搜索”或看什么有什么建议吗?
提前感谢您的帮助!
尼古拉斯
mplab - 为什么 RB 中断例程运行两次?
我下面有一些代码有一个小错误,我不知道如何修复。基本上发生的事情是我的高 ISR 在设置标志后运行了两次。它只运行两次并且是一致的。子例程应该只运行一次,因为当 RB 上的输入更改时设置了标志,并且例程在 RB 的输入更改一次后运行两次。测试是在 MPLAB v8.6 中使用工作簿功能进行的。
assembly - 如何使用按钮使 LED 闪烁 - pic18f
我做了一个简单的电路来闪烁 LED,但代码在 proteus 模拟中不起作用。请参阅下面的代码和模拟。
有没有人有解决这个问题的办法?非常感谢。