对此进行更新 - 似乎 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++; }