This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430G2955:使用中断并读取 ADC 值会导致__TI_ISR_TRAP 循环

Guru**** 2618835 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/670724/ccs-msp430g2955-using-interrupt-and-reading-adc-values-causing-__ti_isr_trap-loop

器件型号:MSP430G2955

工具/软件:Code Composer Studio

您好!

我正在尝试对按钮进行编程、以控制风扇并同时从某些传感器读取 ADC 值。 这些程序单独工作正常、但当与下面的代码组合在一起时、程序会卡在_TI_ISR_TRAP 中。 这发生在 ADC_temp 函数中、恰好在读取和存储 ADC 值之前。 禁用 ADC 功能并使用按钮和 LCD 初始化简单地运行代码、可以使程序正常工作(按钮工作、LCD 显示屏)、而不会卡在 ISR 陷阱中、这会导致我相信 ADC 存在问题。 当端口1被激活时、中断向量触发、因此我不理解 ADC 影响中断的原因。

#include 
#include "stdio.h"// h 文件包含 sprintf


//*
main.c
*/

void adc_init (void);
void uart_init (void);

void adc_temp (void);

void button_init (void);
void lcd_init (void);
void lcd_char (char);
void lcd_command (char);
void out_string (char*);
void status_loop (void);

int i = 0;

float temp;
float truetempF_avg;

char uf_lcd_temp;
char uf_lcd_temp2;
char uf_lcd_x;

volatile long truetempo C;
volatile long truetempF;



int main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
__no_operation();
button_init();
__no_operation();
lcd_init(); // LCD 初始化
adc_init(); // ADC 初始化

__no_operation();
while (1)
{


LCD_COMMAND (0x01);//清除 LCD
adc_temp(); //函数获取温度 ADC 值
status_loop(); //将传感器的状态发布到 LCD
_DELAY_CYCLES (50000);
}
返回0;
}

void adc_init (void)
{
ADC10CTL0 = SREF_0 + ADC10ON + ADC10IE;
}

void ADC_temp (void)
{
ADC10CTL0 &=~ENC;
ADC10CTL1 = INCH_6 + CONSEQ_0;
ADC10AE0 |= BIT6;
ADC10CTL0 |= ENC + ADC10SC;

//这是代码跳转到__TI_ISR_TRAP 的位置
while (ADC10CTL1 & BUSY);
温度= ADC10MEM;//存储 ADC


truetempC =((temp - 171)* 423)/1024;//公式从 ADC ->温度(C)百分比得出
truetempC=(int) truetempC;
trueempF =(((float) trueempC * 1.8)+ 32);//从 Celcius 到 Farenheit

的等式}

void button_init (void)
{
__no_operation();
//从高电平到低电平的中断
P1IES |=(BIT3 + BIT2 + BIT1 + BIT0);
//清除中断标志
P1IFG &=~(BIT3 + BIT2 + BIT1 + BIT0);
//在 BIT3上启用中断
P1IE |=(BIT3 + BIT2 + BIT1 + BIT0);

P1OUT = 0;
P3OUT |=(BIT1 + BIT2 +BIT3 +BIT4);
//将 bit0、bit6设置为输出
P3DIR |= BIT3;
P3DIR |= BIT2;
P3DIR |= BIT1;
P3DIR |= BIT0;

__no_operation();
//启用中断
_BIS_SR (GIE);

__no_operation();
}




void LCD_init (void)
{
LCD_COMMAND (0x33);
LCD_COMMAND (0x32);
LCD_COMMAND (0x2C);
LCD_COMMAND (0x0F);
LCD_COMMAND (0x01);
}

void LCD_COMMAND (char uf_LCD_x)
{
P4DIR = 0xFF;
uf_LCD_temp = uf_LCD_x;
P4OUT = 0x00;
__DELAY_CYCLES (10);
uf_LCD_x = 0x4f_LCD_10_uf



= 0x4uf (uf);uf_LCD_10_uf


= 0x4uf LCD_ryc_10_uf = 0x4uf (uf);uf LCD_10_uf = 0x4uf LCD_10_10_uf + uf + uf + uf + uf LCD_10_uf + uf + uf = 0x4uF (uf);uf LCD_10_lCD_uf + uf = 0x4uf = 0x


uf_lcd_x = uf_lcd_temp;
uf_lcd_x = uf_lcd_x 和0x0F;
uf_lcd_x = uf_lcd_x | 0x20;
P4OUT = uf_lcd_x;
__delay_cycles (10);
uf_lcd_lcd_x = uf_lcd_10









;uf_pruf
= 0x4uf = uf_lcd_10_lcd_lcd_uf = uf = uf = uf + uf + uf + uf + uf + uf + uf + uf + uf + uf + uf + uf + uf + uf lcd_lcd_lcd_cycles;uf = 0x4uf = 0x4uf = uf = 4
UF_LCD_x = uf_LCD_x 和0x0F;
uf_LCD_x = uf_LCD_x | 0x30;
P4OUT = uf_LCD_x;
__delay_cycles (10);
uf_LCD_x = uf_LCD_x 和0x1F;
P4OUT = uf_LCD_x
;
_ 4
个周期(10);_ 4个周期(10);_ 4个周期(10)
UF_LCD_x = uf_LCD_temp;
uf_LCD_x = uf_LCD_x 和0x0F;
uf_LCD_x = uf_LCD_x | 0x30;
P4OUT = uf_LCD_x;
__delay_cycles (10);
uf_LCD_x = uf_LCD_x = uf_x +




x = uf_x (10)*字符串+= uf_out (10);
*字符串+ 10)*字符串++字符串++++++字符串 out (10
int i = 0;
while (string[i]!= 0)
{
LCD_char (string[i++]);
}

}

void status_loop()
{

int j = 0;
_delay_cycles (10000);
字符数组[50]={'\0'};

sprintf (数组、"温度:%d F"、trueempF);
对于(j = 0;j 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matt、

    查看您的代码、您似乎在"ADC_init"例程中启用 ADC 中断、但您没有定义 ADC 中断服务例程(ISR)。 在您的情况下、您无需启用 ADC 中断。

    ADC10CTL0 = SREF_0 + ADC10ON + ADC10IE

    另请在 以下网址查看代码示例:http://www.ti.com/lit/zip/slac562 示例:msp430g2x55_ADC10_05.c

    它描述了不使用中断的 ADC 转换。

    此致、

    Andre

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Matt、

    您还有其他问题吗? 如果没有、请选择"已解决"、以便可以关闭此主题。
    非常感谢!

    此致、
    Andre
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Matt、

    我想您可以继续使用您的应用程序、因为您不再回复、所以我将关闭此帖子。
    如果您需要进一步的帮助、请随时再次进行评论、它将重新打开主题帖。

    此致、
    Andre