首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的中断例程不能正确访问数组

我的中断例程不能正确访问数组
EN

Stack Overflow用户
提问于 2013-08-23 03:30:17
回答 2查看 561关注 0票数 0

更新到这一点-似乎在math.h (使用MPIDE编译器)中的trig函数有一些问题-难怪我的调试器不能看到这一点,它使用自己的math.h,因此给了我预期的(正确的解决方案)。我在微芯片板上偶然发现了这一点,而不是实现了一个“快速正弦/余弦”算法(参见devmaster .com了解这一点)。我的ISR和ColourWheel阵列现在可以完美地工作。

我必须说,作为一个C/C++的新手,我花了很多时间来检查和重新检查我自己的代码中的错误。我脑海中的最后一件事是,毫无疑问,几十年前编写的一些非常基本的函数可能会出现这样的问题。

我想,如果我可以访问实际数组的屏幕转储,我自己就会更早地看到这个问题,但是,由于我的芯片连接到我的led立方体,我无法直接访问芯片中的数据。

嘿,哇!!-当我有机会的时候,我会发布一个链接到一个u管视频,展示我现在已经能够编程的波函数,并且在我的LED立方体上看起来非常好。

罗素

ps非常感谢你们在这里的帮助-它给了我一些追逐的途径,让我完全停止了放弃-在此之前,我当然不太了解字节顺序,所以了解了它,以及一些系统的方法来进行健壮的调试方法。

在尝试访问中断例程中的数组时,我遇到了问题。

以下是ISroutine内部的代码片段。

代码语言:javascript
复制
if (CubeStatusArray[x][y][Layer]){
    for(int8_t bitpos=7; bitpos >= 0; bitpos--){
        if((ColourWheel[Colour]>>16)&(1<<bitpos)) { // This line seems to cause trouble
            setHigh(SINRED_PORT,SINRED_PIN);
        }
        else {
            setLow(SINRED_PORT,SINRED_PIN);
        }
    }
}
..........

我的程序一开始就声明了ColourWheelColour,如下所示(在任何函数之外)

代码语言:javascript
复制
static volatile uint32_t ColourWheel[255]; //this is the array from which
                                           //the colours can be obtained -
                                           //all set as 3 eight bit numbers
                                           //using up 24 bits of a 32bit
                                           //unsigned int.

这段代码所做的是获取代码的8位段中的每一位,并首先使用MSB将端口/引脚设置为相应的高或低(然后我有一些其他代码,为引脚上的每个高/低更新TLC5940 IC发光二极管驱动器芯片,该代码继续以类似的方式获取绿色和蓝色8位)。

这不起作用,我的颜色输出到我的LED的行为不正确。

但是,如果我按如下所示更改代码,则该例程将正常工作

代码语言:javascript
复制
if (CubeStatusArray[x][y][Layer]){
    for(int8_t bitpos=7; bitpos >= 0; bitpos--){
        if(0b00000000111111111110101010111110>>16)&(1<<bitpos)) { // This line seems to cause trouble
            setHigh(SINRED_PORT,SINRED_PIN);}
        else {
            setLow(SINRED_PORT,SINRED_PIN);
        }
    }
}
..........

(行中的实际二进制数是不相关的(前8位始终为0,后8位代表红色,下一位代表蓝色,依此类推)

那么,为什么ISR可以使用固定的数字,但如果我尝试使用保存在数组中的数字,则不能。??

以下是显示完整RGB更新的实际代码:

代码语言:javascript
复制
                if (CubeStatusArray[x][y][Layer]){
                      for(int8_t bitpos=7; bitpos >= 0; bitpos--){
                        {if((ColourWheel[Colour]>>16)&(1<<bitpos))
                        {setHigh(SINRED_PORT,SINRED_PIN);}
                        else
                        {setLow(SINRED_PORT,SINRED_PIN);}}
                        {if((ColourWheel[Colour]>>8)&(1<<bitpos))
                        {setHigh(SINGREEN_PORT,SINGREEN_PIN);}
                        else
                        {setLow(SINGREEN_PORT,SINGREEN_PIN);}}
                        {if((ColourWheel[Colour])&(1<<bitpos))
                        {setHigh(SINBLUE_PORT,SINBLUE_PIN);}
                        else
                        {setLow(SINBLUE_PORT,SINBLUE_PIN);}}
                        pulse(SCLK_PORT, SCLK_PIN);
                        pulse(GSCLK_PORT, GSCLK_PIN);
                        Data_Counter++;
                        GSCLK_Counter++;                          } 
EN

回答 2

Stack Overflow用户

发布于 2013-08-23 04:03:11

我认为if之后丢失的(是一个拼写错误。

在没有调试器的情况下,指定的研究方法是:

  1. 再次确认测试if( ( 0b00000000111111111110101010111110 >> 16 ) & ( 1 << bitpos ) )工作正常。收集(打印)数组元素0中每个bitpos
  2. Store 0b00000000111111111110101010111110的结果。对if( ( ColourWheel[0] >> 16 ) & ( 1 << bitpos ) )重复上述步骤。收集结果并与基本情况进行比较。
  3. 0b00000000111111111110101010111110存储在数组的所有元素中。对几个不同的颜色值(不过是手动指定的)重复if( ( ColourWheel[Colour] >> 16 ) & ( 1 << bitpos ) )。收集结果并与基本情况进行比较。
  4. 0b00000000111111111110101010111110存储在数组的所有元素中。使用通常指定的颜色值对if( ( ColourWheel[Colour] >> 16 ) & ( 1 << bitpos ) )重复此操作。收集结果并与基本情况进行比较。
  5. 恢复到原始程序并重新测试。收集结果并与基本案例进行比较。
票数 0
EN

Stack Overflow用户

发布于 2013-08-23 04:38:39

确信ColourWheel[Colour]中的值不像预期的那样或不稳定。验证索引范围并访问一次。代码速度增强包括在内。

编辑如果接收端不喜欢用ColourWheel[Colour]>>16替换常量导致的较慢的信号变化,更有效的代码可能会解决这个问题。

代码语言:javascript
复制
 if (CubeStatusArray[x][y][Layer]){
   uint32_t value = 0;
   uint32_t maskR = 0x800000UL;
   uint32_t maskG = 0x8000UL;
   uint32_t maskB = 0x80UL;
   if ((Colour >= 0) && (Colour < 255)) {
     value = ColourWheel[Colour];
   }
   // All you need to do is shift 'value'
   for(int8_t bitpos=7; bitpos >= 0; bitpos--){
     { if( (value & maskR) // set red
     }
     { if( (value & maskG) // set green
     }
     { if( (value & maskB) // set blue
     }
     value <<= 1;
   }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18389254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档