我将开始一个项目,我需要对PIC单片机的汇编语言有一个很好的理解.我非常熟悉C/C++,所以我知道如何编写代码,我已经为PIC做了很多项目,所以我理解了这个架构,但是在'C'中完成了我的所有编程.
是否有一本好书或网站能够很好地解释所有汇编命令的含义以及如何为PIc微控制器执行相当简单的任务(闪烁LED,基本数学等等)?
编辑:这篇文章的主要目的是请求学习汇编的资源,而不是在PIC中讨论C与汇编的优点,或者PIC是否是一个"好"的微控制器.我使用的是PIC18单片机,如果这有任何区别的话.
有人可以建议用于Microchip PIC18处理器的Modbus RTU从器件的开源实现吗?我正在寻找用于RS-232/RS-485的Modbus RTU的实现,但也欢迎Modbus TCP/IP实现.
我正在寻找适用于微芯片PIC32的解释语言.
目前,我发现LUA和PAWN正在工作,但在选择之前,我想知道是否已知某些其他语言在PIC32中工作.
我是Java世界的新手,但我熟悉Ruby.我正在尝试编写一个与某些第三方jar文件交互的程序.
虽然从Java调用库似乎表现得很好,但是当我在JRuby中调用它们时它们的行为不正确.这是一个问题因为我真的想使用JRuby.例如,下面的两个程序尝试完全相同的东西,但它们产生不同的输出:
我在Netbeans中开发了下面的Java程序,然后按F6(运行主项目)运行它.项目的Libraries文件夹设置为"C:\ Program Files(x86)\ Microchip\MPLABX\mplab_ide\lib \nblibraries.properties".当我运行它时,它会打印"pins:17".
package pinbug1;
import com.microchip.mplab.mdbcore.assemblies.Assembly;
import com.microchip.mplab.mdbcore.assemblies.AssemblyFactory;
import com.microchip.mplab.mdbcore.simulator.PinSet;
import com.microchip.mplab.mdbcore.simulator.Simulator;
import org.openide.util.Lookup;
public class PinBug1
{
public static void main(String[] args)
{
AssemblyFactory assemblyFactory = Lookup.getDefault().lookup(AssemblyFactory.class);
Assembly assembly = assemblyFactory.Create("PIC18F14K50");
Simulator simulator = assembly.getLookup().lookup(Simulator.class);
int num = simulator.getDataStore().getProcessor().getPinSet().getNumPins();
System.out.println("pins: " + num); // prints "pins: 17"
}
}
Run Code Online (Sandbox Code Playgroud)
我只需输入就运行下面的JRuby程序jruby bug_reproduce.rb并打印"pins:0".我希望它像Java程序一样打印"pins:17".
["mplab_ide/mdbcore/modules/*.jar",
"mplab_ide/mplablibs/modules/*.jar",
"mplab_ide/mplablibs/modules/ext/*.jar",
"mplab_ide/platform/lib/org-openide-util*.jar",
"mplab_ide/mdbcore/modules/ext/org-openide-filesystems.jar"
].each do |pattern|
Dir.glob("C:/Program Files (x86)/Microchip/MPLABX/" + pattern).each do |x|
require x
end
end …Run Code Online (Sandbox Code Playgroud) 下面是我在C中编写的主要功能(对于PIC18F8722微处理器),试图以unsigned int函数设置的特定频率驱动2个多路复用7段显示get_ADC_value().显示屏还显示当前的多路复用频率.该频率范围设置#define在LAB_Fmin和LAB_Fmax范围内,并且必须get_ADC_value()随着从0增加或减少到255 而缩放.
但是这段代码不起作用,因为我认为有隐式转换int为floatat freq =.
挑战是使用浮点数修复此错误,并仅使用整数类型(int,char...)查找替代方法.
while (1) {
unsigned int x, y, z;
float freq, delay;
x = get_ADC_value();
y = x & 0b00001111;
z = (x & 0b11110000) >> 4 ;
freq = LAB_Fmin + (((LAB_Fmax) - (LAB_Fmin))/ 255)*x ;
delay = 1/(freq*1000); // convert hZ to ms delay accurately
LATF = int_to_SSD(y);
LATH = 0b11111110; //enable 7seg U1
for (unsigned int …Run Code Online (Sandbox Code Playgroud) 我试图将NSA SPECK的实现安装在8位PIC微控制器中。他们的编译器的免费版本(基于CLANG)将无法进行优化,因此我的内存不足。我尝试了启用-O2,-O3和-Os(针对大小进行优化)的“试用版”。使用-Os可以使我的代码适合2K程序存储空间。
这是代码:
#include <stdint.h>
#include <string.h>
#define ROR(x, r) ((x >> r) | (x << (32 - r)))
#define ROL(x, r) ((x << r) | (x >> (32 - r)))
#define R(x, y, k) (x = ROR(x, 8), x += y, x ^= k, y = ROL(y, 3), y ^= x)
#define ROUNDS 27
void encrypt_block(uint32_t ct[2],
uint32_t const pt[2],
uint32_t const K[4]) {
uint32_t x = pt[0], y = pt[1];
uint32_t a = K[0], b = K[1], …Run Code Online (Sandbox Code Playgroud) 使用带有pic18f的Microchip C18编译器,我想在程序数据空间中创建一个3000字节的"大"缓冲区.
如果我把它放在main()(堆栈上):
char tab[127];
Run Code Online (Sandbox Code Playgroud)
我有这个错误:
Error [1300] stack frame too large
Run Code Online (Sandbox Code Playgroud)
如果我把它放在全局,我有这个错误:
Error - section '.udata_main.o' can not fit the section. Section '.udata_main.o' length=0x0000007f
Run Code Online (Sandbox Code Playgroud)
如何创建一个大缓冲区?你有关于如何使用c18管理pic18f上的大缓冲区的教程吗?
在相关问题中找不到任何相关内容.最有可能是超级菜鸟,但无论如何我都会问/我的.h文件中有以下内容:
typedef union _API_Packet_0x90{
uint8_t packet[26];
struct _pack_struct {
uint8_t start;
uint8_t length[2];
uint8_t addr64[8];
uint8_t addr16[2];
uint8_t options;
uint8_t rfData[4];
uint8_t chksum;
};
} API_Packet_0x90;
API_Packet_0x90 ap90;
Run Code Online (Sandbox Code Playgroud)
这是微控制器的代码,我使用的是xc8工具链(以前的Hi Tech C).编译器说:
xbee_api.h:19:警告:缺少基本类型; int假设
xbee_api.h:19:错误:";" 预期
xbee_api.h:19:警告:缺少基本类型; int假设
xbee_api.h:21:警告:缺少基本类型; int假设
,这继续(太多的错误)
我认为这是uint8_t,所以我补充道#include <ctypes.h>.不.我以为这是关于名字的,所以我尝试了各种各样的戏剧,比如
typedef union {
uint8_t packet[26];
struct _pack_struct {
};
} API_Packet_0x90;
Run Code Online (Sandbox Code Playgroud)
要么
typedef union {
uint8_t packet[];
struct _pack_struct {
};
} API_Packet_0x90;
Run Code Online (Sandbox Code Playgroud)
或其他人.什么都没有帮助.我被卡住,因为我相信我正在遵循语法.有帮助吗?
我有一个数组,每个数组的元素可以是uint16_t或一对uint8_t.
它的元素被定义为uint16_t和2 uint8_t的子数组的并集.
不幸的是,编译器(MicroChip XC16)分配的内存量应该是阵列的两倍.
typedef union {
uint16_t u16; // As uint16_t
uint8_t u8[2]; // As uint8_t
} my_array_t;
my_array_t my_array[1]; // 1 word array, for testing
my_array[0].u8[0] = 1;
my_array[0].u8[1] = 2;
uint8_t byte_0 = my_array[0].u8[0]; // Gets 0x01
uint8_t byte_1 = my_array[0].u8[1]; // Gets 0x02
uint16_t byte_0 = my_array[0].u16; // Gets 0x0201
Run Code Online (Sandbox Code Playgroud)
编译器应该分配4个字节而不是2个字节.
解决方法:如果我将结构更改为:
typedef union {
uint16_t u16; // As uint16_t
uint8_t u8[1]; // As uint8_t
} my_array_t;
Run Code Online (Sandbox Code Playgroud)
编译器应该分配2个字节,但这是不正确的:
my_array[0].u8[1] = 2;
Run Code Online (Sandbox Code Playgroud)
虽然它仍然有效:
uint8_t byte_1 = …Run Code Online (Sandbox Code Playgroud) 我试图使用pic24fj128gb206枚举usb cdc设备.设备似乎正确枚举.
但是当我将我的设备连接到Linux PC时,我从内核收到以下警告消息.
cdc_acm 1-8.1.6.7:1.0: failed to set dtr/rts
Run Code Online (Sandbox Code Playgroud)
当我尝试使用屏幕连接时,此消息将重复.
screen /dev/ttyACM9 115200
Run Code Online (Sandbox Code Playgroud)
我无法通过PC与我的设备通信[Ubuntu,14.04]
使用wireshark分析数据时,看起来USB通信正常,主机发出URB_CONTROL_out并且设备响应URB状态为 Broken Pipe (-EPIPE ) (-32)

任何人都可以帮我解决如何调试此问题或任何进一步调试的方法?