我知道lua正在开发微芯片PIC32,我想知道node.js(服务器的javascript)是否可以工作,或者如果lib对于PIC32来说太大或太慢了.
我正在开发一个符合ansi标准的编译器(Microchip XC8)上的PIC MCU程序.有两种操作模式,在编译期间通过宏确定.所以我不想因为一行代码而复制一个类似函数的宏,我想知道是否有任何方法可以编写宏如
#define FOO //
Run Code Online (Sandbox Code Playgroud)
这样当FOO被替换时,它实际上将取消该线的其余部分.
编写函数而不是宏是不可能的,因为函数调用产生的延迟会破坏程序的紧密时序(大约几微秒).
我真的很困惑.手册说:
RD16: 16-bit Read/Write Mode Enable bit
1= Enables register Read/Write of Timer1 in one 16-bit operation
0= Enables register Read/Write of Timer1 in two 8-bit operations
Run Code Online (Sandbox Code Playgroud)
但是,实际上似乎没有任何方法可以通过一个16位操作进行R/W!从数据表后面的内容以及我在网上看到的内容来看,16位值仍必须读作:
foo = TMR1L;
bar = TMR1H;
Run Code Online (Sandbox Code Playgroud)
写作:
TMR1H = bar;
TMR1L = foo;
Run Code Online (Sandbox Code Playgroud)
除非我没有看到它,否则RD16没有显示在Timer1框图中,似乎对任何事情都没有影响!
我知道这不可能是真的,所以我在这里问:Timer1 RD16位对PIC18单片机有什么作用?
问题:我向UART发送一个值,在另一个UART上出现空值.
- - 细节 - -
这些都是PIC处理器(PIC24和PIC32)
它们都硬接线到印刷电路板上.
它们通过其中的一个UART模块进行通信.
它们(表面上;根据文档)都配置为115200 bps,8-N-1
没有握手,没有启用CTS,没有启用RTS; 我只是把字节放在线上,然后就可以了.
(这些是短小的4字节命令和响应,非常整齐)
PIC32的速率为80 MHz.
PIC24的F [cy] = 14745600
即,它是14.7456 MHz
PIC24发送四个字节(特定的命令序列)
当我在UART的中断服务程序设置一个断点时,PIC32显示空值,然后我看到前四个后(PIC32代码)断点重复点击,我继续看到空值(这是自PIC24以来有意义的)没发送任何东西)
也就是说,当没有理由时,UART似乎重复产生中断
我没有在PIC32端写代码,我每天都在学习它是如何工作的.
然后我让代码运行起来,我不可避免地会说到一条线
52570 1D01_335C 9D01_335C _general_execption_handler sdbbp 0x0
Run Code Online (Sandbox Code Playgroud)
当我到达时,
0080181C9D00F2289F8FFFA0这就像发条一样,所以我怀疑__ISR不会停止.MpLab告诉我这个......
432:
433: //*********************************************************//
434: void __ISR(_UART1_VECTOR, ipl5) IntUart1Handler(void) //MCU communication port
435: {
9D00F204 415DE800 rdpgpr sp,sp
9D00F208 401A7000 mfc0 k0,EPC
9D00F20C 401B6000 mfc0 k1,Status
9D00F210 27BDFF88 addiu sp,sp,-120
9D00F214 AFBA0074 sw k0,116(sp)
9D00F218 AFBB0070 sw k1,112(sp)
9D00F21C 7C1B7844 …Run Code Online (Sandbox Code Playgroud) 语言:C PIC:16F84A 程序:CCS PCW
当我编译下面的代码时,我的编译器抱怨FOR总是为真(也许int我不支持负值?):
#include <16F84A.h>
#FUSES XT
#use delay(clock=4M)
byte const display[10] = {63,6,91,79,102,109,124,7,127,103};
void main()
{
set_tris_b(0);
while(True)
{
int i;
for(i=9;i>=0;--i)
{
output_b(display[i]);
delay_ms(300);
}
}
}
Run Code Online (Sandbox Code Playgroud)
它的PIC倒计时项目,所以:9,8,7,6,5,4,3,2,1,0,9,8,7,6,5,4,3,2,1,0,9,8 ,7,6,......但它在第一个周期后停止.
我有时在C程序中看到这个(我正在使用C18编译器):
unsigned char someValue = getSomeDataFromSomewhere();
if (someValue) {
doStuff();
} else {
doOtherStuff();
}
Run Code Online (Sandbox Code Playgroud)
我知道当你给if一个布尔循环(unsigned在C18编译器中)时会发生什么,但是当你把非布尔值放入时会发生什么?
我的猜测:doStuff()当值不为零时,以及doOtherStuff()当值为零时,它会执行.但我不知道这个,所以我想得到一些参考.
这是我在这里的第一篇文章所以请原谅我做错了:)这是我的情况.我正在使用MPLAB和HI-Tech C编译器为PIC16F876编写简单的数据传输操作.
我有一个叫做数据的字符,我想访问数据中的位并将它们发送到portB0,从MSB开始.
在汇编中我会做:
PORTB,0 = data,7 //为了获得MSB并将其放在端口B0上,我会为所有位执行此操作.
然而在C中,这似乎更复杂.我做了一些研究,发现了一个有效的功能:
getBit(char data, int bitNumber)
{
return (data & (1 << bitNumber-1)) != 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我就用了:
PORTBbits.RB0 = getBit(data,7);
Run Code Online (Sandbox Code Playgroud)
这没关系,但是很乱,似乎需要更长的时间,我不知道为什么我需要一个额外的功能...所以我的问题是:是否有一个简单的方法来访问寄存器中的位?喜欢:
PORTBbits.RB0 = data,7
Run Code Online (Sandbox Code Playgroud)
我不明白为什么不会因为编译器将其转换为汇编而无论如何?!!!!
提前致谢.此致,蒂姆.
当我想对我使用的字符串使用特定地址时,使用编译器 C18:
在.C
#pragma romdata idsoft
const rom unsigned char _app_nfo[31]= {"V0.0 No - 05/12/12"};
#pragma romdata
Run Code Online (Sandbox Code Playgroud)
在链接器中:
CODEPAGE NAME=idsoft START=0x78E0 END=0x78FE
Run Code Online (Sandbox Code Playgroud)
我怎么能用 XC8 做同样的事情?我尝试了很多东西,但没有一个起作用。
在 XC8 链接器参数中:
-L-pappnfo=0x78E0
Run Code Online (Sandbox Code Playgroud)
在 .C 中:
unsigned char __section ("appnfo") app_nfo[31];
Run Code Online (Sandbox Code Playgroud)
它不起作用。
当我遇到一堆看起来像这样的结构时,我正在挖掘一些与PIC单片机相关的headder文件:
typedef struct tagPORTDBITS {
unsigned RD0:1;
unsigned RD1:1;
unsigned RD2:1;
unsigned RD3:1;
unsigned RD4:1;
unsigned RD5:1;
unsigned RD6:1;
unsigned RD7:1;
unsigned RD8:1;
unsigned RD9:1;
unsigned RD10:1;
unsigned RD11:1;
unsigned RD12:1;
unsigned RD13:1;
unsigned RD14:1;
unsigned RD15:1;
} PORTDBITS;
Run Code Online (Sandbox Code Playgroud)
这是标准C吗?我无法找到任何其他类似的东西,即变量定义后的":1"
我假设所有元素都代表位,那么这是Microchip对C编译器的补充,以使嵌入式程序员更容易吗?
我正在制作一个引导加载程序并赋予它自我更新的能力。此过程包括将二进制文件复制到新位置,跳转到该位置,然后使用它在原始位置刷新新的引导加载程序。这一切都是使用 ARM GCC 工具链在 Eclipse 中为 M4 处理器开发的。
为此,我认为需要将其编译为位置无关代码(PIC)。
我四处搜索并发现这篇优秀的文章,因此当我将“-fPIC”添加到 ARM GCC 编译器调用时,我预计会看到有关 GOT 和 PLT 丢失的链接器错误 https://eli.thegreenplace.net/2011/11 /03/共享库中的位置无关代码图片/
在我的链接器脚本中,我将这些位置添加到 .data 部分,如下所示:
.data : AT(__DATA_ROM)
{
. = ALIGN(4);
__DATA_RAM = .;
__data_start__ = .; /* Create a global symbol at data start. */
*(.got*) /* .got and .plt for position independent code */
*(.data) /* .data sections */
*(.data*) /* .data* sections */
KEEP(*(.jcr*))
. = ALIGN(4);
__data_end__ = .; /* Define a global symbol at data end. */ …Run Code Online (Sandbox Code Playgroud)