工具与软件:
ADC 读取通道序列出现问题。
我有一个我正在读取的8x8像素阵列。 所有像素均已打开、可进行故障排除。 使各个像素接地、以验证 ROIC 指向的正确存储器位置。 我有4个16:1多路复用器馈送到4个不同的 ADC 通道。 因此、多路复用器将馈送到 ADC0、多路复用器馈送到 ADC1、多路复用器馈送到 ADC2、多路复用器馈送到 ADC3。 for 环路计数从0到15、并输出到端口 P3上的4个引脚、以设置多路复用器的开关。 在中断期间、我首先读取 Mem0、最后读取 Mem3。 当我将 Mux4上的最后一个通道(通道16)接地时会出现问题。 问题是它锁定了。 如果我将 for 环路计数器更改为在14 (而不是15)结束、当 I 接地 Mux4的通道15和接地通道16不起作用时、就会发生锁定。
uint16_t *ROIC[65];
uint16_t array[8][8];
uint16_t Color_Array[64];
unsigned int count,i,Row,Column;
void matrix(void);
unsigned long counter;
unsigned long Color = 0xFFL;
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer
// Setup port pins
P4DIR |= 0x40; // Set P4.6 to output direction - LED
P3DIR |= BIT4; // Set P3.4 to output direction - A0
P3DIR |= BIT5; // Set P3.5 to output direction - A1
P3DIR |= BIT6; // Set P3.6 to output direction - A2
P3DIR |= BIT7; // Set P3.7 to output direction - A3
P1SEL1 |= BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5;
P1SEL0 |= BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5;
PM5CTL0 &= ~LOCKLPM5;
// Clock System Setup
CSCTL0_H = CSKEY >> 8; // Unlock CS registers
CSCTL1 = DCOFSEL_6; // Set DCO to 8MHz
CSCTL1 &= ~DCORSEL;
CSCTL2 = SELA__VLOCLK | SELS__DCOCLK | SELM__DCOCLK;
CSCTL3 = DIVA__1 | DIVS__1 | DIVM__1; // Set all dividers
CSCTL4 &= ~LFXTOFF; // Enable LFXT1
CSCTL0_H = 0; // Lock CS registers
// ADC Setup
ADC12CTL0 = ADC12SHT0_2 | ADC12ON | ADC12MSC;
ADC12CTL1 |= ADC12SHP | ADC12CONSEQ_1;// | ADC12SSEL1;
ADC12CTL2 |= ADC12RES_2;
ADC12MCTL0 |= ADC12INCH_0;
ADC12MCTL1 |= ADC12INCH_1;
ADC12MCTL2 |= ADC12INCH_2;
ADC12MCTL3 |= ADC12INCH_3 | ADC12EOS;
ADC12IER0 |= ADC12IE3; // Interrupt MEM3
ADC12CTL0 |= ADC12ENC;// | ADC12SC; // Enable conversions
ST7735_if_init();
ST7735_display_init();
matrix();
draw(0, 0, 128, 128, 0xFFFFFFL); //0L
drawimage(0,0,128,128,0xFFFFFFL); // Display Srico image
// initialize Color_Array to one color
for (i = 65; i > 0; i--)
Color_Array[i-1] = 0xF00F;
while(1)
{
P4OUT ^= BIT6; // Toggle LED
drawMatrix(0,0,128,128,Color_Array);
for(i = 0; i < 16; i++)
{
count = i;
count = count << 4; // Rotate left 4 bits
P3OUT = count;
counter = i * 4;
ADC12CTL0 |= ADC12ENC | ADC12SC; // Enable conversions
__bis_SR_register(GIE);
__no_operation(); // For debug only
}
//adjust array color based on voltage level
Row = 7;
Column = 7;
for (i = 64; i > 0; i--)
{
//Temp1 = array[i];
if (array[Row][Column] >= 0xA00)
Color_Array[i-1] = 0xFF00;
if (array[Row][Column] < 0x0A00)
Color_Array[i-1] = 0xFFFF;
if (Column == 0)
{
Column = 8;
Row = Row - 1;
}
Column = Column - 1;
}
__no_operation(); // For debug only
}
}
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12_ISR (void)
#else
#error Compiler not supported!
#endif
{
switch (__even_in_range(ADC12IV, ADC12IV_ADC12RDYIFG))
{
case ADC12IV_ADC12IFG3:
*ROIC[counter+1] = ADC12MEM0;
*ROIC[counter+2] = ADC12MEM1;
*ROIC[counter+3] = ADC12MEM2;
*ROIC[counter+4] = ADC12MEM3;
ADC12CTL0 &=~ADC12SC; // For sequence-of-Channels mode, ADC12SC must be cleared by software after each sequence to trigger another sequence
__bic_SR_register_on_exit(GIE); // Exit CPU, clear interrupts
break;
default: break;
}
}