问题标签 [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.

0 投票
3 回答
1461 浏览

c - 处理 1-256 字节的函数的最佳实践

我有一些旨在处理 1-256 字节的函数,在嵌入式 C 平台上运行,其中传递一个字节比传递一个 int 更快、更紧凑(一条指令对三条指令),它的首选编码方式是什么:

  1. 接受一个 int,如果为零则提前退出,否则将计数值的 LSB 复制到一个无符号字符并在 do {} while(--count); 中使用它 循环(参数值 256 将被转换为 0,但会运行 256 次)
  2. 接受一个无符号字符,如果为零则提前退出,并有一个 256 字节的特殊版本的函数(这些情况将提前知道)。
  3. 接受一个无符号字符,如果为零则运行 256 次。
  4. 有一个像上面这样的函数,但是通过表现为 (0-255) 和 (256 only) 的包装函数调用它。
  5. 具有与上述类似的函数,但通过行为为 (0-255) 和 (256 only) 的包装宏调用它。

预计系统繁忙时,函数的内循环大概占处理器执行时间的15%-30%;它有时用于少量字节,有时用于大字节。该函数使用的内存芯片具有每个事务的开销,我更喜欢让我的内存访问函数在内部执行 start-transaction/do-stuff/end-transaction 序列。

最有效的代码是简单地接受一个 unsigned char 并将参数值 0 视为执行 256 字节的请求,依靠调用者来避免任何意外尝试读取 0 字节。不过,这似乎有点危险。其他人是否在嵌入式系统上处理过此类问题?他们是如何处理的?

编辑 平台是一个PIC18Fxx(128K代码空间;3.5K RAM),连接到一个SPI闪存芯片;当预期更少时读取 256 字节可能会超出 PIC 中的读取缓冲区。写入 256 字节而不是 0 会损坏闪存芯片中的数据。如果不检查忙状态,PIC 的 SPI 端口被限制为每 12 个指令次一个字节;如果这样做会慢一些。典型的写事务除了要接收的数据外,还需要发送 4 个字节;读取需要一个额外的字节用于“SPI 周转”(访问 SPI 端口的最快方法是在发送下一个字节之前读取最后一个字节)。

编译器是 HiTech PICC-18std。

我一般都喜欢 HiTech 的 PICC-16 编译器。HiTech 似乎已经将他们的精力从 PICC-18std 产品转移到了编译时间更慢的 PICC-18pro 系列,似乎需要使用 3 字节“const”指针而不是 2 字节指针,并且有关于内存分配的自己的想法。也许我应该多看看 PICC-18pro,但是当我尝试在 PICC-18pro 的 eval 版本上编译我的项目时,它不起作用,我也没有弄清楚为什么——也许是关于可变布局的一些不同意我的 asm 例程——我一直在使用 PICC-18std。

顺便说一句,我刚刚发现 PICC-18 特别喜欢 do {} while(--bytevar); 尤其不喜欢 do {} while(--intvar); 我想知道编译器在生成后者时的“思维”是什么?

编译器加载一个指向变量的指针,甚至不使用 LFSR 指令(需要两个字),而是使用 MOVLW/MOVWF 的组合(需要四个字)。然后它使用这个指针进行递减和比较。虽然我承认 do{}while(--wordvar); 不能产生像 do{}while(wordvar--); 这样好的代码 该代码比后一种格式实际生成的要好。进行单独的递减和while-test(例如while (--lpw,lpw))会产生合理的代码,但看起来有点难看。后递减运算符可以为向下计数循环产生最佳代码:

但它反而会生成比 --lpw 更糟糕的代码。最好的代码是向上计数循环:

但编译器不会生成它。

编辑 2 我可能使用的另一种方法:为字节数分配一个全局 16 位变量,并编写函数,使计数器在退出前始终归零。那么如果只需要一个 8 位的值,则只需要加载 8 位。我会使用宏来处理东西,以便可以调整它们以获得最佳效率。在 PIC 上,对已知为零的变量使用 |= 永远不会比使用 = 慢,而且有时更快。例如, intvar |= 15 或 intvar |= 0x300 将是两条指令(每种情况只需要处理结果的一个字节,而可以忽略另一个);intvar |= 4(或 2 的任何幂)是一条指令。显然在其他一些处理器上, intvar = 0x300 会比 intvar |= 0x300; 快 如果我使用宏,它可以适当地调整。

0 投票
3 回答
1161 浏览

assembly - PIC18 ISA 中如何处理除法

一种在 C 中转换为 ASCII的扩展,我想知道在 PIC18X 上究竟是如何处理除法的。

如果我执行 DIV 操作,编译器会将其解释为多少条指令?操作完成需要多少个时钟周期?时钟周期数是否取决于我的被除数、除数或两者?

作为一个不太重要的附带问题:第一个包含专用划分硬件的 CPU 是什么?

0 投票
3 回答
3888 浏览

c - PIC 上的 USART 传输问题

我正在尝试从 PIC18f4580 向 SD 卡发送数据,但 PIC 并未发送应有的内容。

相关的全局变量:

我正在使用以下函数将数据添加到缓冲区:

并使用以下中断将 TXBuffer 中的数据放入 TXREG:

使用示波器,我可以看到 PIC 正在发送 0x98,无论我在缓冲区中放入了什么。事实上,我从未将 0x98 放入缓冲区。

但是,如果我更换

或者

然后我得到了预期的结果,即PIC将重复发送0x55,或者分别从0开始计数。

那么,为什么 PIC 无法从阵列中发送数据,而其他任何时候都可以呢?我会强调传输是在中断中处理的,因为我觉得这是我问题的根源。

编辑:它是一个循环缓冲区,因为 TXEndPos 和 TXCurrentPos 在达到 127 时返回 0。当 TXEndPos - TXCurrentPos == 0 时,我还禁用发送中断,并在将数据添加到缓冲区时重新启用它。真的,我的代码完全按预期工作,如果我在 main 中向 TXBuffer 添加 13 个字符,我的 PIC 将传输 13 个字符然后停止。问题是它们总是相同的(错误的)字符 - 0x98。

EDIT2:更完整的功能在这里: http: //pastebin.com/MyYz1Qzq

0 投票
1 回答
838 浏览

c - 为什么这不能在 C18 中编译?

我正在尝试使用 MPLAB C18 v3.36 编译器编译以下代码。

编译器在 'char rij;' 上返回语法错误。但是当我放 char rij 时;前一行(在 TRISA = ... 之前),它编译 ...

0 投票
2 回答
2266 浏览

usb - Pic to PIC 和 PC USB 怎么转?

我想制作一个应用程序,PIC18F4550 通过 USB 将其内部 eeprom 数据发送到 pc。我还想使用相同的 USB 连接器通过 USB 将数据下载到另一个 PIC18F4550。

如何为此目的使用 ccs 示例代码的 ex_usb_serial.c。如果有人可以给我原理图以及在PC端做什么。在这方面的早期帮助将不胜感激。

最好的问候丹妮

0 投票
2 回答
1979 浏览

c - 使用 NETMF 的 SPI 主机到 PIC18F4550 从机同步 (C18)

.NET Micro Framework 设备(在本例中为 ChipworkX)通过SPI接口向PIC18F发送一个字节。启用后,在PIE1bits.SSPIE中断时执行以下代码:

当多次发送相同的字节时,数据似乎并没有被一致地读取。主机和从机都设置为时钟空闲低电平,数据时钟在上升沿。我不使用片选线,因为它是直接通信。最后,主机以 100 kHz 发送数据,而 PIC 以 8 MHz 运行。

如何改进和/或修复此代码?

0 投票
1 回答
1670 浏览

assembly - pic18f与lcd模块通讯

我正在组装图片 18Fxxx (18F452)。我正处于学习阶段,所以我正在做不同的简单练习,最终目标是开发一个“真正的”项目。

目前我被 LCD 模块困住了,我找不到任何与屏幕通信的工作协议示例(4 位)。有人可以链接我一些代码或要实现的程序,我可以从中了解这一切是如何工作的吗?

谢谢你。

注意:我的 IDE 是MPLAB,我正在使用PIC18 Simulator IDE来检查我的代码是如何工作的。

0 投票
2 回答
584 浏览

c - Invensense IMU3000 带微控制器 PIC

有没有人体验过将 Invensense IMU3000 与一些微控制器一起使用?我正在尝试为 PIC 构建 IMU 库,但我被依赖项困住了.. 使用其他微控制器的任何其他经验也会很好!基本上我不知道是否最好采用 Visual Studio 2005 项目并在那里进行更改,添加 PIC 依赖项(我卡住了..)或在 PIC 环境中编译整个库..

任何提示,即使是其他平台,都会有所帮助!

谢谢你们!

0 投票
2 回答
3489 浏览

c - pic18f 在 C 中延迟 x 微秒

我需要一个用 C 语言编写的精确时间延迟函数,它将 pic 程序的执行延迟给定的微秒数。我确实在 microchipc.com 上找到了一个使用 ASM 的示例,但代码只允许时钟速度高达 32000000。我的时钟速度需要为 64000000,但由于我不明白代码是如何工作的,我无法修改它做我需要的。谁能提供一些代码解释或建议如何实现类似的东西?

0 投票
2 回答
1897 浏览

usb - PIC18F4550 自定义 USB VID 和 PID

我是 PIC 编程的新手,我已经准备好制作一个 USB 程序,这样我就可以从我的程序在(Windows XP)PC 上向它发送电机控制命令。

如何设置 PIC18F4550 的 VID 和 PID?我阅读了数据表,但它似乎没有说任何有用的东西。数据表是否使用不同的词来讨论这些参数?我看到了DEVID(第 294 页);这有什么关系?