使用C代码重置Pic18的最佳方法是使用HiTech Pic18 C编译器
编辑:
我当前正在使用
void reset()
{
#asm
reset
#endasm
}
Run Code Online (Sandbox Code Playgroud)
但必须有一个更好的方法
Microchip PIC MPLAB(MCC18)编译器将其存储器分为256个块(0x100).
如何创建大于256字节的数组?
char buffer[256];
Run Code Online (Sandbox Code Playgroud)
为了达到256,我需要制作一个单独的片段 #pragma
#pragma udata segment_name
char buffer[256];
#pragma udata
Run Code Online (Sandbox Code Playgroud)
所以我可以强制MCC18让我们分配更大的缓冲区?或组合两个内存段?
我在使 PIC32MX795F512L 的引导加载程序正常工作时遇到问题。
我基于 microchip 网站上的示例代码。
这是我应该写入内存的代码部分,到目前为止我已经验证了引导加载程序(解析十六进制文件很好,数据到达这一点但没有写入内存):
#define NVMOP_WORD_PGM 0x4001
// Write the data into flash.
Result = NVMemWriteWord(ProgAddress, WrData);
// Assert on error. This must be caught during debug phase.
if(Result != 0)
{
ASSERT(Result==0);
}
UINT NVMemWriteWord(void* address, UINT data)
{
UINT res;
NVMADDR = KVA_TO_PA((unsigned int)address);
// Load data into NVMDATA register
NVMDATA = data;
// Unlock and Write Word
res = NVMemOperation(NVMOP_WORD_PGM);
return res;
}
UINT __attribute__((nomips16)) NVMemOperation(UINT nvmop)
{
int int_status;
int susp;
// Disable …Run Code Online (Sandbox Code Playgroud) 我不明白为什么我的编译器(Microchip XC16)会向其他编译器提供不同的结果.
下面是我转换为在通用机器上运行的示例代码,而不仅仅是我正在使用的pic33fj256gp710.当在pic上运行代码时(代码示例2),我得到一个不同的结果,其中第一个数组索引被重置为0(结果2).
本质上,我们的想法是通过串行端口获取字符串命令,并通过拆分字符串并对其进行排序来配置设备.
这是因为编译器最初传递一个指向该值的指针,直到清除该字符串而不是传递该值本身?如果是这种情况,我如何强制编译器传递值本身?
代码示例1:
char receive_data_2[100] = "XXXX,1,4,20,33,34";
int m = 4;
char intext[10];
int output_values[10];
int number_of_logger_selections = 0;
while(receive_data_2[m] != ' ' && number_of_logger_selections < 10)
{
int a = 0;
m++;
strcpy(intext, " ");
do
{ // get parameter number
intext[a++] = receive_data_2[m++];
} while(receive_data_2[m] != ',' && receive_data_2[m] != ' ');
output_values[number_of_logger_selections] = atoi(intext); // save output number to mark 'x'
printf
("\nvalue at output_values[%d] = %d, intext = %s, translated to %d\r\n\n",
number_of_logger_selections, …Run Code Online (Sandbox Code Playgroud) 我正在MPLAB IDE中开发代码,我想知道使用编译器生成的.COFF或.HEX文件编程芯片是否更好.我不确定两者之间有什么区别,我假设他们都会做同样的工作.
我知道lua正在开发微芯片PIC32,我想知道node.js(服务器的javascript)是否可以工作,或者如果lib对于PIC32来说太大或太慢了.
我真的很困惑.手册说:
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单片机有什么作用?
我对Modbus通信有点新意,我开始阅读有关"Free Modbus"库的内容.现在,我明白了如何使用它来实现Modbus通信的从属端,但我似乎无法找到如何在主服务器端使用该库.例如,我在主机侧调用什么功能来读取从机19的离散输入3(例如)?
提前感谢您的帮助.
顺便说一下,我正在用C语言编写MSP430微控制器.
我正在使用Microchip的XC32编译器,它不允许在循环内声明变量(不支持C99),所以我不能这样做:
for(int i = 0;i<10;i++)
{do w/e}
Run Code Online (Sandbox Code Playgroud)
我不想让它成为一个全局的,因为很难跟踪它在大项目中的价值,在各种循环中使用相同的东西,即使你i = 0在每个循环中初始化它.我甚至对此有一个错误,如果你有一些使用相同的嵌套循环,结果会发生奇怪的事情i.
据我所知,我不能手动"取消声明"它,但是在通过块后,在一段代码中定义的变量是未声明的?这是真的,这是否意味着这个代码将像上面的代码一样:
{
int i;
for(i = 0;i<10;i++)
{do w/e}
}//no i anymore?
Run Code Online (Sandbox Code Playgroud) 我的PIC18F87J11一次只能擦除1024个字节.有没有强迫它一次只擦除2个字节或更多?
我正在制作一个Bootloader,有时候只有一行HEX文件(16字节)更改为应用程序,所以我想用新的16字节替换内存中的那一行.如果我尝试擦除这16个字节,则自动擦除1024个字节.然后我被迫重写它们,这需要一些时间并降低Bootloader的速度.
是否有另一种方法可以在不擦除1024个字节的情况下从闪存中擦除某些内容?希望有.
谢谢!