Обновление к этому - похоже, есть некоторые проблемы с функциями триггера в math.h (с использованием компилятора MPIDE) - неудивительно, что я не мог видеть это с помощью моего отладчика, который был используя свою собственную математику и поэтому давая мне ожидаемые (правильные решения). Я случайно обнаружил это на микросхемах микросхем и вместо этого вместо этого реализовал алгоритм «быстрый синус/косинус» (см. Devmaster dot com для этого). Теперь мой ISR и ColourWheel работают отлично.Моя процедура прерывания не имеет доступа к массиву правильно
Я должен сказать, что, будучи довольно новичком в C/C++, я потратил много часов на просмотр и пересмотр моего собственного кода на наличие ошибок. Я мог подумать, что некоторые основные функции, которые, без сомнения, были написаны несколько десятилетий назад, могут дать такие проблемы.
Я полагаю, что раньше бы я сам видел эту проблему, если бы у меня был доступ к экранному дампу фактического массива, но, поскольку мой чип подключен к моему светодиодному кубу, у меня нет доступа к данным в чип напрямую.
Эй, привет! - когда я получаю шанс, я отправлю ссылку на видео с трубкой, показывающую волновую функцию, которую я теперь смог запрограммировать и выглядел довольно хорошо на моем светодиодном кубе.
Рассел
пс Спасибо всем большое за вашу помощь здесь - он остановил меня отказаться полностью, давая мне некоторые пути гоняться - конечно, ничего не знал об порядок байтов до этого так узнали о том, что и некоторые систематические способы использования надежного подхода к отладке.
У меня проблема при попытке доступа к массиву в процедуре прерывания.
Ниже приведен фрагмент кода из 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 [цвет] объявлен следующим образом в начале моей программы (вне любой функции)
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 для каждого максимума/минимума на штыре, а код продолжает принимать зеленый и синий 8 бит аналогичным образом).
Это не работает, и мои цвета, выводимые на мои светодиоды, ведут себя неправильно.
Однако, если изменить код следующим образом, то процедура работы
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++; }
Каковы порядок байтов вашего компьютера и устройства? – Amadeus
Вы говорите, что он не работает с массивом. Что неверно? Кроме того, вы пытались запустить оба сегмента кода и сравнить результаты? –
Спасибо за быстрый ответ. Мне нужно немного рассказать о том, что происходит в массиве, чтобы полностью объяснить это. – rjamjb