0

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

我必须说,作为 C/C++ 的新手,我花了很多时间审查和重新审查我自己的代码是否有错误。我想到的最后一件事是,毫无疑问,几十年前编写的一些非常基本的函数可能会产生这样的问题。

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

喂喂喂!!- 当我有机会时,我会发布一个指向 au tube 视频的链接,显示我现在已经能够编程并且在我的 LED 立方体上看起来相当不错的波函数。

罗素

ps 非常感谢你们在这里的帮助——它给了我一些追赶的途径,从而阻止了我完全放弃——当然在这之前对字节序了解不多,所以了解了这一点以及一些系统的方法来进行健壮的调试方法。

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

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

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);
        }
    }
}
..........

ColourWheel[Colour] 在我的程序开始时声明如下(在任何函数之外)

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.

这段代码正在做的是获取代码的八位段的每一位,并首先使用 MSB 将端口/引脚设置为高或低(然后我有一些其他代码,它为每个高电平更新 TLC5940 IC LED 驱动器芯片/low 在引脚上,代码继续以类似的方式获取绿色和蓝色 8 位)。

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

但是,如果我按如下方式更改代码,则例程可以正常工作

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 位始终为零,接下来的 8 位代表红色,下一个代表蓝色等)

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

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

                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++;                          } 
4

2 回答 2

0

我认为缺少(afterif是一个错字。

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

  1. 再次确认测试if( ( 0b00000000111111111110101010111110 >> 16 ) & ( 1 << bitpos ) )有效。收集(打印)每个结果bitpos

  2. 存储0b00000000111111111110101010111110在数组的元素 0 中。重复if( ( ColourWheel[0] >> 16 ) & ( 1 << bitpos ) )。收集结果并与基本情况进行比较。

  3. 存储0b00000000111111111110101010111110在数组的所有元素中。重复if( ( ColourWheel[Colour] >> 16 ) & ( 1 << bitpos ) )几个不同的颜色值(尽管手动分配)。收集结果并与基本情况进行比较。

  4. 存储0b00000000111111111110101010111110在数组的所有元素中。if( ( ColourWheel[Colour] >> 16 ) & ( 1 << bitpos ) )使用通常分配的颜色值重复此操作。收集结果并与基本情况进行比较。

  5. 恢复原来的程序并重新测试。收集结果并与基本情况进行比较。

于 2013-08-22T20:03:10.883 回答
0

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


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


 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;
   }
于 2013-08-22T20:38:39.490 回答