2013-08-22 1 views
0

Обновление к этому - похоже, есть некоторые проблемы с функциями триггера в 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++;       } 
+0

Каковы порядок байтов вашего компьютера и устройства? – Amadeus

+0

Вы говорите, что он не работает с массивом. Что неверно? Кроме того, вы пытались запустить оба сегмента кода и сравнить результаты? –

+0

Спасибо за быстрый ответ. Мне нужно немного рассказать о том, что происходит в массиве, чтобы полностью объяснить это. – rjamjb

ответ

0

Я предполагаю, что отсутствует ( после if является опечаткой.

Указанная методика исследования, в отсутствие отладчика, является:

  1. Confirm еще один раз, тест 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. Вернитесь к исходной программе и повторите проверку. Соберите результаты и сравните их с базовым случаем.

+0

Да - была опечатка в моем оригинале - несколько вещей, которые можно было бы здесь проделать. Я буду работать и репонировать. Я не думаю, что у меня есть простой способ распечатать результаты - я запускаю свой код через MPLAB X (я программирую Chipkit uno32) для отладки и проверки изменений переменных на каждом шаге. – rjamjb

+0

Работая с этим, я в конце концов придумал решение, но обходное решение действительно. Когда я фактически размещал числа непосредственно (например, сохраняя 0x00F0F000 (красный F0, зеленый F0), я получил желтый цвет, как ожидалось, аналогично 0000F0F0 (зеленый F0, синий F0) дал Cyan и 0x00F0F0F0 дал белый цвет. Поэтому я попробовал другой подход и заполнил массив непосредственно путем установки каждого элемента массива вместо заполнения по формуле ....так что – rjamjb

+0

Первые две строки являются пустотами fillagaincolourwheel (void) { ColourWheel [0] = 0b00000000111111110000000000000000; \t ColourWheel [1] = 0b00000000111111100000000000000100; \t ColourWheel [2] = 0b00000000111111100000000000001001; и т. д. прямо до ColourWheel [254] = 0b00000000111111100000010000000000;} – rjamjb

0

Уверен, что значение в ColourWheel[Colour] не соответствует ожиданиям или нестабильно. Подтвердите диапазон индексов и получите доступ один раз. Улучшена скорость кодирования.


[Редактировать] Если принимающий конец не любит медленные изменения сигнала, вызванные замену константы с ColourWheel[Colour]>>16, более effcient код может решить эту проблему.


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

Я всегда относился к чему-то вроде: for (uint8_t mask = 0x80; mask; mask >> = 1) – mocj

+0

@mocj Да, после этого много раз, хотя я предпочитаю 'unsigned'. Здесь мы можем воспользоваться тем, что 'value' содержит все 24 цветовых бита и может быть сдвинуто 24 раза, всегда проверяя один и тот же бит. Код тестовой бит статической позиции хорошо встроен в процессоры. – chux

+0

Чукс, я не уверен, что это сработает. По сути, мне нужно установить красный бит/зеленый бит/синий бит (на их соответствующих выводах на моем чипкете), а затем отправить импульс для обновления IC драйверов. Затем я перехожу к следующим битам RGB и устанавливаю три булавки и посылаю импульс для обновления микросхем драйвера и т. Д. Я не могу установить все красное, затем все зеленые, затем все синие. – rjamjb

Смежные вопросы