更新到这一点-似乎在math.h (使用MPIDE编译器)中的trig函数有一些问题-难怪我的调试器不能看到这一点,它使用自己的math.h,因此给了我预期的(正确的解决方案)。我在微芯片板上偶然发现了这一点,而不是实现了一个“快速正弦/余弦”算法(参见devmaster .com了解这一点)。我的ISR和ColourWheel阵列现在可以完美地工作。
我必须说,作为一个C/C++的新手,我花了很多时间来检查和重新检查我自己的代码中的错误。我脑海中的最后一件事是,毫无疑问,几十年前编写的一些非常基本的函数可能会出现这样的问题。
我想,如果我可以访问实际数组的屏幕转储,我自己就会更早地看到这个问题,但是,由于我的芯片连接到我的led立方体,我无法直接访问芯片中的数据。
嘿,哇!!-当我有机会的时候,我会发布一个链接到一个u管视频,展示我现在已经能够编程的波函数,并且在我的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);
}
}
}
..........我的程序一开始就声明了ColourWheelColour,如下所示(在任何函数之外)
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的行为不正确。
但是,如果我按如下所示更改代码,则该例程将正常工作
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更新的实际代码:
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++; } 发布于 2013-08-23 04:03:11
我认为if之后丢失的(是一个拼写错误。
在没有调试器的情况下,指定的研究方法是:
if( ( 0b00000000111111111110101010111110 >> 16 ) & ( 1 << bitpos ) )工作正常。收集(打印)数组元素0中每个bitpos0b00000000111111111110101010111110的结果。对if( ( ColourWheel[0] >> 16 ) & ( 1 << bitpos ) )重复上述步骤。收集结果并与基本情况进行比较。0b00000000111111111110101010111110存储在数组的所有元素中。对几个不同的颜色值(不过是手动指定的)重复if( ( ColourWheel[Colour] >> 16 ) & ( 1 << bitpos ) )。收集结果并与基本情况进行比较。0b00000000111111111110101010111110存储在数组的所有元素中。使用通常指定的颜色值对if( ( ColourWheel[Colour] >> 16 ) & ( 1 << bitpos ) )重复此操作。收集结果并与基本情况进行比较。发布于 2013-08-23 04:38:39
确信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;
}https://stackoverflow.com/questions/18389254
复制相似问题