您好!
在看门狗计时器到期后、ADC 停止工作、这是一个难题。 代码的所有其他部分工作正常、但 ADC 读出0。 但在复位电源后、ADC 开始工作。 此外、如果看门狗计时器再次过期、则 ADC 开始工作。
这可能是什么原因?
谢谢
Nitish
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.
您好!
在看门狗计时器到期后、ADC 停止工作、这是一个难题。 代码的所有其他部分工作正常、但 ADC 读出0。 但在复位电源后、ADC 开始工作。 此外、如果看门狗计时器再次过期、则 ADC 开始工作。
这可能是什么原因?
谢谢
Nitish
您好!
我的意思是 ADC 只是停止、只读取缓冲寄存器中的0x00、通过 DMA 存储 ADC 结果。 在初始化 ADC 之前、我通过设置 ADC10SA = 0x00来解决这个问题。 因此、现在只要看门狗定时器到期、ADC10SA = 0就是在再次初始化 ADC 之前要执行的第一条语句(因为代码在看门狗到期后从开始重新启动)、并且它在魔术上开始工作。
此外、正确的做法是将 ADC10SA = 0作为默认值设置为0x0200、并且在初始化部分中、我将其指向其他存储器位置。 或者、我应该避免写入0x00、而只写入闪存结束的存储器地址?
谢谢
Nitish
这是我的代码的一部分。 如果 P1.0引脚被拖至3.3V 的高电平、那么它进入无限循环、并且看门狗定时器到期。 您将发现 ADC 停止工作。 但是、如果您从 ADC10SA = 0中删除注释、那么即使在看门狗过期后、ADC 也会继续工作。
#include /** * main.c */ static int ADCbuf[4]; /* ADC 读数数数数数组*/ 静态 int 值[4]; 静态 int i = 0; void MON_Init (void); void GET_ADC_Val (void); void main (void) { WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 /*初始化 MCU */ MON_Init (); _BIS_SR (GIE); /*启用中断(需要 ADC 操作)*/ WDTCTL =(WDTPW + WDTCNTCL + 1); for (;;) { get_adc_Val (); if (values[3]>=900) { while (1); } WDTCTL =(WDTPW + WDTCNTCL + 1); } }void MON_Init (void) { DCOCTL = CALDCO_12MHz; BCSCTL1 = CALBC1_12MHz; BCSCTL2 = 0x00; //ADC10SA = 0; ADC10CTL0 &=~ENC; ADC10AE0 |= 0x0F; ADC10CTL0 = SREF_0|ADC10SHT1|ADC10SR|MSC|ADC10ON; ADC10CTL1 = INCH_3|ADC10DIV_0|ADC10SSEL_3|CONSEQ_1; ADC10DTC0 = ADC10CT; ADC10DTC1 = 0x04; ADC10SA =(无符号) ADCbuf; ADC10CTL0 |= ENC + ADC10SC; while (ADC10CTL1和 ADC10BUSY) {;} } void GET_ADC_Val (void) { ADC10CTL0 |=(ENC + ADC10SC); while (ADC10CTL1和 ADC10BUSY) {;} for (i=0;i<4;i++) { values[i]= ADCbuf[i]; } }
您好、Nitish、
我对您的代码做了一些修改、您可以对其进行实验。
#include
/**
* main.c
*/
static int ADCbuf[4]; /* ADC 读数数数数数组*/
静态 int 值[4];
静态 int i = 0;
void MON_Init (void);
void GET_ADC_Val (void);
void main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
/*初始化 MCU */
MON_Init();
_BIS_SR (GIE); /*启用中断(需要 ADC 操作)*/
WDTCTL =(WDTPW + WDTCNTCL + 1);
for (;;)
{
GET_ADC_Val ();
// if (values[3]>=900)
// {
// while (1);
//}
WDTCTL =(WDTPW + WDTCNTCL + 1);
}
}
void MON_Init(void){
DCOCTL = CALDCO_12MHz;
BCSCTL1 = CALBC1_12MHz;
BCSCTL2 = 0x00;
//ADC10SA = 0;
ADC10AE0 |= 0x0F;
ADC10CTL0 = SREF_0|ADC10SHT1|ADC10SR|MSC|ADC10ON;
ADC10CTL1 = INCH_3|ADC10DIV_0|ADC10SSEL_3|CONSEQ_1;
ADC10DTC0 = ADC10CT;
ADC10DTC1 = 0x04;
while (ADC10CTL1和 ADC10BUSY)
{;}
}
void GET_ADC_Val (void)
{
ADC10CTL0 &=~ENC;
while (ADC10CTL1 & ADC10BUSY);
ADC10SA =(无符号) ADCbuf;
ADC10CTL0 |= ENC + ADC10SC;
for (i=0;i<4;i++)
{
values[i]= ADCbuf[i];
}
}
此致
Johnson