请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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