我们有一个简单的架构:
PIC通过基于中断的I2C通信协议与ARM通信以传输数据.在中断内部,我们发出一个从I2C层(总线)读取数据的任务.
在数据有限的情况下,我们通常不会有太多问题来读取数据并将其发送到上层.如果这个数据非常庞大,中断将被连接很长时间.
第一个问题是:
我对吗?
如果我是对的,如何避免相同?......或者我们可以采用不同的方案吗?
我正在尝试开始使用pic24,特别是PIC24FJ64GA002,我已经在寄存器中看了数据表和诸如此类的东西,但我仍然无法让它眨眼LED.当我通过调试运行它时它运行正常,但是当我尝试在pic上实际运行它时,它似乎根本不运行.
我正在使用一个外部振荡器,一个8MHZ振荡器,专门连接到引脚9(OSCI)和10(OSCO).编译器是Mplab中的C30.
数据表链接是:http://ww1.microchip.com/downloads/en/DeviceDoc/39881D.pdf
代码如下
//include basic header definition
#include <p24FJ64GA002.h>
//config
_CONFIG2(0x0200);
_CONFIG1(0x0800);
int i;
//main loop
int main(void)
{
OSCCON = 0x2280; //select external OSC, no PLL
AD1PCFG = 0xFFFF; //set to all digital I/O
TRISA = 0x0000; //configure all PortA as output
while(1) //Loop forever
{
LATAbits.LATA0 = 1; //RA0 = 1
Wait();
LATAbits.LATA0 = 1; //RA0 = 1
Wait();
}
}
int Wait(void) // gives me a nice delay of 1/3rd a second or …Run Code Online (Sandbox Code Playgroud) 为什么我问这是因为发生了以下情况:
在标题中定义:
typedef struct PID
{
// PID parameters
uint16_t Kp; // pGain
uint16_t Ki; // iGain
uint16_t Kd; // dGain
// PID calculations OLD ONES WHERE STATICS
int24_t pTerm;
int32_t iTerm;
int32_t dTerm;
int32_t PID;
// Extra variabels
int16_t CurrentError;
// PID Time
uint16_t tick;
}_PIDObject;
Run Code Online (Sandbox Code Playgroud)
在C源:
static int16_t PIDUpdate(int16_t target, int16_t feedback)
{
_PIDObject PID2_t;
PID2_t.Kp = pGain2; // Has the value of 2000
PID2_t.CurrentError = target - feedback; // Has the value of 57
PID2_t.pTerm = PID2_t.Kp …Run Code Online (Sandbox Code Playgroud) 有没有办法让C18编译器在编译期间抛出自己的自定义错误消息?
例如,考虑具有两个用户定义设置的情况:
#define SETTING_A 0x80
#define SETTING_B 0x3f
Run Code Online (Sandbox Code Playgroud)
假设这些设置不能同时存在 0x00.当用户将两个设置都设置为时,有没有办法让编译器抛出错误(或至少是一个警告)0x00?
PIC单片机具有简单的指令集格式.每条指令正好是14位长,由不同位长的各种数字组成.
我正在尝试构建一个可以接受所有这些输入并构建表示该指令的数字的函数.

这就是我一直努力工作的原因:
def fileRegOp(opcode, d, f):
out = opcode << 13
out = out | d << 7
out = out | f
return out
print "FIN:", bin(fileRegOp(1,True,15))
Run Code Online (Sandbox Code Playgroud)
它输出
FIN:0b10000010001111
哪个看起来不错,除了比特是错误的方式.我认为它应该是:
FIN:0b00000111111000
我已经看到SO上的解决方案涉及循环翻转位,但我相信有更好的方法.
什么是最优雅的方式来编写这个功能?
有关指令集的更多详细信息:数据表,请参见第121,122页
我目前正在研究C中的微控制器项目,该项目需要进行多个定时功能.我使用硬件定时器每毫秒产生一个中断,变量作为计数器产生适当的时间间隔.硬件细节并不重要.
例如,对于特定函数,将在1ms计数器的每个滴答上执行以下代码,从而导致每10ms调用一次Function().
if (count < 10)
{
count++;
}
else
{
Function();
count = 0;
}
Run Code Online (Sandbox Code Playgroud)
我想实现一个包装函数,以避免为每个不同的时间间隔重写计数器代码,即:
TimerWrapper(required interval 1, Function 1 pointer)
TimerWrapper(required interval 2, Function 2 pointer)
Run Code Online (Sandbox Code Playgroud)
并在计时器的每个刻度上调用它.为了实现这一点,包装器调用的每个不同函数都需要有一个单独的计数变量,需要在TimerWrapper()的调用之间保持不变.我想将所有实现细节与我的主程序分开,并尽可能少地将变量引入我的主程序.
有可能做我要问的事情,还是有更简单/更好的方法来达到同样的效果?我知道如何用面向对象的语言做到这一点但我的技能缺乏简单的C.
我正在尝试编程PIC16F887并遇到这个有趣的问题.我希望LED能够一次闪烁并永久停止,但是它会重新开始并且永远不会停止,尽管看门狗被禁用.这是代码.提前致谢.
我在MPLAB v8.84中编写了这个,并使用PICkit2和Hi-Tech C编译器进行编程.
#include <htc.h>
#include <pic.h>
#define _XTAL_FREQ 800000
//__CONFIG(0x3FF5);
//functions
void INITgeneral(void);
void ledshow (void);
void main(void) {
INITgeneral();
ledshow();
return;
}
void INITgeneral(void)
{
TRISA = 0;
TRISB = 0;
TRISC = 0;
TRISD = 0;
TRISE = 0;
PORTA = 0;
PORTB = 0;
PORTC = 0;
PORTD = 0;
PORTE = 0;
}
void ledshow(void)
{
__delay_ms(400);
RD0 = 1;
__delay_ms(400);
RD0 = 0;
}
Run Code Online (Sandbox Code Playgroud) 我的面包板上有一个简单的PIC16F18877电路设置,我已成功获得一个LED在无限while循环内闪烁.我试图将相同的代码放在一个for只应执行5次的循环中,但LED会一直闪烁.
我的代码(带XC8编译器的MPLAB):
#include <xc.h>
#define _XTAL_FREQ 8000000
int main()
{
TRISD1 = 0;
for (int i = 0; i < 5; i++)
{
RD1 = 1;
__delay_ms(500);
RD1 = 0;
__delay_ms(500);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 在我编写的固件中,我创建了一种变量。类似于下面的内容:
struct SitemMenu {
unsigned int id;
char * text;
void * submenu
}
typedef struct SitemMenu TitemMenu;
Run Code Online (Sandbox Code Playgroud)
是任何功能:
void functionX () {
...
}
Run Code Online (Sandbox Code Playgroud)
如果我创建此变量:
TitemMenu itemWhatever;
Run Code Online (Sandbox Code Playgroud)
并做:
itemWhatever.submenu = &function (X);
Run Code Online (Sandbox Code Playgroud)
我可以打电话给functionX做吗:
(*itemWhatever.submenu)();
Run Code Online (Sandbox Code Playgroud)
我做了类似的事情,编译器给出了这个答案:
error: (183) function or function pointer required
Run Code Online (Sandbox Code Playgroud) 我正在使用PIC18F26K83,并且试图通过使用NTCALUG02A103F来测量温度。我已经计算了ADC输出和它们等于的温度。我创建了2个数组:1个用于ADC值,1个用于该ADC值的温度。在for循环中,我将ADC的值与数组的值进行比较,如果我的ADC值小于数组的值,它将继续递减数组元素,最终它将以258 ADC值结束,这是我数组的最后一个元素。但是,在for循环中,它永远不会减少。即使我的ADC值为2000,它也不会继续。它卡在i = 32。这是代码:
int i;
int temperature;
int temp_data;
int temp_ADC_array[34] = {259, 293, 332, 377, 428, 487, 555, 632, 720,
821, 934, 1062, 1203, 1360, 1531, 1715, 1910, 2113,
2320, 2528, 2731, 2926, 3108, 3274, 3422, 3552, 3663,
3756, 3833, 3895, 3945, 3983, 4013, 4036};
int temp_array[34] = {125, 120, 115, 110, 105, 100, 95, 90, 85, 80, 75, 70,
65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10,
5, 0, -5, -10, -15, -20, …Run Code Online (Sandbox Code Playgroud)