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