Timer 当ADC通道0上施加的任何电压大于3VDC时,PIC 18F4520自动复位并保持复位

Timer 当ADC通道0上施加的任何电压大于3VDC时,PIC 18F4520自动复位并保持复位,timer,reset,pic,adc,Timer,Reset,Pic,Adc,我在做一个爱好项目,遇到了一个问题。我用MPLABX和XC8编译器对pic进行编码。 我使用3个模拟输入。它们是AN0、AN1和AN2。定时器0中断也用于代码中。 当我在AN1和AN2上施加5V电压时,不会影响PIC uC,但当AN0上的电压大于3V时,PIC会自行复位,并保持在复位状态,直到电压低于3V 还有其他人遇到过这样的问题吗 编辑 我禁用了定时器中断,并将代码写在下面。 当5V应用于AN0时,仍然会产生相同的问题 #include <stdio.h> #include &l

我在做一个爱好项目,遇到了一个问题。我用MPLABX和XC8编译器对pic进行编码。 我使用3个模拟输入。它们是AN0、AN1和AN2。定时器0中断也用于代码中。 当我在AN1和AN2上施加5V电压时,不会影响PIC uC,但当AN0上的电压大于3V时,PIC会自行复位,并保持在复位状态,直到电压低于3V

还有其他人遇到过这样的问题吗

编辑

我禁用了定时器中断,并将代码写在下面。 当5V应用于AN0时,仍然会产生相同的问题

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <p18f4520.h>
#include "my_header.h"

#define _XTAL_FREQ 20000000 // Fosc  frequency for _delay()  library

#define green_1 PORTCbits.RC1
#define green_2 PORTCbits.RC2
#define green_3 PORTCbits.RC3
#define green_4 PORTDbits.RD0
#define green_5 PORTDbits.RD1
#define green_6 PORTDbits.RD2
#define green_7 PORTDbits.RD3
#define green_8 PORTCbits.RC4
#define green_9 PORTCbits.RC5
#define green_10 PORTCbits.RC6

void main(){
    int kg=0;
    //setting the Oscillator Freq. to 125KHz for 8TAd to be 3.2 MicroSeconds
    OSCCONbits.IRCF0=0;
    OSCCONbits.IRCF1=0;        
    OSCCONbits.IRCF2=1;
   //ADC Module Settings
    ADCON1=0b00001100; 
    ADCON2=0b10010000;

    TRISAbits.RA6=0;
    TRISAbits.RA7=0;
    TRISCbits.RC0=0;
    TRISCbits.RC1=0;
    TRISCbits.RC2=0;
    TRISCbits.RC3=0;
    TRISCbits.RC4=0;
    TRISCbits.RC5=0;
    TRISCbits.RC6=0;
    TRISCbits.RC7=0;    
    TRISDbits.RD0=0;
    TRISDbits.RD1=0;
    TRISDbits.RD2=0;
    TRISDbits.RD3=0;
    TRISDbits.RD4=0;
    TRISDbits.RD5=0;
    TRISDbits.RD6=0;
while(1){
    ADCON0=0x00;
    ADCON0=0x03;
    while(GODONE);
    ADON=0;
    kg=ADRES;

    if (kg >200){
        green_1=1;
        green_2=0;
        green_3=1;
        green_4=0;
        green_5=0;
        green_6=1;
        green_7=1;
        green_8=0;
        green_9=1;
        green_10=1;

    }
    else {
        green_1=0;
        green_2=0;
        green_3=0;
        green_4=0;
        green_5=0;
        green_6=0;
        green_7=0;
        green_8=0;
        green_9=0;
        green_10=0;
    }


}
#包括
#包括
#包括
#包括
#包括“my_header.h”
#为_delay()库定义_XTAL_FREQ 20000000//Fosc频率
#定义绿色1端口cbits.RC1
#定义绿色2端口cbits.RC2
#定义绿色3端口cbits.RC3
#定义green_4 PORTDbits.RD0
#定义绿色_5 PORTDbits.RD1
#定义绿色_6 PORTDbits.RD2
#定义绿色_7 PORTDbits.RD3
#定义绿色8端口cbits.RC4
#定义绿色_9端口cbits.RC5
#定义绿色_10端口cbits.RC6
void main(){
整数公斤=0;
//将振荡器频率设置为125KHz,8TAd设置为3.2微秒
OSCCONbits.IRCF0=0;
OSCCONbits.IRCF1=0;
OSCCONbits.IRCF2=1;
//模数转换器模块设置
ADCON1=0b00001100;
ADCON2=0b10010000;
TRISAbits.RA6=0;
TRISAbits.RA7=0;
TRISCbits.RC0=0;
TRISCbits.RC1=0;
TRISCbits.RC2=0;
TRISCbits.RC3=0;
TRISCbits.RC4=0;
TRISCbits.RC5=0;
TRISCbits.RC6=0;
TRISCbits.RC7=0;
TRISDbits.RD0=0;
TRISDbits.RD1=0;
TRISDbits.RD2=0;
TRISDbits.RD3=0;
TRISDbits.RD4=0;
TRISDbits.RD5=0;
TRISDbits.RD6=0;
而(1){
ADCON0=0x00;
ADCON0=0x03;
while(GODONE);
ADON=0;
kg=肾上腺;
如果(千克>200){
绿色_1=1;
绿色_2=0;
绿色_3=1;
绿色_4=0;
绿色_5=0;
绿色_6=1;
绿色_7=1;
绿色_8=0;
绿色_9=1;
绿色_10=1;
}
否则{
绿色_1=0;
绿色_2=0;
绿色_3=0;
绿色_4=0;
绿色_5=0;
绿色_6=0;
绿色_7=0;
绿色_8=0;
绿色_9=0;
绿色_10=0;
}
}
}


谢谢大家的帮助。

看来您正在将OCCCON寄存器更改为使用125KHz的系统时钟,但告诉编译器您使用的是20MHz晶体振荡器

您尚未发布配置字设置,因此我们无法知道您的系统时钟设置实际上是什么

在任何情况下,我都会这样设置您的PIC18F4520:

/*
 * File:     main.c
 * Target:   PIC18F4520
 * Compiler: XC8 v1.45
 * IDE:      MPLAB v8.92
 *
 *                            PIC18F4520
 *                  +------------:_:------------+
 *        VPP ->  1 : RE3/MCLR/VPP      PGD/RB7 : 40 <> PGD
 *  AIN(0-5V) ->  2 : RA0/AN0           PGC/RB6 : 39 <> PGC
 *            <>  3 : RA1               PGM/RB5 : 38 <>
 *            <>  4 : RA2                   RB4 : 37 <>
 *            <>  5 : RA3                   RB3 : 36 <>
 *            <>  6 : RA4                   RB2 : 35 <>
 *            <>  7 : RA5                   RB1 : 34 <>
 *            <>  8 : RE0                   RB0 : 33 <>
 *            <>  9 : RE1                   VDD : 32 <- PWR
 *            <> 10 : RE2                   VSS : 31 <- GND
 *        PWR -> 11 : VDD                   RD7 : 30 <>
 *        GND -> 12 : VSS                   RD6 : 29 <>
 * 20MHZ XTAL -> 13 : RA7/OSC1              RD5 : 28 <>
 * 20MHZ XTAL <- 14 : RA6/OSC2              RD4 : 27 <>
 *            <> 15 : RC0/SOSCO       RX/DT/RC7 : 26 <>
 *   GRN_LED1 <> 16 : RC1/SOSCI       TX/CK/RC6 : 25 <> GRN_LED10
 *   GRN_LED2 <> 17 : RC2/CCP1     SPI_MOSI/RC5 : 24 <> GRN_LED9
 *   GRN_LED3 <> 18 : RC3/SPI_CLK  SPI_MISO/RC4 : 23 <> GRN_LED8
 *   GRN_LED4 <> 19 : RD0                   RD3 : 22 <> GRN_LED7
 *   GRN_LED5 <> 20 : RD1                   RD2 : 21 <> GRN_LED6
 *                  +---------------------------:
 *                             DIP-40
 *
 */

#pragma config OSC      = HS
#pragma config FCMEN    = OFF
#pragma config IESO     = OFF
#pragma config BOREN    = OFF
#pragma config BORV     = 3
#pragma config PWRT     = OFF
#pragma config WDTPS    = 32768
#pragma config WDT      = OFF
#pragma config CCP2MX   = PORTC
#pragma config LPT1OSC  = ON
#pragma config MCLRE    = ON
#pragma config STVREN   = ON
#pragma config XINST    = OFF
#pragma config LVP      = OFF
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF
#pragma config CPD = OFF, CPB = OFF
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF
#pragma config WRTD = OFF, WRTB = OFF, WRTC = OFF
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF
#pragma config EBTRB = OFF

#include <xc.h>

/* Define the frequency we promise to set the clock at */
#define FSYS (20000000L)
#define FCYC (FSYS/4L)
#define _XTAL_FREQ FSYS
/*
 * Define the LED output bits
 */
#define green_1  LATCbits.LATC1
#define green_2  LATCbits.LATC2
#define green_3  LATCbits.LATC3
#define green_4  LATDbits.LATD0
#define green_5  LATDbits.LATD1
#define green_6  LATDbits.LATD2
#define green_7  LATDbits.LATD3
#define green_8  LATCbits.LATC4
#define green_9  LATCbits.LATC5
#define green_10 LATCbits.LATC6
/*
 * Main program
 */
void main(void)
{
    /* declare variable to receive ADC data */
    int kg;

    /* Disable all interrupt sources */
    INTCON = 0;
    PIE1   = 0;
    PIE2   = 0;

    /* Setup the ADC for input on AN0 only */
    ADCON0 = 0;             /* Disable ADC */
    ADCON1 = 0b00001110;    /* Set AN0(RA0) as the ADC input */
    ADCON2 = 0b10001101;    /* Set Right justified data, ACQT as 2 TAD, ADCS as FOSC/16 (20MHz system clock) */
    ADCON0bits.ADON = 1;    /* Enable ADC */

    /* Setup GPIO bits */
    TRISCbits.TRISC0=0;
    TRISCbits.TRISC1=0;
    TRISCbits.TRISC2=0;
    TRISCbits.TRISC3=0;
    TRISCbits.TRISC4=0;
    TRISCbits.TRISC5=0;
    TRISCbits.TRISC6=0;
    TRISCbits.TRISC7=0;
    TRISDbits.TRISD0=0;
    TRISDbits.TRISD1=0;
    TRISDbits.TRISD2=0;
    TRISDbits.TRISD3=0;
    TRISDbits.TRISD4=0;
    TRISDbits.TRISD5=0;
    TRISDbits.TRISD6=0;
    /*
     * Application loop
     */
    ADCON0bits.GO   = 1;    /* Start first ADC conversion */
    for(;;)
    {
        if(ADCON0bits.GO == 0)
        {
            /* Save value of ADC conversion */
            kg = ADRESL;
            kg |= (int)(ADRESH)<<8;

            /* Start next ADC conversion */
            ADCON0bits.GO   = 1;

            /* show results in the LEDs */
            if (kg >200){
                green_1=1;
                green_2=0;
                green_3=1;
                green_4=0;
                green_5=0;
                green_6=1;
                green_7=1;
                green_8=0;
                green_9=1;
                green_10=1;

            }
            else {
                green_1=0;
                green_2=0;
                green_3=0;
                green_4=0;
                green_5=0;
                green_6=0;
                green_7=0;
                green_8=0;
                green_9=0;
                green_10=0;
            }
        }
    }
}
/*
*文件:main.c
*目标:PIC18F4520
*编译器:XC8 v1.45
*IDE:mplabv8.92
*
*PIC18F4520
*                  +------------:_:------------+
*VPP->1:RE3/MCLR/VPP PGD/RB7:40 PGD
*AIN(0-5V)->2:RA0/AN0 PGC/RB6:39 PGC
*3:RA1 PGM/RB5:38
*4:RA2 RB4:37
*5:RA3 RB3:36
*6:RA4 RB2:35
*7:RA5 RB1:34
*8:RE0 RB0:33
*9:RE1 VDD:32 12:VSS RD6:29
*20MHZ XTAL->13:RA7/OSC1 RD5:28

*20MHZ XTAL更新!!我禁用了计时器0中断,运行了一个简单的代码,只是从AN0读取,并点亮了一些LED。它仍然会重置图片。更改了代码以从AN1获取示例。它仍然可以正常工作。实际上,您的回答对我帮助很大。我可以看到,每当我想从ADC模块获取样本时,首先我将通道设置为通道0(AN0),代码为ADCON0=0x00;ADCON0=0x03;while(GODONE);ADON=0;kg=肾上腺;在那之后,我立即把频道换成另一个。我更改了代码粒子,测量结果更好,没有产生任何问题。当从多个输入引脚选择模拟输入时,保持ADC启用会更有效。您建议的方法禁用ADC,选择通道,然后启用ADC并立即开始转换。当在ADC启用至少100微秒后请求转换时,启用ADC后的第一个读数更准确。启用ADC后切换通道需要的延迟要小得多,通常只有2到4个TAD时钟。