У меня возникли проблемы с обработчиком прерывания DMA, который я адаптировал для ЖК-дисплея встроенного чипа MicroChip PIC32.
У меня ограниченная внутренняя память, и мне нужен буфер кадров для моего цветного ЖК-дисплея. Решили использовать 16 цветов и использовать откусывание на пиксель. Я создал массив, который выглядит так:
unsigned char GraphicsFrame[FRAME_HEIGHT][LINE_LENGTH/2];
В моем обработчике прерываний я конвертирую 4-битный полубайт в 16-битное значение для отправки на ЖК-дисплей через параллельный порт и передачу DMA. Для этого я использую справочную таблицу в обработчике прерываний, но при отладке я захожу в General_Exception_Handler, и он указывает на проблему в том, как я извлекаю 4-битный полубайт и преобразовываю его в 16-битное значение:
for( i=0,j=0; i<30; i++, lineX++ )
{
// not particularly elegant, perhaps look at a better way
if ((((GraphicsFrame[line][i]) >> 4) & 0x0F) == 0x0) lineBuffer[j++] = (unsigned short int)RGBBlack;
else if((((GraphicsFrame[line][i]) >> 4) & 0x0F) == 0x1) lineBuffer[j++] = (unsigned short int)RGBBlue;
else if((((GraphicsFrame[line][i]) >> 4) & 0x0F) == 0x2) lineBuffer[j++] = (unsigned short int)RGBRed;
else if((((GraphicsFrame[line][i]) >> 4) & 0x0F) == 0x3) lineBuffer[j++] = (unsigned short int)RGBGreen;
else if((((GraphicsFrame[line][i]) >> 4) & 0x0F) == 0x4) lineBuffer[j++] = (unsigned short int)RGBCyan;
else if((((GraphicsFrame[line][i]) >> 4) & 0x0F) == 0x6) lineBuffer[j++] = (unsigned short int)RGBYellow;
else if((((GraphicsFrame[line][i]) >> 4) & 0x0F) == 0x7) lineBuffer[j++] = (unsigned short int)RGBKaneGreen;
else if((((GraphicsFrame[line][i]) >> 4) & 0x0F) == 0xF) lineBuffer[j++] = (unsigned short int)RGBWhite;
if ((GraphicsFrame[line][i] & 0x0F) == 0x0) lineBuffer[j++] = (unsigned short int)RGBBlack;
else if((GraphicsFrame[line][i] & 0x0F) == 0x1) lineBuffer[j++] = (unsigned short int)RGBBlue;
else if((GraphicsFrame[line][i] & 0x0F) == 0x2) lineBuffer[j++] = (unsigned short int)RGBRed;
else if((GraphicsFrame[line][i] & 0x0F) == 0x3) lineBuffer[j++] = (unsigned short int)RGBGreen;
else if((GraphicsFrame[line][i] & 0x0F) == 0x4) lineBuffer[j++] = (unsigned short int)RGBCyan;
else if((GraphicsFrame[line][i] & 0x0F) == 0x5) lineBuffer[j++] = (unsigned short int)RGBMagenta;
else if((GraphicsFrame[line][i] & 0x0F) == 0x6) lineBuffer[j++] = (unsigned short int)RGBYellow;
else if((GraphicsFrame[line][i] & 0x0F) == 0x7) lineBuffer[j++] = (unsigned short int)RGBKaneGreen;
else if((GraphicsFrame[line][i] & 0x0F) == 0xF) lineBuffer[j++] = (unsigned short int)RGBWhite;
}
Я пытаюсь настроить DMA для передачи 60 пикселей за раз (60 x 16 бит), используя другой массив, содержащий 60 пикселей:
unsigned short int lineBuffer[60];
Может ли кто-нибудь обнаружить проблему с тем, как я извлекаю кусок и конвертирую его? Предупреждений и ошибок нет, так что ничего не выскакивает!
Любая помощь приветствуется, спасибо