标签: pic

关于基于中断的通信

我们有一个简单的架构:

  1. 主芯片(基于arm9)
  2. PIC控制器

PIC通过基于中断的I2C通信协议与ARM通信以传输数据.在中断内部,我们发出一个从I2C层(总线)读取数据的任务.

在数据有限的情况下,我们通常不会有太多问题来读取数据并将其发送到上层.如果这个数据非常庞大,中断将被连接很长时间.

第一个问题是:

  1. 我对吗?

  2. 如果我是对的,如何避免相同?......或者我们可以采用不同的方案吗?

arm communication interrupt pic i2c

0
推荐指数
1
解决办法
278
查看次数

为什么我的PIC没有闪烁它的LED?

我正在尝试开始使用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)

c++ embedded microchip pic

0
推荐指数
1
解决办法
1945
查看次数

我的struct中声明的变量可以具有不同的大小

为什么我问这是因为发生了以下情况:

在标题中定义:

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)

c size struct pic

0
推荐指数
1
解决办法
277
查看次数

让C18抛出编译器错误

有没有办法让C18编译器在编译期间抛出自己的自定义错误消息?

例如,考虑具有两个用户定义设置的情况:

#define SETTING_A 0x80
#define SETTING_B 0x3f
Run Code Online (Sandbox Code Playgroud)

假设这些设置不能同时存在 0x00.当用户将两个设置都设置为时,有没有办法让编译器抛出错误(或至少是一个警告)0x00

c compiler-errors pic mplab mplab-c18

0
推荐指数
1
解决办法
572
查看次数

将数字打包到bitset(python,按位运算)

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页

python bit-manipulation pic bit

0
推荐指数
1
解决办法
138
查看次数

如何为使用不同参数调用的给定函数实现单独的静态变量

我目前正在研究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.

c microcontroller pic

0
推荐指数
1
解决办法
60
查看次数

PIC无限循环

我正在尝试编程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)

c pic infinite-loop mplab

0
推荐指数
1
解决办法
452
查看次数

微控制器编程 - 程序不退出for循环

我的面包板上有一个简单的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)

c microcontroller for-loop pic mplab

0
推荐指数
1
解决办法
201
查看次数

尝试在变量类型内使用void指针调用函数

在我编写的固件中,我创建了一种变量。类似于下面的内容:

    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)

c struct function-pointers pic xc8

0
推荐指数
1
解决办法
51
查看次数

C语言数组和for循环无法正常工作

我正在使用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)

c embedded pic

0
推荐指数
1
解决办法
127
查看次数